For one person the Heroku loop is small to describe: git push, a build, a container behind HTTPS, environment variables, logs and a Postgres. Dokku, CapRover and Coolify already do it on a $5 to $12 server, and an agent can write a lean version in a weekend. What the $7 buys is not the code but being off call: OS patching, disk space, certificate renewals, tested database restores and a platform that restarts things at 3am. A self-built platform moves all of that onto you, so it fits side projects better than anything people pay for.
Before you buildHeroku has no free compute any more. Coolify or Dokku give you the platform for free and cost only the server, so check them before building your own.
Build me a one-server app platform to replace Heroku for my side projects. Requirements: - Go 1.23: a daemon `shipd` running as a systemd service on one Ubuntu 24.04 VPS, and a CLI `ship` on my laptop that talks to it over SSH only. There is no web UI. - Deploy with `git push`: a bare repo per app in /srv/shipd/repos/<app>.git with a post-receive hook that calls shipd. Build with `docker build` when a Dockerfile exists, otherwise with `pack build --builder paketobuildpacks/builder-jammy-base`. Keep the last 5 images per app. - Processes: read the Procfile (web, worker); run one container per process on a Docker network using the Docker Engine SDK. Env vars live in /srv/shipd/apps/<app>/env (mode 0600), set with `ship config set KEY=VALUE`. A release starts the new web container, waits up to 30 seconds for HTTP 200 on its port, switches the route, then stops the old one. `ship rollback` re-runs the previous image. - Routing: Caddy through its admin API, automatic HTTPS for <app>.<ROOT_DOMAIN> from .env, and custom domains with `ship domains add <app> <host>`. - Database: `ship pg:create <app>` starts a postgres:17 container with a named volume and sets DATABASE_URL; a nightly `pg_dump` goes to /srv/shipd/backups (keep 14) and `ship pg:restore` loads a chosen dump into a scratch database for checking. - Day to day: `ship logs <app> --tail`, `ship ps`, `ship run <app> <command>` for a one-off container. - Storage: SQLite (modernc.org/sqlite) at /srv/shipd/shipd.db for apps, releases, domains, processes. - Single owner, SSH keys only. No accounts, no telemetry; outbound calls are image pulls and Let's Encrypt. - Out of scope: autoscaling, several servers, pipelines, review apps, an add-on marketplace, metrics. - README: provisioning the VPS (firewall open on 22, 80, 443), the wildcard DNS record, and a warning that patching, backups and a restore test are now my job.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Heroku.
Extend the app platform in this folder. Requirements: - Pushing a branch other than main to an app creates a review release at <branch>-<app>.<ROOT_DOMAIN> with its own container and an empty database cloned from the schema only. - `ship review list` shows branches with age; reviews older than 7 days are removed by a nightly job. - Review releases never receive production env vars: they read /srv/shipd/apps/<app>/env.review. - Update the README.
Add off-server backups to the app platform in this folder. Requirements: - After each nightly pg_dump, upload the file to an S3-compatible bucket from .env with `aws-sdk-go-v2`, encrypted with `age` using a public key from .env. - `ship backups list` shows local and remote copies; `ship backups verify <app>` downloads the newest, decrypts it and restores it into a scratch container. - Alert by email through SMTP from .env when a backup or a verification fails. - Update the README.
Add release hooks to the app platform in this folder. Requirements: - A `release` entry in the Procfile runs once in a one-off container with the new image before the web container starts; a non-zero exit cancels the release. - Per-app health check path and timeout in `ship config set` style settings. - Show release history with exit codes and durations in `ship releases <app>`. - Update the README.
People pay so that deploys, TLS, logs, restarts and database backups are someone else's job. At $7 a dyno and $5 for a small database, the bill is lower than one evening spent on a full disk or a failed upgrade.
Estimate · A small VPS runs several apps, against $12 a month per app on Heroku with a Basic dyno and a small Postgres. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Eco | $5 | — | 0.5 GB RAM, sleeps after 30 minutes of inactivity, 2 process types, personal accounts only. |
| Basic | $7 | — | 0.5 GB RAM, always on, 10 process types. |
| Standard-1X | $25 | — | 0.5 GB RAM, horizontal scaling, metrics and alerts. |
| Standard-2X | $50 | — | 1 GB RAM, the same features as Standard-1X with twice the compute. |
| Performance-M | $250 | — | 2.5 GB RAM, dedicated compute and autoscaling; larger Performance dynos run from $500 to $1,500. |
| Postgres Essential-0 | $5 | — | Shared database with 1 GB of disk and 20 connections. |
| Key-Value Mini | $3 | — | 25 MB, 20 connections. |
No free compute: the pricing page offers only free Basic Support.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Managed Postgres with backups, followers and failover handled for you, Not being on call for OS updates, disk space and restores.
About $7 a month on the Basic dyno plan, $84 a year (checked 2026-10-20).
Managed Postgres with backups, followers and failover handled for you; Not being on call for OS updates, disk space and restores; Scaling dynos, metrics and alerts from a dashboard; Review Apps, Pipelines and the add-on marketplace; Private Spaces and Shield for regulated workloads. If any of those matter to you, keep paying.
Yes: Dokku (open source), Coolify (open source), CapRover (open source).