Choose a backend
Waterline supports two authentication and database backends, controlled by theBACKEND variable.
- Postgres (recommended for self-hosting)
- Supabase
BACKEND=postgres is the fully self-contained option. Waterline handles its own authentication using JWTs and stores all data in a Postgres instance you control. The Docker Compose file provisions a Postgres container automatically.JWT_SECRET with:Set production URLs
In production you must set the correct public-facing URLs so that OAuth callbacks and API requests resolve correctly.ENVIRONMENT=production enables Sentry error reporting (if SENTRY_DSN is set) and tightens CORS policy. Do not run a production instance with ENVIRONMENT=development.
Full production configuration example
Redis
Redis is required. It stores ticket progress cache, symbol search cache, and background job queues. The Docker Compose file provides a Redis container automatically — no configuration changes are needed for local development. In production, setREDIS_URL to point at your Redis instance:
ChromaDB
Waterline uses ChromaDB as its vector store for symbol and file embeddings. There are two deployment options:- Local (default)
- Chroma Cloud
By default, ChromaDB runs embedded inside the API container and persists data to a local directory. This requires no extra configuration and works well for a single-instance deployment.The Docker Compose file already mounts
./chroma to /app/chroma in the container. For production, make sure this path maps to a persistent volume so your vector index survives container restarts.Repo size limits
Waterline caps how much of each repository it indexes to prevent unexpectedly large LLM bills when a user connects a large monorepo.Pre-launch security checklist
Before making your instance publicly accessible:-
JWT_SECRETis at least 32 characters and was generated randomly (not manually typed) -
ENVIRONMENT=productionis set - All OAuth redirect URIs use
https:// - The GitHub webhook endpoint (
GITHUB_WEBHOOK_PATH) is publicly reachable so GitHub can POST push events to it - Postgres and Redis are not exposed to the public internet — use internal Docker networking or a private VPC
-
SUPABASE_SERVICE_ROLE_KEY(if using Supabase backend) is not present in any frontend environment or public config -
SENTRY_DSNis set if you want error tracking in production