Team chat you own: an open-source, self-hostable workspace messenger, built in pure Rust.
Channels, direct and group messages, threads, reactions, mentions, search, status and presence — the workflow people know from Slack and Microsoft Teams, in one fast native app for macOS, Windows, Linux and BSD, and in the browser via WebAssembly. Run your own server with one binary.
Status: early (M0 — foundations). Everything shown works end to end, in-process and over a real server, but ChatCraft is not yet ready to replace your team's chat. See ROADMAP.md.
- Familiar. Sidebar with channels and DMs, unread and mention badges, threads in a side pane,
hover actions, emoji reactions,
*bold*/_italic_/`code`formatting,@mentions,#channellinks, Enter to send, Up to edit your last message, Ctrl/Cmd+K to jump anywhere. - Private and open. Speaks Matrix: use any homeserver, talk to people on other servers and other Matrix apps. Private channels and direct messages are end-to-end encrypted — the server only ever stores ciphertext (docs/matrix.md).
- Yours. No telemetry. Self-host a Matrix homeserver, or use the demo workspace entirely in-process.
- Fast and native. One Rust codebase, GPU-rendered with egui. No Electron.
- Built for agents. Every action is a command with an id. The same commands drive the UI, keyboard shortcuts, a command-line tool and an MCP server.
- Safe by construction. No
unsafe, no panics in production code, hostile-input tests on every command, private conversations filtered at the server. - Open. MIT OR Apache-2.0. Clean-room: built from observation and public documentation, with every asset original.
| Area | Highlights |
|---|---|
| Conversations | Public and private channels, direct and group messages, notes-to-self; create, browse, join, leave, invite, remove, rename, topic, description, archive, star, mute |
| Messages | Send, edit (inline or Up arrow), delete, pin, save for later, copy link; drafts per conversation; jumbo emoji |
| Formatting | Bold, italic, strike, inline code, code blocks, quotes, bulleted and numbered lists, links, @person, @here/@channel, #channel, :emoji: with autocomplete |
| Threads | Reply in thread, also-send-to-channel, reply counts, repliers, last reply time |
| Reactions | Quick reactions, emoji picker, toggle, who-reacted tooltips |
| Reading | Unread and mention counts, "New" divider, mark read / mark all read, next-unread navigation, back/forward |
| Search | Words, "phrases", -exclusions, in: from: to: has:link has:reaction has:pin is:thread is:saved before: after: on: |
| People | Profiles and titles, presence (active, away, do not disturb), custom status with emoji and expiry, people directory |
| Look | Light and dark themes, code-drawn icon set, keyboard shortcuts dialog, toasts for mentions |
| Server | WebSocket server, durable journal, join token, reconnecting clients that resync themselves |
| Agents | chatcraft-cli run, chatcraft-cli mcp, 65 engine commands (plus 9 UI commands), parity report |
Parity with Slack and Teams is measured, not guessed: 64 of 113 catalogued features have a command today (docs/parity-checklist.md).
# Sign in to any Matrix homeserver, by password or single sign-on (end-to-end encrypted private channels and DMs)
cargo run --release -p chatcraft # sign-in screen; the account is remembered
# The built-in demo workspace (nothing leaves your machine)
cargo run --release -p chatcraft -- --demo
# Or host the small built-in ChatCraft server and join it from two terminals
cargo run --release -p chatcraft-server -- --data ./chatcraft-data --name "My Team"
cargo run --release -p chatcraft -- --server ws://127.0.0.1:7900 --handle ada --token <TOKEN>
cargo run --release -p chatcraft -- --server ws://127.0.0.1:7900 --handle bo --token <TOKEN> --dark
# In the browser: sign in to a homeserver (encryption runs in the page), or ?demo
cd apps/chatcraft-web && trunk serveThe server binds to 127.0.0.1 and speaks ws://; put it behind a TLS reverse proxy before
exposing it (see SECURITY.md).
chatcraft-cli commands # every command, with params
chatcraft-cli run --demo --as ada \
--cmd 'message.send={"channel":"#general","text":"Standup in 5 :coffee:"}' \
--cmd 'search.messages={"query":"launch from:@noor"}'
chatcraft-cli mcp --server ws://127.0.0.1:7900 --as helper-bot --token <TOKEN>See docs/mcp.md.
A strict layer cake (enforced by cargo xtask layers): core/text → model (event-sourced
state) → proto/store/search → hub (the authority, pure) → engine (client session +
command registry) → net/mcp → ui-egui → apps. The same hub runs inside the server and
in-process, so the demo, the tests and production share one code path.
Details: docs/architecture.md, wire format: docs/protocol.md.
ROADMAP.md has the stage and progress log; docs/gaps.md is the ranked work list (files, per-user auth, TLS, notifications, calls…).
cargo xtask ci must pass (fmt, clippy -D warnings, tests, assets, layers, wasm). Read
AGENTS.md first — especially the clean-room and asset rules — and
docs/contributing.md.
ChatCraft follows the conventions of the ArtCraft Crafting apps (WordCraft, PdfCraft, GridCraft, PhotoCraft…) but is an independent project.
MIT OR Apache-2.0, at your option. ChatCraft is not affiliated with Slack, Salesforce or Microsoft; their names are used only to describe feature parity. Third-party material: NOTICE and ATTRIBUTION.md.

