Mino keeps your Docker containers running. It watches them, works out why one failed, restarts it within the limits you set, and shows you the whole thing as it happens. Or it stops and asks first. That part is your call.
You log in. Your teammates log in. Everyone sees the same fleet. Owners change things; operators watch and act on incidents but cannot touch the settings.
Mino lives on one page. When a container fails, it tells you what broke, why, and what it would do about it. Then it acts, or waits for your call.
When everything is healthy, it just says so.
Every incident it has handled, grouped by machine.
And how each container has held up over time.
Mino is deliberately small to run. The minimum is one always-on instance and a database — it doesn't matter where you host it (a VPS, Docker Compose, Fly, Kamal, your own box).
- Run exactly one instance — don't scale it out. Mino is a single process and must not run
as multiple replicas or autoscale. Its monitor (the poll loop and the live incident state) is a
per-process singleton; a second replica would open duplicate incidents and, in auto-fix, restart
the same container twice (see #64).
Concretely: don't put it behind a load balancer with more than one replica, and keep the one
instance always on (don't scale to zero — the monitor must run continuously). Platform examples:
Docker Compose — a single
webcontainer, no--scale web=2; Fly —min_machines_running = 1andfly scale count 1; Kamal — one web host/role. - Modest resources. Around 512 MB RAM and one CPU is plenty — it watches and reacts, it doesn't crunch.
- A PostgreSQL database. Any Postgres works — bundled (Docker Compose ships one), managed, or
self-hosted; point
DATABASE_URLat it. There is nothing to run to set up the schema — Mino creates and evolves its own tables on startup. (Local dev can use a SQLiteDATABASE_URL.) - A handful of secrets, generated by
./scripts/gen-secrets.sh:AUTH_SECRET(Mino refuses to start on the built-in default),ENCRYPTION_KEY,INTERNAL_API_KEY, andCOOKIE_SECURE=truewhen served over HTTPS. - An LLM key is optional. Without one, Mino still monitors and restarts; it just skips the written diagnosis. Add a provider in Settings when you want it.
- The executor does not run here. Mino restarts containers on a watched host by installing the agent there — the Mino box itself needs no Docker socket.
Pick a deployment path from the Documentation section below.
The docs follow Diátaxis. Pick the door that matches what you need right now.
Learning. New to Mino? Start here.
Doing. You have a goal and want the steps.
- Deploy with Docker Compose
- Deploy with fly.io
- Deploy with Kamal
- Install the agent on a host
- Choose an LLM provider
- Manage your team
- Add an executor type
- Sign off before pushing
Looking up. You need a fact.
Understanding. You want to know why.
The how-to guides are written as plain, ordered steps, so a coding agent (Claude Code, Cursor, and the like) can follow them as well as you can. Point it at the guide you want and let it drive — for example:
Read
docs/how-to/deploy-with-docker-compose.mdand deploy Mino by following the steps. Check theRequirementssection in the README first, and ask me before anything destructive or anything that spends money.
Swap in deploy-with-fly.md or deploy-with-kamal.md for a different target. Whatever it does, it
should stand up a single always-on instance — see Requirements.
Run it on your machine in two terminals. No Docker needed.
# backend
python3.13 -m venv .venv && source .venv/bin/activate
pip install -r backend/requirements.txt
AUTH_SECRET=dev-secret ENCRYPTION_KEY=dev-key DATABASE_URL="sqlite:///./oncall.db" \
uvicorn app.main:app --app-dir backend --host 127.0.0.1 --port 8000
# frontend (new terminal)
cd frontend && npm install && npm run devOpen http://localhost:5173 and create the owner account. The full walkthrough is in the tutorial.
MIT — see LICENSE.



