Run your own Tyto
Production setup with Docker Compose and the prebuilt images. Pick your shape: the API server alone, the web client alone, or both bundled on one host.
- Prerequisites
A server with Docker + Docker Compose (Linux recommended), a DNS record for the API domain (e.g. chat.example.com) pointing at it, ports 80/443 open. HTTPS is automatic via the built-in Caddy. Voice channels additionally need 7881/tcp + 50000–50100/udp open on this host; if you can't open them, set VOICE_ENABLED=false for a text-only server.
- Get the stack
mkdir tyto-core && cd tyto-core curl -LO https://raw.githubusercontent.com/tyto-chat/core/master/compose.yaml - Configure
Create .env — three values, for an API at chat.example.com and a web client at app.example.com:
TYTO_VERSION=1.0.0-beta1 SERVER_DOMAIN=chat.example.com CORS_ALLOW_ORIGIN=https://app.example.comTYTO_VERSION pins the release you run — it picks the tag of the prebuilt ghcr.io/tyto-chat/tyto-core image that Docker pulls (the value above is the current release). Pinning keeps deploys reproducible and makes upgrades deliberate: bump the value and run docker compose up -d again. If you leave it unset, Compose falls back to latest, which silently jumps versions on every pull — pin it in production.
That's the whole configuration: every secret (database, search, voice, app keys) is auto-generated on first start, public URLs derive from SERVER_DOMAIN, HTTPS is automatic, and mail is configured later in the admin panel. All other variables — managed databases, external LiveKit and more — are documented in .env.prod.example.
- Start it and create the admin
docker compose up -d docker compose exec app php bin/console tyto:user:create --adminFirst start pulls the images, runs migrations and generates keys; the command prompts for the admin email and password. Then add a web client: the Client tab for a separate host, or the Bundle tab to serve it from this same stack.
- Prerequisites
A running Tyto core (see the Core tab), a server with Docker + Docker Compose, a DNS record for the app domain (e.g. app.example.com) pointing at it, ports 80/443 open. HTTPS is automatic.
- Get the stack
mkdir tyto-client && cd tyto-client curl -LO https://raw.githubusercontent.com/tyto-chat/client/master/compose.yaml - Configure
Create .env — three values (all described in .env.prod.example):
TYTO_VERSION=1.0.0-beta1 SERVER_DOMAIN=app.example.com API_DOMAIN=chat.example.comTYTO_VERSION pins the ghcr.io/tyto-chat/tyto-client image tag — keep it on the same release as the backend. API_DOMAIN points the app at your core API (the backend's SERVER_DOMAIN).
- Start it and open it
docker compose up -dVisit your app domain, sign in as the admin — the in-app setup wizard walks you through SMTP, bots and realtime checks. Create your first community.
- Prerequisites
One server with Docker + Docker Compose, DNS records for both domains (e.g. chat.example.com for the API, app.example.com for the app) pointing at it, ports 80/443 open. One Caddy serves both domains and issues both certificates. Voice channels additionally need 7881/tcp + 50000–50100/udp; if you can't open them, set VOICE_ENABLED=false.
- Get the stack
mkdir tyto && cd tyto curl -LO https://raw.githubusercontent.com/tyto-chat/core/master/compose.yaml curl -LO https://raw.githubusercontent.com/tyto-chat/core/master/compose.bundle.yaml - Configure
Create .env — the core values plus APP_DOMAIN:
TYTO_VERSION=1.0.0-beta1 SERVER_DOMAIN=chat.example.com APP_DOMAIN=app.example.com CORS_ALLOW_ORIGIN=https://app.example.comAPP_DOMAIN activates the bundled web client: the client image only contributes its static files, served by the core stack's Caddy. TYTO_VERSION pins both images to one release (see the Core tab for why pinning matters).
- Start it, create the admin, open it
docker compose -f compose.yaml -f compose.bundle.yaml up -d docker compose exec app php bin/console tyto:user:create --adminVisit your app domain, sign in as the admin — the in-app setup wizard walks you through SMTP, bots and realtime checks. Upgrades work as usual: bump TYTO_VERSION, pull, up -d with both files.