Skip to main content
This page shows how VoicEra is structured, who talks to it, and how the deployable pieces fit together. It is aimed at architects, operators, and developers meeting the platform for the first time.
VoicEra is described here using the C4 model: Level 1 shows the system as one box surrounded by its users and external systems; Level 2 zooms in to the deployable containers; Level 3 opens up the two services that carry the most logic.

Level 1 — System context

Level 2 — Containers

Every box below is a container in docker-compose.yaml, except Chroma — an embedded store on a volume mounted into api. The one-shot minio-init container is omitted; it creates the bucket and exits. Configuration and control go to the API; live audio goes to the runtime. A call reaches the runtime three ways — a caller dials in, the API dials out, or the dashboard opens a browser call — and all three converge on the same pipeline. Behind the API sit the workers and the stores. Nothing below is reachable from outside the Compose network:
apps/api is one Python package but three containersapi, arq-worker, and campaign-orchestrator all build from apps/api/Dockerfile and differ only in their command. See Workers and orchestrator.

Start-up order

depends_on in docker-compose.yaml enforces this chain: postgres, redis, and minio gate on healthchecks; the rest start as soon as their dependency starts.

Level 3 — Inside the API

Routers stay thin; the service layer owns the rules. Full route list in the REST API reference.

Level 3 — Inside the runtime

The pipeline is nine modules plus three subpackages rather than one function. See Voice pipeline.

Deployment topology

The reference docker-compose.yaml runs everything on one host. For production: See Production deployment and Public voice URLs.

What changed from the mono repo

VoicEra replaces the earlier voicera_mono_repository. If you know the old system: