A really good chat application for teams and communities, free and easy to self-host, with cloud hosting available soon.
This repository temporarily incubates the early Authling identity-provider module. Authling is developed and released independently from Chatto and is intended to move to its own repository once it no longer needs frequent atomic changes with the shared event-sourcing framework, embedded NATS runtime, data-cryptography primitives, and application-configuration loader.
The root pnpm workspace contains the JavaScript apps, examples, and libraries.
@chatto/client provides shared request,
message, thread, reaction, and typing helpers for bot integrations.
The independent Runling workflow and agent
orchestrator lives in packages/runling/ and is published to npm as runling.
It keeps its own version and MIT license. The Chatto bot uses this local package.
Use mise check-runling, mise test-runling, and mise test-runling-package
to verify it without running the complete Chatto test suite.
ChattoBot is a separate private workspace
package. Run mise dev-chattobot to start its realtime bot and Runling console.
Use mise check-chattobot and mise test-chattobot to verify it.
Root pnpm scripts use Turborepo to build workspace dependencies before their
consumers. Prefer mise tasks or root scripts such as mise x -- pnpm run check:frontend; a command inside a package only runs that package's script.
Library builds use a local .turbo/cache; app builds and verification tasks
run without Turbo caching. Remote caching and telemetry are disabled by the
repository configuration and scripts. See ADR-102
for the task and cache boundaries.
Run the local Chatto backend and Vite frontend, Authling, Mailpit, and LiveKit:
mise trust
mise install
mise setup
(cd authling && mise trust && mise install && mise deps)
mise devmise dev runs the services in one supervised process group. Vite reloads
frontend changes. Restart it after you change Chatto or Authling Go code.
mise setup builds the shared API types, Lingua, and Runling packages.
Portless provides HTTPS routes for browser-facing
services. In Conductor, replace <workspace> with the workspace name:
- Chatto:
https://chatto.<workspace>.localhost:42444 - Authling:
https://authling.<workspace>.localhost:42444 - Mailpit:
https://mailpit.<workspace>.localhost:42444 - LiveKit:
https://livekit.<workspace>.localhost:42444 - Runling:
https://runling.<workspace>.localhost:42444
Outside Conductor, Portless uses the local route suffix. Services listen on
loopback ports from base port 4000 (or $CONDUCTOR_PORT in Conductor).
Create an Authling account, read its verification code in Mailpit, then choose
Authling on the Chatto login screen. Chatto asks for a username at first
login. The stack also creates Chatto owner alice and member bob; both use
the development-only password foobar123.
The stack starts the Runling bot example
on loopback at the base port plus three (http://localhost:4003 outside
Conductor). It uses the bootstrap TestBot account and receives the backend URL
and API key path automatically. On an empty server, bootstrap also creates
TestBot’s outbound webhook. Existing servers keep their saved configuration.
Chatto uses Authling as its development OIDC provider. Chatto stores embedded
NATS data in cli/data/nats/ and search data in cli/data/search/. Authling
identity data is in
.context/dev-portless/<workspace>/nested/authling/.
These credentials and accounts are for local development only. Stop mise dev
to stop the services and unregister the routes. With the stack stopped, remove
cli/data/ to reset Chatto, or remove the Authling identity directory to reset
Authling. A new Conductor workspace name also creates a new Authling issuer and
state directory.
If a worktree has NATS data in the former cli/data/jetstream/ location, use
the migration steps in CONTRIBUTING.md.
Portless creates and trusts a development CA on its first run. If macOS cannot show its authorization prompt, run this command once in an interactive terminal:
mise x node@24 npm:portless@0.15.5 -- portless trustWith mise dev running, run this command in another terminal:
mise seed -- --seed 42 --users 20 --rooms 5 --messages 200 --thread-replies 40This adds 20 users with generated names and 200 messages across five rooms.
The message total includes 40 thread replies. Users join different rooms, with
joins and some leaves interleaved with messages. Sign in as alice to browse
them; generated users have no password.
The same seed and counts reproduce content with the same generator version;
IDs and timestamps change. Each run adds data. A failed run can leave partial
data. Add --json to get the generated IDs and text, or --help for options.
Seeding is available only in development and test builds.
See Synthetic Test Data for e2e use.
Chatto is licensed under AGPL-3.0-or-later by default. The independently
versioned shared framework modules, standalone frontend, integration surfaces,
documentation, and examples use Apache-2.0. Runling uses MIT. See
LICENSING.md and REUSE.toml for the exact
boundary.
The project licenses do not grant permission to use Chatto names or logos as official branding for a fork or modified version; see NOTICE.
See CONTRIBUTING.md for local development notes. This project is not accepting outside contributions at this time.
