Skip to content

Overview

Chatto is a self-hosted, real-time chat application. It uses a GraphQL API backed by NATS and JetStream for messaging and persistent storage, so there’s no separate database to set up or maintain.

Chatto ships as a single Go executable that bundles:

  • Web server serving the SvelteKit frontend and GraphQL API
  • Embedded NATS server with JetStream for message persistence and pub/sub
  • Core API layer handling business logic, authorization, and encryption

All persistent data (users, spaces, rooms, messages, file attachments) is stored in NATS JetStream streams and KV buckets.

The simplest setup. One process handles everything: the web server, NATS, and all application logic. Data is stored in a local directory. This is the default when you run chatto init and chatto run.

For high-availability or higher-throughput deployments, run multiple Chatto instances connected to an external NATS server or cluster. A reverse proxy (like Caddy or Traefik) load-balances across the instances. The only config change is setting nats.embedded.enabled to false and pointing at your NATS cluster.

  • Spaces and rooms for organizing conversations
  • Threaded replies within rooms
  • Emoji reactions on messages
  • File attachments stored in NATS or S3-compatible storage
  • Typing indicators and presence
  • OAuth login with Google and GitHub
  • Role-based access control per space
  • Push notifications via Web Push
  • Per-user encryption with GDPR-compliant crypto-shredding
  • Backup and restore with a single command

Follow the Quick Start guide to get Chatto running in a few minutes.