Ship

The infrastructure is part of the repo.

config/cloud.ts describes the server, DNS, certificates, storage, and mail records in TypeScript. buddy deploy provisions Hetzner or AWS, or adopts a box you already own over SSH, then ships every surface, so production is a file you review in a pull request.

What you get.

All of it in the same install, with nothing to wire together first.

One command

buddy deploy checks prerequisites, resolves the environment, builds the web, docs, blog, and API, then publishes the infrastructure.

DNS and TLS

Records and certificates are declared next to the site they belong to, so a new hostname is a config line rather than a console visit.

CDN and storage

Cloudflare in front of a Hetzner or SSH box, or CloudFront on AWS, with cache rules, buckets, and invalidation from the same config the application reads.

Mail records

SES identities plus the SPF, DKIM, and DMARC records that make them deliver, published with everything else.

Your own hardware

provider: ssh adopts a box you already run instead of provisioning one. buddy server:flash writes a Raspberry Pi OS or Ubuntu image to a disk, and on a LAN the box signs its own HTTPS certificate, which server:trust installs where your devices trust it.

Server or serverless

A long-running server by default; on AWS the same app can deploy serverless instead, chosen in config.

Many projects, one box

Several apps share a server behind one gateway, each with its own domains, certificates, and ports.

Rollback and backups

buddy deploy:rollback returns a site to its previous release, and db:backup, db:restore, storage:backup, and storage:restore cover the data.

Push to deploy

The shipped CI workflow runs buddy deploy on every green push to main, and finishes green with a notice when a repo has no deploy secrets yet.

From the command line.

Buddy scaffolds, runs, and ships this the same way it does the rest of the app.

buddy deploy buddy cloud --diff buddy domains:add example.com

These share the same models, config, and types, so using them together costs nothing extra.