Berth

You're looking at a Berth app

This site is served from a Mac mini in my closet, through a Cloudflare tunnel. Its docs are the README, and a push to the repo redeploys them.

Open source self hosting for vibe coded apps

Your agent built it. Berth gives it a home.

Claude Code, Codex and Cursor can build a working app in an afternoon. Berth runs every one of them on a Mac mini in your closet, each at its own https://myapp.yourdomain.com, with a real database, sign-in and backups. Push to GitHub and it's live in seconds. There's no monthly bill per app, so the twentieth weekend project costs the same as the first.

A Mac mini with a Berth sticker on the front

Made for working with a coding agent

Most hosting assumes a person typed every line. Berth assumes your agent did, and gives it somewhere safe to try things.

  1. berth new habits A starter app, a private GitHub repo, the first deploy, and an AGENTS.md that teaches your agent how Berth works, with your app's real URLs in it.
  2. Ask your agent for what you want. It tries each change on habits-dev with berth dev:push, live in about five seconds, then checks the page, reads the logs and fixes its own mistakes. On its own copy of the data.
  3. Look at it, then git push. Production only changes when you push. AGENTS.md tells the agent to ask you before it pushes to main, rolls back or changes production config.
berth new habits         # starter app, repo, deploy
cd habits && claude      # or codex, cursor…

> add a daily streak and a chart
  of the last 30 days

# the agent edits, then:
berth dev:push --json    # live on habits-dev
berth logs habits-dev    # sees an error, fixes it
berth dev:push --json    # exit code 0: it works

# you take a look, then:
git push                 # live on habits.example.com

Setting up the Mac: three commands

No ports opened on your router, no certificates, no YAML, no Docker Desktop, and no sudo once it's set up.

  1. Install it on the Mac. Homebrew brings Apple's container runtime, Caddy and cloudflared along with it.
  2. Run berth init once. It connects your Cloudflare domain and GitHub in the browser. About three minutes.
  3. Create an app. Berth adds a webhook to the repo, so every push to main after that deploys itself.
brew tap dps/berth https://github.com/dps/berth
brew trust dps/berth
brew install berth

berth init --domain example.com       # once
berth create myapp --repo you/myapp  # once per app
git push                             # every deploy after that

What an agent-built app needs, done once

An agent can write the app. It shouldn't have to write the hosting too: the OAuth flow, the backup script, the API key handling. Those are where vibe coded apps usually go wrong, so Berth does them.

How it works

A Mac mini is a great home for small apps. It's quiet, it sips power, and an M4 with 16 GB runs twenty-odd apps and a couple of databases comfortably.

git

You push

GitHub tells Berth over a webhook. Public repos work without one; Berth polls them.

build

The Mac builds it

From your Dockerfile, or one Berth writes for Node, Bun, Python, Go, Rust or a static site.

VM

Each app gets a VM

Apple's container runs every app in its own lightweight Linux VM, with its own memory limit.

https

Cloudflare brings visitors in

A tunnel connects out from the Mac, so nothing at home is open to the internet. HTTPS just works.

More about how it works →

What it isn't

It's one Mac. There's no failover, and if the power goes out while you're on holiday, your apps are down until it comes back.

That's the right trade for vibe coded apps, side projects, internal tools, family apps and prototypes. It's the wrong one for anything where an hour of downtime costs real money.