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.

On a Debian or Ubuntu server, clone it git clone https://github.com/evanxdsouza/mangrove.git
Then run the installer cd mangrove && sudo ./setup.sh
It installs Docker and Caddy if they're missing, builds one Go binary, and creates your owner account. 2 GB of RAM is enough. Re-running it is safe.

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.

Repositoryacme/shop-api
Branchmain
CancelDeploy

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
Running
  1. Queuedtriggered by push
  2. BuildingDockerfile
  3. Health checkingGET /healthz
  4. Runningtraffic switched, old container stopped
STDOUTRECORDING
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
First deploy live. This is the start of something growing.

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.

shop-api

3 deployments
acme
productionshop.example.com
Running
stagingbranch next
Running
PR #42 previewadd-gift-cards
Building
+ Add a deployment

home

2 deployments, from templates
personal
blogblog.example.com
Running
uptimestatus.example.com
Running
+ Add a deployment

reports

1 deployment
acme
dashboardwakes on the next visit
Sleeping
+ Add a deployment

Example projects, as they appear on the dashboard's Projects page.

Try every part of it.

A working model of the dashboard. Pick a feature and use it: push a commit, roll back, break a health check, put an app to sleep. It runs in your browser, so nothing here touches a real server.

Push to deploy

Link a GitHub repo and every push to its branch redeploys it. Push a commit and watch it go out.

productionshop-api · main · a41f9c2
Running
  1. a41f9c2 Add order exportdeployed

A simulation of the dashboard with example data. Nothing is deployed.

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.

View on GitHub