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 claims the instance with a single-use setup token so you become its owner. 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.

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 settings

Domains

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 issued
home.example.netDDNS

Access control

Put a deployment behind a password or a Mangrove sign-in, and leave chosen paths open.

Leave open/api/webhooks

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 itself

Server health

Built and run day to day on a 2 vCPU, 2 GB box, alongside the apps it hosts.

Memory412 MB / 1.9 GB · 21%
Disk11.2 / 15.6 GB · 72%

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.comAdmin
sam@example.comEditor
client@example.comViewer

Backups 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.gz

Simple 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

BlogWrite and publish posts on your own site.
Running
Password managerStore and share passwords securely.
Starting up
Website monitorGet notified if one of your sites goes down.
Turned off

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