Your own PaaS, on a box you own.
Mangrove is a small, self-hosted platform. Point it at a Git repo, a Dockerfile, a compose file or an image, and it builds it, runs it, health-checks it and serves it over HTTPS, with blue/green deploys and automatic rollback.
git clone https://github.com/evanxdsouza/mangrove.git
cd mangrove && sudo ./setup.sh
Plant whatever you already have.
A new instance starts empty. Add a deployment from a GitHub repo, a Dockerfile, a docker-compose file or a pre-built image, or install a self-hosted app from a template and never write a Dockerfile at all.
New deployment
Link a repo and every push redeploys it. Staging environments track their own branch and promote the exact commit they're running; pull requests can each get a preview, with a bot comment linking to it.
Builds the Dockerfile in your repo. No Dockerfile? Nixpacks, if it's installed, works out how to build the repo for you.
Runs every service in a docker-compose file together, as one deployment.
Skips the build and runs an image you've already pushed to a registry.
Common self-hosted apps, ready to install. Templates that need a database install one alongside themselves.
Also WordPress, Supabase, PocketBase, NocoDB, n8n and Umami, plus Postgres, MySQL, MongoDB and Redis on their own.
Then watch the tide come in.
Each deploy builds a new container beside the old one. It only takes traffic once it passes its health check. If it never does, the old one keeps serving and nothing changes for your visitors.
Every deploy stays in the history, one click from a rollback.
production
shop-api · main · a41f9c2- Queuedtriggered by push
- BuildingDockerfile
- Health checkingGET /healthz
- Runningtraffic switched, old container stopped
12:02:01 queued: push to main (a41f9c2) 12:02:02 cloning acme/shop-api 12:02:04 building image from Dockerfile 12:02:39 image built in 35s 12:02:40 starting the new container 12:02:41 listening on :3000 12:02:43 GET /healthz 200 3ms 12:02:43 routing traffic to the new container 12:02:44 previous container stopped
A few weeks later, the box is full.
Projects group the deployments that belong together, each hanging off its project's root line. A project wears the tide of its worst deployment, so a build in progress or a failure never hides inside a group.
home
2 deployments, from templatesreports
1 deploymentExample projects, as they appear on the dashboard's Projects page.
The parts you'd otherwise script yourself.
On a deployment's page or in the admin area, each of these is a switch or a field, not a config file to keep in your head.
production
shop-api · deployment settingsDomains
Point a domain at a deployment and Caddy gets and renews its certificate. Behind a home router with no static IP, the built-in DDNS updater keeps the record pointed at you.
shop.example.comCertificate issuedhome.example.netDDNSAccess control
Put a deployment behind a password or a Mangrove sign-in, and leave chosen paths open.
Self-healing
Restarts a service after three failed health checks in a row, and retries a failed deploy twice, a minute and then five minutes later.
Idle sleep
Quiet apps stop after a while and wake on the next visit, behind a short "waking up" page, so a small box holds more of them.
Admin
the box itselfServer health
Built and run day to day on a 2 vCPU, 2 GB box, alongside the apps it hosts.
Members
Workspaces group projects by team or client. Each person gets admin, editor or viewer in each one, and everything they do lands in the audit log.
ana@example.comAdminsam@example.comEditorclient@example.comViewerBackups and storage
One command captures the database and its encryption key together. On a home server, a plugged-in drive can be shared over SMB through a separate helper, so the control plane never needs mount rights.
$ mangrovectl backup --out mangrove.tar.gzSimple enough to hand to someone else.
Simple mode swaps projects and build strategies for a plain list of apps, with words like "Starting up" instead of status codes. Same box, same apps, one switch.
Your apps
ghost · production
Put down roots.
Clone it, run the installer, and your first deploy can be live in a few minutes. Then drive it from the dashboard, mangrovectl, a terminal UI with a live shell, the HTTP API, or an AI agent over MCP.