Quick start

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.

  1. 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.

  2. Get the stack
    mkdir tyto-core && cd tyto-core
    curl -LO https://raw.githubusercontent.com/tyto-chat/core/master/compose.yaml
  3. 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.com

    TYTO_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.

  4. Start it and create the admin
    docker compose up -d
    docker compose exec app php bin/console tyto:user:create --admin

    First 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.

Ports 80/443 already taken by an existing reverse proxy? All three shapes run behind one — see Behind a reverse proxy.
Developing or contributing instead? Both repos ship a one-command DDEV dev environment — see the READMEs of core and client. Deeper configuration lives in the documentation.