Skip to content

Quick Start

Everything you need to get your own Chatto server started is bundled into a single chatto binary. Depending on where and how you want to host it, there’s also a Docker image available. For production-style examples, see the deployment guides for Docker Compose, the standalone binary, and high-availability setups.

The fastest way to try Chatto:

Terminal window
docker run -p 4000:4000 ghcr.io/chattocorp/chatto:latest

Open http://localhost:4000 in your browser.

To keep your configuration and data across container restarts, use a bind mount:

  1. Create a directory for Chatto data:

    Terminal window
    mkdir -p chatto-data
  2. Generate a configuration file:

    Terminal window
    docker run --rm \
    -v ./chatto-data:/data \
    ghcr.io/chattocorp/chatto:latest \
    init -c /data/chatto.toml

    This writes chatto.toml with generated secrets into your chatto-data/ directory on the host.

  3. Start the server:

    Terminal window
    docker run -p 4000:4000 \
    -v ./chatto-data:/data \
    ghcr.io/chattocorp/chatto:latest \
    run -c /data/chatto.toml
  4. Open your browser to http://localhost:4000.

  1. Download the latest release from GitHub Releases.

  2. Generate a configuration file:

    Terminal window
    chatto init

    This creates a chatto.toml with random secrets for cookie signing, cookie encryption, runtime-token verifiers, asset signing, and NATS authentication.

  3. Start the server:

    Terminal window
    chatto run
  4. Open your browser to http://localhost:4000.

The chatto init command generates a configuration like this:

# chatto.toml (generated by chatto init)
[general]
log_level = "info"
# log_format = "auto"
[owners]
emails = []
[webserver]
url = "http://localhost:4000"
port = 4000
allowed_origins = ["*"]
oauth_redirect_origins = []
cookie_signing_secret = "<generated>"
cookie_encryption_secret = "<generated>"
[core]
secret_key = "<generated>"
[core.assets]
signing_secret = "<generated>"
max_upload_size = "25 MB"
storage_backend = "nats"
[auth]
direct_registration = true
# token_ttl = "90d"
[smtp]
enabled = false
[nats]
replicas = 1
# [nats.client]
# url = "nats://nats.example.com:4222"
# auth_method = "token"
# token = "replace-me"
[nats.embedded]
enabled = true
# port = 4222
# bind_address = "127.0.0.1"
# http_port = 8222
data_dir = "./data"
auth_token = "<generated>"

The embedded NATS TCP listener is commented out by default. Leave it that way for the simplest single-process setup; uncomment nats.embedded.port when you need CLI tools such as chatto backup or chatto keys export to connect to the running embedded NATS server.