Operations
Deployment
froots runs as a single Docker container on Bitroot's Dokploy instance. The Dockerfile at the repo root is the whole build — Dokploy auto-deploys from main.
The build is two-stage: stage one compiles this documentation site with Docusaurus, stage two copies the static output in alongside the app. One container serves the landing page, the docs, and every /mcp/* endpoint, so the docs can never drift from the deployment they describe.
Environment (set in Dokploy → froots → Environment):
FROOTS_TOKENS=token1,token2 # comma-separated bearer allowlist
GEMINI_API_KEY=... # Nano Banana + analysis
OPENAI_API_KEY=... # gpt-image (optional)
Issuing & revoking tokens
Tokens are plain strings in FROOTS_TOKENS. Convention: froots_<person>_<random>.
echo "froots_alice_$(openssl rand -hex 12)"
Add it to the env var, redeploy (seconds), share it. Revoke by removing it. One token per person/app — never share tokens between consumers, or you lose the ability to revoke selectively.
Adding a new server to the fleet
- Create
src/servers/<name>.mjsexportingbuild<Name>Server()— anMcpServerwith your tools (copybit-graphics.mjsas the template). - Register it in
src/index.mjs: add toREGISTRY. - Document it: create
docs/content/<name>/index.mdand add one entry to theSERVERSarray indocs/docusaurus.config.js. The sidebar autogenerates from the folder and the navbar link follows — no sidebar file to edit. - Push to
main— Dokploy redeploys, the endpoint is live at/mcp/<name>, and its docs are live at/<name>/docs.
Health
GET /health (no auth) returns { ok, servers } — wire it into uptime monitoring.