Build web apps the boring way.

A Claude Code skill plus reference templates. Side projects, indie products, internal tools, anything that runs as one Linux process. Go, SQLite, Litestream, Caddy, systemd, a $5 VPS.

$ borela cost --last 30d
hetzner cx22       $4.59
cloudflare r2      $0.12
borela.dev domain  $1.25
resend (free tier) $0.00
─────────────────────────
total              $5.96/mo

What this is

  1. The skill. Type /boring-stack in any Claude Code session and Claude loads opinionated defaults for that project. Pushes back on Postgres, Vercel, ORMs, Docker, and microservices when they don't fit the archetype. Two sentences plus a question per pushback. Always defers to your call.
  2. The templates. The exact deploy.sh, Caddyfile, app.service, and Litestream config the Borela cloud build runs on (Borela is pre-launch — the templates have been live-fired against the dogfood deploy). Drop them in, replace the hostnames, ship. Zero magic.
  3. The manifesto. Seven principles for shipping software that stays out of your way. Quote it, link it, fork it. Read the manifesto.

Install

One line. Works with every major AI coding tool.

$ curl -fsSL https://boringstack.org/install.sh | bash

That clones the repo to ~/.boring-stack and wires it into the tools that have a user-level config (Claude Code, Codex CLI). 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.

What gets written, per tool
ToolFile written
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
AiderCONVENTIONS.md (appended)
Gemini Code AssistGEMINI.md (appended)
Windsurf.windsurfrules
Zed.rules
Anything elseAGENTS.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.

What the skill argues for

Stay on the list

Get monthly notes from the build

About three emails per quarter — notes from the Borela build (install counts, what broke, what shipped, what I changed my mind about) and the heads-up when paid Borela ships, the babysitter for web apps running on the boring stack ($5/mo for backups, $9/mo for the full babysitter). The manifesto is on the site already; read it without signing up.

Why this exists

I'm building Borela. When it ships, Borela will be the babysitter for web apps running on the boring stack: it verifies your backups are actually restorable, drills the restore on a schedule, watches the agent heartbeat, and pages someone when the cron silently stops.

Pre-launch. No customers yet, no paid signups open, no public site. I'm publishing this skill before paid Borela ships, on purpose. If people install it and start running the boring stack on their side projects, some of those projects will grow up and need a babysitter. That's the bet.

This is not an original bet. Pieter Levels has been writing about this shape of stack for years. Steve Hanov runs $40k MRR across four products on a $20/month stack. DHH made a career out of refusing to add complexity that didn't earn its way in. I'm standing on shoulders.

What I want to add is the skill. Claude defaults to the modern hosted-everything pile (Next.js, Vercel, Supabase, fourteen npm packages) because that's what most of the training data looks like. The skill flips the default.

Install the skill and try it. If it argues with you in a way that doesn't fit your project, the archetype-fit table at the top of SKILL.md tells you when to ignore it.

Templates

The configs the skill ships with. Each one is the actual file running Borela in production, lightly edited to use placeholder hostnames.