Summary
Add a docker-compose.yml + Dockerfile so users can run Boop as a persistent
background service instead of keeping a terminal open with npm run dev.
Motivation
The current npm run dev workflow is great for first-run and development but doesn't
work well for always-on use. If you close your terminal or reboot, the agent goes
offline. A Docker Compose setup lets users run Boop like a proper background service —
survives reboots, restarts on crash, and has clean log management.
Proposed solution
Add the following files to the repo root:
Dockerfile — builds the server (server/index.ts via tsx)
Dockerfile.debug — builds and serves the Vite debug dashboard
docker-compose.yml — orchestrates both services with restart: unless-stopped
DOCKER.md — setup guide
Services in the compose file
| Service |
What it does |
server |
Express backend + agent loop, port 3456 |
debug |
Vite debug dashboard, port 5173 |
tunnel |
Cloudflare Tunnel sidecar — stable public URL for Sendblue webhook (opt-in via --profile tunnel) |
Key design decisions
Claude Code credentials — the container mounts ~/.claude read-only from the host
so the Agent SDK can reuse the existing session. No ANTHROPIC_API_KEY required.
Convex is not containerized — it's a hosted cloud service. Users just need to have
run npx convex deploy once; no local Convex process is needed at runtime.
Cloudflare Tunnel instead of ngrok — free ngrok rotates URLs on restart which breaks
the Sendblue webhook. The tunnel service offers a stable URL as an opt-in
--profile tunnel sidecar. Users on a VPS can skip it and just set PUBLIC_URL directly.
npm run dev is untouched — purely additive. Existing dev workflow stays exactly as is.
Basic usage after merging
# one-time: sign in to Claude Code on the host, deploy Convex
claude
npx convex deploy
# run permanently in background
docker compose up -d
# with Cloudflare Tunnel for stable Sendblue webhook
docker compose --profile tunnel up -d
# update after git pull
docker compose up -d --build
What this is NOT
- Not a production hardening PR — no secrets manager, no multi-arch builds, no k8s manifests
- Not changing any server code — pure infra files
- Not breaking any existing workflow
Checklist before opening a PR
Summary
Add a
docker-compose.yml+Dockerfileso users can run Boop as a persistentbackground service instead of keeping a terminal open with
npm run dev.Motivation
The current
npm run devworkflow is great for first-run and development but doesn'twork well for always-on use. If you close your terminal or reboot, the agent goes
offline. A Docker Compose setup lets users run Boop like a proper background service —
survives reboots, restarts on crash, and has clean log management.
Proposed solution
Add the following files to the repo root:
Dockerfile— builds the server (server/index.tsviatsx)Dockerfile.debug— builds and serves the Vite debug dashboarddocker-compose.yml— orchestrates both services withrestart: unless-stoppedDOCKER.md— setup guideServices in the compose file
server3456debug5173tunnel--profile tunnel)Key design decisions
Claude Code credentials — the container mounts
~/.clauderead-only from the hostso the Agent SDK can reuse the existing session. No
ANTHROPIC_API_KEYrequired.Convex is not containerized — it's a hosted cloud service. Users just need to have
run
npx convex deployonce; no local Convex process is needed at runtime.Cloudflare Tunnel instead of ngrok — free ngrok rotates URLs on restart which breaks
the Sendblue webhook. The tunnel service offers a stable URL as an opt-in
--profile tunnelsidecar. Users on a VPS can skip it and just setPUBLIC_URLdirectly.npm run devis untouched — purely additive. Existing dev workflow stays exactly as is.Basic usage after merging
What this is NOT
Checklist before opening a PR
Dockerfilebuilds clean from repo rootdocker compose up -dstarts server + dashboard successfully~/.claudemount is documented clearly (common gotcha)DOCKER.mdcovers the Cloudflare Tunnel setup stepsCHANGELOG.mdupdated under Unreleased (non-breaking addition).env.localalready filled in