Skip to main content
This walkthrough assumes you have Docker installed plus API keys for at least one TTS/STT provider (Deepgram or ElevenLabs) and optional LiveKit credentials.
Prefer a managed LiveKit instance? Point LIVEKIT_URL at the internal signaling address and LIVEKIT_PUBLIC_URL at the client-facing domain.
1

Clone and prep configuration

You can keep using .env, but for local development it’s often clearer to generate a config file and pass it to Sayna:
2

Start LiveKit + Redis

LiveKit needs Redis for state. Run both with Docker Compose:
Keep this stack running so Sayna can reach LiveKit on the internal network (ws://localhost:7880 or ws://livekit:7880 if you use the Docker Compose file).
3

Run Sayna locally

If you created config.yaml, run:
or simply cargo run when environment variables are already loaded (e.g., via .env).Prefer Docker? Add a Sayna service to the same Compose file so it shares the network with LiveKit:
Whether you use config files or env vars, make sure the Sayna container can resolve the LiveKit hostname (livekit) and expose port 3001 to your host machine.
4

Smoke test

Then connect a WebSocket client, send a config message, and queue a speak payload to hear a synthesized clip. Use /livekit/token to mint attendee tokens if you mirror audio into LiveKit.

Next steps

Review the architecture

Understand the moving parts before you customize providers or pipelines.

Call every REST endpoint

Learn what /voices, /speak, and /livekit/token expect.

Stream over WebSockets

Explore the message schemas for low-latency experiences.

Harden authentication

Pick between API secrets and delegated JWT validation.