Mirror of chattocorp/chatto (Chatto chat server)
  • Go 42.9%
  • TypeScript 39.7%
  • Svelte 9.8%
  • MDX 5.7%
  • JavaScript 0.9%
  • Other 0.8%
Find a file
Hendrik Mans 2a2d8f6449
Some checks failed
ci / license-check (push) Has been cancelled
ci / workflow-lint (push) Has been cancelled
ci / changes (push) Has been cancelled
ci / build-main-image-contexts (push) Has been cancelled
ci / desktop (macos) (push) Has been cancelled
ci / desktop (linux) (push) Has been cancelled
ci / test-runling (push) Has been cancelled
ci / desktop (windows) (push) Has been cancelled
ci / desktop-macos-capture (push) Has been cancelled
ci / codegen-proto-drift (push) Has been cancelled
ci / check-workspace (push) Has been cancelled
ci / test-workspace (push) Has been cancelled
ci / test-e2e (4/4) (push) Has been cancelled
ci / test-cli (push) Has been cancelled
ci / test-authling-e2e (push) Has been cancelled
ci / test-e2e (1/4) (push) Has been cancelled
ci / test-e2e (2/4) (push) Has been cancelled
ci / test-e2e (3/4) (push) Has been cancelled
ci / test-e2e-media (push) Has been cancelled
ci / test-e2e-performance (push) Has been cancelled
ci / publish-main-image (push) Has been cancelled
ci / check-docs (push) Has been cancelled
chore(main): release 0.5.0-beta.6 (#2491)
2026-09-21 14:40:48 +02:00
.agents/skills chore(skills): refresh upstream Svelte code writer instructions (#2455) 2026-09-19 09:26:42 +00:00
.claude docs: migrate agent rules to AGENTS files (#1116) 2026-06-25 10:40:19 +02:00
.codex chore(dev): add Codex desktop environment configuration (#2364) 2026-09-14 17:12:38 +02:00
.conductor feat(bots): add outbound webhooks and retained operational logs (#2312) 2026-09-08 20:01:25 +02:00
.github feat(client): extract shared Chatto integration helpers (#2518) 2026-09-21 10:49:36 +02:00
.opencode chore: configure OpenCode MCP servers (#2138) 2026-08-27 10:59:29 +00:00
apps chore(main): release 0.5.0-beta.6 (#2491) 2026-09-21 14:40:48 +02:00
authling fix(authling): resolve Basic OP conformance failures (#2406) 2026-09-16 15:24:37 +02:00
cli chore(main): release 0.5.0-beta.6 (#2491) 2026-09-21 14:40:48 +02:00
docker feat(dev): replace Compose stack with Pitchfork (#2047) 2026-08-18 10:12:29 +02:00
docs build: orchestrate workspace tasks with Turborepo (#2521) 2026-09-21 14:05:13 +02:00
examples build: orchestrate workspace tasks with Turborepo (#2521) 2026-09-21 14:05:13 +02:00
LICENSES feat(runling): integrate orchestrator into the monorepo (#2502) 2026-09-21 10:02:39 +02:00
packages feat(search): unify message and thread search with automatic reindexing (#2519) 2026-09-21 14:05:05 +02:00
pkg fix(events): retry JetStream provisioning request timeouts (#2436) 2026-09-18 13:21:45 +02:00
proto feat(search): unify message and thread search with automatic reindexing (#2519) 2026-09-21 14:05:05 +02:00
tools build: orchestrate workspace tasks with Turborepo (#2521) 2026-09-21 14:05:13 +02:00
.gitattributes feat(desktop): replace Deno Desktop with Electron (#1939) 2026-08-09 11:55:34 +02:00
.gitignore build: orchestrate workspace tasks with Turborepo (#2521) 2026-09-21 14:05:13 +02:00
.goreleaser.yml fix(docker): support read-only root filesystems (#1403) 2026-07-11 11:42:41 +02:00
.mcp.json chore: add MDN MCP 2026-06-15 13:25:32 +02:00
.npmrc fix(tooling): configure pnpm 11 and use Node LTS (#2310) 2026-09-05 16:31:18 +00:00
.release-please-config.json feat(runling): integrate orchestrator into the monorepo (#2502) 2026-09-21 10:02:39 +02:00
.release-please-manifest.json chore(main): release 0.5.0-beta.6 (#2491) 2026-09-21 14:40:48 +02:00
.worktreeinclude chore(conductor): add TOML repository settings (#764) 2026-06-07 11:06:39 +02:00
AGENTS.md feat(search): unify message and thread search with automatic reindexing (#2519) 2026-09-21 14:05:05 +02:00
CHANGELOG.md chore(main): release 0.5.0-beta.6 (#2491) 2026-09-21 14:40:48 +02:00
CLAUDE.md Migrate Claude project settings to Codex 2026-05-26 14:19:50 +02:00
CONTRIBUTING.md chore(dev): add Codex desktop environment configuration (#2364) 2026-09-14 17:12:38 +02:00
favicon.png chore(conductor): add TOML repository settings (#764) 2026-06-07 11:06:39 +02:00
go.work feat(appconfig): extract shared configuration loading (#1856) 2026-07-31 18:04:06 +02:00
go.work.sum feat(mcp): add authenticated network integration (#2225) 2026-08-30 17:39:13 +02:00
knip.json chore: clean up tooling and architecture records (#2150) 2026-08-27 17:10:41 +02:00
LICENSE chore(license): make root license scanner-friendly (#1315) 2026-07-06 09:29:53 +00:00
LICENSING.md feat(client): extract shared Chatto integration helpers (#2518) 2026-09-21 10:49:36 +02:00
mise.toml build: orchestrate workspace tasks with Turborepo (#2521) 2026-09-21 14:05:13 +02:00
NOTICE feat(runling): integrate orchestrator into the monorepo (#2502) 2026-09-21 10:02:39 +02:00
package.json build: orchestrate workspace tasks with Turborepo (#2521) 2026-09-21 14:05:13 +02:00
pnpm-lock.yaml build: orchestrate workspace tasks with Turborepo (#2521) 2026-09-21 14:05:13 +02:00
pnpm-workspace.yaml feat(runling): integrate orchestrator into the monorepo (#2502) 2026-09-21 10:02:39 +02:00
README.md build: orchestrate workspace tasks with Turborepo (#2521) 2026-09-21 14:05:13 +02:00
REUSE.toml feat(client): extract shared Chatto integration helpers (#2518) 2026-09-21 10:49:36 +02:00
SECURITY.md fix(security): restrict public server assets (#1499) 2026-07-14 09:13:24 +02:00
skills-lock.json chore(skills): refresh Svelte guidance (#2145) 2026-08-27 14:25:43 +00:00
turbo.json build: orchestrate workspace tasks with Turborepo (#2521) 2026-09-21 14:05:13 +02:00

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.

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.