One command
buddy deploy checks prerequisites, resolves the environment, builds the web, docs, blog, and API, then publishes the infrastructure.
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.
All of it in the same install, with nothing to wire together first.
buddy deploy checks prerequisites, resolves the environment, builds the web, docs, blog, and API, then publishes the infrastructure.
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.
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.
SES identities plus the SPF, DKIM, and DMARC records that make them deliver, published with everything else.
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.
A long-running server by default; on AWS the same app can deploy serverless instead, chosen in config.
Several apps share a server behind one gateway, each with its own domains, certificates, and ports.
buddy deploy:rollback returns a site to its previous release, and db:backup, db:restore, storage:backup, and storage:restore cover the data.
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.
Buddy scaffolds, runs, and ships this the same way it does the rest of the app.
These share the same models, config, and types, so using them together costs nothing extra.