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
Install Mangrove on this server by following https://mangrove-site-evanxdsouz-efde27.apps.automiq.me/install.md. Ask me before anything that uses sudo, and never ask for my admin password.
● Read install.md ● Ubuntu 24.04 · 2 GB RAM · 31 GB free · port 7777 free ? Run sudo ./setup.sh? It installs Docker, Caddy, Go and Node. yes ● setup.sh: built mangrove, started mangrove.service ● curl localhost:7777/healthz → ok ● Done. Run sudo ./setup.sh in your own terminal to set your owner password.
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.
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.
a41f9c2Add order exportdeployed
Staging
A staging environment tracks its own branch. When it looks right, promote the exact commit it's running into production.
Pull request previews
Each pull request can get its own preview deployment, with one bot comment on the PR that updates itself and goes away when the PR closes.
Mangrove preview -- building...
This comment updates automatically once the deploy finishes.
History and rollback
A new version only takes traffic after it passes its health check. Ship a broken build to see the old one keep serving, or roll back to any earlier deploy.
Templates
Common self-hosted apps, ready to install without writing a Dockerfile.
Domains
Point a domain at a deployment and Caddy gets and renews its certificate. Behind a home router, the built-in DDNS updater keeps the record pointed at you.
home.example.netDDNS · updated 2 min agoLogs and commands
Stream a service's output live, and run a one-off command inside its container. The terminal UI adds a full interactive shell.
Access control
Put a deployment behind a password or a Mangrove sign-in, and leave chosen paths open, like a webhook.
/api/webhooks
Idle sleep
Quiet apps stop after a while and wake on the next visit, so a small box holds more of them.
Self-healing
With self-healing on, a service that fails three health checks in a row is restarted, and a failed deploy is retried a minute and then five minutes later.
Workspaces and roles
Workspaces group projects by team or client. Each person gets a role in each workspace, and everything they do is in the audit log. Pick a role for sam@example.com in acme:
- See projects, logs, history and domains
- Create projects and install templates
- Deploy, roll back, restart and scale
- Run a command inside a container
- Set secret variables
- Change access control and domains
- Delete projects and deployments
- Manage the workspace's members
Someone outside a workspace doesn't see it at all. Owners can do everything, everywhere.
Backups
Everything Mangrove knows lives in one SQLite file, with secrets encrypted under one key. A backup takes both together, from the box or from your laptop.
$ Storage
On a home server, turn a plugged-in drive into a NAS. A small separate helper does the mounting, so the control plane never needs mount rights.
Server health
How the box itself is doing. Built and run day to day on a 2 vCPU, 2 GB machine, alongside the apps it hosts.
Teal up to 70%, amber above, red above 90%. The numbers here are simulated.
Your apps
Simple mode swaps projects and build strategies for a plain list, in plain words. Same box, same apps.
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.