Skip to content

Latest commit

 

History

1,790 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CI Release Latest release License: AGPL-3.0-or-later with Apache-2.0 exceptions

Chatto

It's Chatto!

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.

Local Development Stack

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 dev

mise 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 trust

Generate Test Data

With mise dev running, run this command in another terminal:

mise seed -- --seed 42 --users 20 --rooms 5 --messages 200 --thread-replies 40

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

License

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.

Contributing

See CONTRIBUTING.md for local development notes. This project is not accepting outside contributions at this time.

About

A fully-featured team and group chat application that you can easily selfhost.

Topics

Resources

Contributing

Security policy

Stars

2.8k stars

Watchers

11 watching

Forks

Releases

Packages

Contributors

Languages