Contributor compose files
Which compose overlays ship in the source tree — for local development, docs, and tests. Not a production install path.
4 min read
This page is for people hacking on the source tree. The base is compose.yml; the rest are overlays that add or replace services for development, docs, and tests. Operators running Tale do not start here — the CLI path is Quickstart, and a stack you write yourself is Run Compose yourself.
The base file is a build-from-source stack for local smoke-testing. Every overlay is opt-in via -f. A production instance is generated by tale deploy and never uses these files.
A worked compose-up
The base file builds every image from source and runs that frozen build. It exposes ports that must never be public (5432, 8003) and boots with insecure dev secret defaults, so it is for local smoke-testing, not a public instance:
docker compose up -dA developer hacking on platform and docs at the same time layers two overlays for live source and hot-reload:
docker compose -f compose.yml -f compose.dev.yml -f compose.docs.yml up -dThe leftmost file is the base; each subsequent file merges its keys on top. Conflicts (same service, same key) resolve last-file-wins. The merged graph is what Docker brings up.
The compose files
| File | Use case | Notable overrides |
|---|---|---|
compose.yml | Local-dev base (build from source) | The base — every service, healthchecks, restart policy |
compose.dev.yml | Local development with hot-reload | Bind-mounts host source for hot-reload; ships insecure dev secrets |
compose.docs.yml | Adds the docs site service | Brings up tale-docs and routes /docs through the proxy |
compose.web.yml | Adds the marketing site service | Brings up tale-web and routes / (root) through the proxy |
compose.test.yml | Runs the platform test suite against the stack | Replaces the platform image with the test-shaped variant |
compose.web.test.yml | Runs web tests | Like web.yml but the test-shaped variant |
compose.docs.test.yml | Runs docs tests | Like docs.yml but the test-shaped variant |
compose.test.mock.yml | Mock-backed integration tests | Swaps providers for mock implementations |
Services and their roles
The base graph brings up eleven containers:
tale-proxy— Caddy. TLS, reverse proxy, 301s.tale-platform— the web tier: a Vite + TanStack Router SPA plus the Bun server that serves it, branding, and the config SSE watch.tale-backend-api— the application backend in theapirole (TALE_ROLE=api). Every application door: the app API, auth, the SSE hint stream, and the machine doors.tale-backend-worker— the same image in theworkerrole. The job runner behind schedules and agent turns, and the in-process document ingestion, web crawling, RAG indexing, and document generation that used to be separate services.tale-db— operational Postgres (ParadeDB). Thetale_appapplication store, on port 5432.tale-knowledge-db— knowledge corpus Postgres (ParadeDB). Thetale_knowledgedatabase holding document chunks, embeddings, and crawled pages, on port 5433 so it never clashes withtale-dbon 5432. (Atale deployproduction stack folds this intotale-dbinstead — see Architecture overview.)tale-object-store— MinIO, the S3-compatible blob backend for uploads, attachments, and generated media (internal-only).tale-sandbox-llm-gateway— the LLM gateway for harness turns.tale-sandbox-egressandtale-sandbox— the sandbox plane. Run-code containers behind an egress proxy (open by default; lock down withSANDBOX_EGRESS_ALLOWLIST), also the headless-browser runtime the backend calls for web rendering and document generation.tale-bgutil-provider— a third-party sidecar supplying YouTube PO-tokens for video-link ingestion.
There is no separate Python service in the graph — the knowledge work (RAG, crawling, document generation) runs inside the backend worker now. Container architecture goes deeper on what owns what.
Overriding
Operator customisations belong in an extra overlay, not in edits to the shipped files. Create compose.local.yml with the overrides you need:
services:
platform:
environment:
- LOG_LEVEL=debugBring the stack up with the local overlay layered last:
docker compose -f compose.yml -f compose.local.yml up -dThis pattern keeps git pull clean — no merge conflicts on the shipped files. The same pattern works for any custom volume mount, custom port, or environment override.
Where this fits
The compose reference is the operator's grid for the source tree. For the inside of each container, the container architecture page covers responsibilities; for the variables the containers read at boot, the environment reference is the source of truth.