Skip to main content
From empty terminal to your first live call, in five steps. Complete the prerequisites first.

1. Clone

2. Start

make application-up (which wraps ./scripts/start-application-services.sh) must run from the repository root. It:
  1. Creates .env from .env.example if missing.
  2. Generates SECRET_KEY and INTERNAL_API_KEY if either is blank.
  3. Generates PROVIDER_AUTH_ENCRYPTION_KEY (a Fernet key) if blank.
  4. Prints the URLs it is about to expose, and asks to confirm.
  5. Runs docker compose -f docker-compose.yaml up --build -d.
Existing values are never overwritten — rerunning is safe.
Do not start with a bare docker compose up on a fresh checkout. Three services declare ${SECRET_KEY:?...}, so Compose aborts without it. make application-up exists to generate these secrets.
The first build pulls images and compiles dependencies — expect several minutes. Subsequent starts are fast. To skip the prompt, pipe from a non-interactive shell, or pass extra Compose arguments after --:

3. What came up

Ten containers: minio-init exiting with code 0 is correct — it creates the bucket and stops.

4. Verify

A healthy API returns {"status": "ok", "database": "up"} — nothing to run here, just what to expect in the response body.
/health returns HTTP 200 even when the database is down — check the body, not the status code. See Daily operations for every endpoint and response shape.
If both commands returned a body containing "status": "ok" (API) and a 200 (runtime), the stack is healthy — you’re clear to continue. If either hangs or refuses the connection, see Common issues before going further. Open the dashboard at http://localhost:3000, or drive the API directly from the interactive console at http://localhost:8000/docs.

5. Create the first user

There is no seeded account. Signup creates a user, an organisation, and makes you its super_admin: Edit the email, password, name, and org below, then run it — jq pulls the access_token straight into $TOKEN, no copy-paste. If signup fails (duplicate email, weak password, …), $TOKEN stays empty instead of silently becoming the literal string null, and the real error prints:
Verify it worked:
An empty line means signup failed — check the error printed above. Otherwise, confirm the token is valid:
Tokens expire after 30 minutes by default.

Logs

Logs rotate at 10 MB with three files kept per container.

Stop and reset

That is docker compose down — containers stop, data survives.
make application-down ARGS="-- -v" (or docker compose down -v) also deletes the volumes: your database, recordings, RAG vectors, and queue. There is no undo. Back up first — see Daily operations.

Running the API on your host instead

Useful for development with hot reload:
Then, in apps/api:
Point .env at the published database port — MONGODB_HOST=localhost, MONGODB_PORT=27018. See Local setup.

Troubleshooting

Next