Overview
kimbap is a self-hosted Go application for deploying and managing docker-compose projects on a single host. Think of it as a lean, Go-native alternative to Coolify, Dokploy, or CapRover: point it at a fresh Linux server, and it can install Docker itself, run a web UI for creating and managing projects, front everything with an automatically-SSL'd Traefik reverse proxy, and expose an MCP server so Claude can manage the host directly.
What it does
- Project management. Create a project from a
docker-compose.yml(and optional.env), stored directly on the filesystem — not hidden in a database. Deploy, stop, restart, view live container status, and tail logs, all from the web UI, the REST API, or an MCP tool call. - User management. A small built-in login system — username/password
accounts with
admin/memberroles, cookie-based sessions, and per-user API keys for scripted or MCP access. No external identity provider required. - Docker lifecycle. kimbap detects whether Docker is installed and offers
to install or update it via Docker's official
get.docker.comscript — confirmation-gated, never silent. - Reverse proxy + SSL. kimbap provisions and manages a Traefik instance in front of everything, with automatic Let's Encrypt certificates. Projects register domains through kimbap's UI/API/MCP tools; kimbap wires up the Traefik routing for you.
- MCP server. A remote, API-key-authenticated MCP endpoint at
/mcplets Claude Code or claude.ai manage the host directly — create and deploy projects, check status, read logs, manage domains, and (with an admin key) install Docker or provision Traefik.
Architecture, in one paragraph
kimbap runs as a native binary + systemd service — never as a Docker container itself. This is deliberate: kimbap needs to be able to install Docker onto a host where Docker doesn't exist yet, and a containerized kimbap couldn't do that (it would need the very engine it's trying to install). Once Docker exists, kimbap manages a Traefik container in front of itself and every project it deploys. Traefik reaches kimbap's own UI through a file provider route (since kimbap isn't a container Traefik's Docker provider can discover), and reaches project containers through the Docker provider (label-based auto-discovery). See Domains & TLS for the full mechanism.
Where things live on disk
/var/lib/kimbap/
├── kimbap.db # sqlite: users, sessions, API keys, project registry, domains, audit log
├── projects/<slug>/
│ ├── docker-compose.yml # yours — kimbap never rewrites this
│ ├── docker-compose.kimbap-labels.yml # auto-generated Traefik routing (only when the project has domains)
│ └── .env
└── traefik/
├── docker-compose.yml # kimbap-managed Traefik service
├── traefik.yml # static config
├── acme.json # Let's Encrypt certificate storage
└── dynamic/kimbap-ui.yml # routes kimbap's own UI
Next steps
- Install kimbap on a host.
- Walk through the quick start to deploy your first project.
- Point Claude at it via the MCP guide.