give your AI coding agent better defaults
An open-source project generator, AI coding skill, battle-tested templates, and a weekly field note for builders who want their software to stay legible. Go, SQLite, Litestream, Caddy, systemd, a $5 VPS.
$ boringstack cost --last 30d hetzner cx22 $4.59 cloudflare r2 $0.12 boringstack.org dns $1.25 resend (free tier) $0.00 ──────────────────────────── total $5.96/mo
Boring Stack is for builders who would rather ship a small, understandable system than rent a distributed platform before the product earns it. The movement is the public practice: publish the defaults, publish the costs, publish the failures, and make the simple path easier to choose next time.
The newsletter keeps those defaults honest by showing how they hold up in real products built by people running the stack.
boringstack new myapp and get a working, tested Go app with the stack decisions and deploy files checked in. Run boringstack dev to see it and boringstack deploy when the VPS is ready.deploy.sh, Caddyfile, app.service, and Litestream config used in real production. Drop them in, replace the hostnames, ship. Zero magic.Give your AI coding agent better defaults. One line, works with every major AI coding tool.
$ curl -fsSL https://boringstack.org/install.sh | bash
That clones the repo to ~/.boring-stack, builds the CLI into ~/.local/bin when Go 1.22+ is available, and wires the skill into tools that have a user-level config. Then make the idea concrete:
$ boringstack new expense-tracker Created expense-tracker (19 files). → go test ./... ok → go build . ok $ cd expense-tracker && boringstack dev → running http://localhost:8080
Or tell your coding agent: Build me an expense-tracking SaaS using Boring Stack. The agent starts from the same scaffold and adds a complete feature slice instead of another abstract stack recommendation.
For tools that only support per-project rules, run this from inside any project where you want the boring stack defaults:
$ curl -fsSL https://boringstack.org/add.sh | bash
Auto-detects your project's existing AI tool configs and drops the right file in each. Falls back to AGENTS.md (the portable convention) if nothing's set up yet.
| Tool | File written |
|---|---|
| Boring Stack CLI | ~/.local/bin/boringstack |
| Claude Code | ~/.claude/skills/boring-stack/SKILL.md (user) or .claude/skills/boring-stack/SKILL.md (project) |
| Codex CLI (OpenAI) | ~/.codex/instructions.md (appended) |
| Cursor | .cursor/rules/boring-stack.mdc |
| GitHub Copilot | .github/copilot-instructions.md (appended) |
| Cline | .clinerules |
| Continue.dev | .continuerules |
| Aider | CONVENTIONS.md (appended) |
| Gemini Code Assist | GEMINI.md (appended) |
| Windsurf | .windsurfrules |
| Zed | .rules |
| Anything else | AGENTS.md (portable fallback) |
Force a specific tool: … | bash -s -- --tool cursor. Update later by re-running either install command — both are idempotent.
tip: the skill is MIT and stays MIT. Use it, fork it, ignore it, write a better one.
pgloader + a connection string.
.sql files. No runtime layer. Read your own queries.
Restart=on-failure is one line. journalctl is your log aggregator.
<script> tag (htmx from a pinned CDN, swap to self-hosted any time), no build step, no node_modules. Companion JS (Alpine, Stimulus, vanilla) picked by interactivity need. Full SPA toolchain stays in scope when the product genuinely needs one (Figma/Linear class); backend stays boring.
The configs the skill ships with. Each one is derived from real production use, lightly edited to use placeholder hostnames.