Compose Stack Builder
Build a Docker Compose file from a catalog of self-hosted apps, with shared databases, reverse-proxy settings, port checks, and environment templates.
The 26-app catalog includes Jellyfin, Plex Media Server, Sonarr, Radarr, Prowlarr, qBittorrent, Nextcloud, Immich (server), Paperless-ngx, Vaultwarden, Gitea, Home Assistant, Pi-hole, AdGuard Home, Uptime Kuma, Grafana, Prometheus, Portainer CE, Dockge, Vikunja, WG-Easy (WireGuard), File Browser, Syncthing, Homepage (dashboard), n8n, MinIO. Choose the services you need below, then review each app's deployment notes.
docker compose up. Generated entirely in your browser.
Catalog
Generated stack
How the merge works & honest caveats
- Shared databases are deduplicated. If two or more selected apps declare
needs: postgres(or redis/mariadb), exactly one instance is emitted and every dependent app gets adepends_onwith aservice_healthycondition. The app keeps its own logical DB name but reuses the one server. - Host ports are de-collided. Each catalog port has a documented default. When two apps want the same host port (or one collides with a shared service), the second is bumped to the next free port and flagged. Container ports never change.
- Reverse proxy is wired both ways. Pick Traefik and web apps lose their published host port, join a shared
proxynetwork, and get router/service labels. Pick Caddy and you also get a Caddyfile. Pick none and host ports are published as-is. - Secrets are externalised. Every value flagged
secretbecomes a${VAR}reference in the compose file and a placeholder line in.env. Nothing real is generated — you must replace everyCHANGE_ME_*.
This is a scaffold generator, not a turnkey deployment. It deliberately omits workload-specific
wiring some apps need in production (Immich's ML container and VectorChord Postgres image, Home Assistant's host
networking for discovery, hardware /dev/dri passthrough for transcoding). Those are called out per
app and left for you to add, because guessing them would produce a file that looks complete but isn't. Image
tags reflect a current stable major at model version 1.1; registries move tags, so
docker compose pull and review before relying on it. Generated YAML is validated structurally in
your browser, not by a real Compose parser — always run docker compose config.
Catalog & image data live in src/data/compose-catalog.json. Decision-support only.