claude-threads
Claude Code Γ Slack & Mattermost
Run Claude Code on your machine. Your team follows along in Slack or Mattermost threads and types right back. Permission prompts land in the thread as emoji reactions, and it all runs on the Claude subscription you already have.
A session, live in a thread
Scroll: the thread scrolls with you. Task lists, diffs, and permission prompts all land as messages.
How it works
-
@claude fix the flaky test in ci.ymlin your channel - The bot spawns a real Claude Code session in a working directory on your machine
- Everything streams into the thread: output, diffs, task lists, permission prompts
- Steer by replying or reacting with emoji. Anyone you invite can do the same
What Claude can do in your chat
Each session runs its own MCP server, so Claude acts in the chat itself. Every tool carries its own guardrail; nothing reaches beyond the channels the bot can already see.
| Tool | What Claude does with it | Guardrail |
|---|---|---|
send_file |
Post a file into the thread | Path validated against the working directory |
read_post |
Resolve a permalink you paste | Bot's channel plus public channels |
list_thread |
Read the current or a linked thread | Same channel scoping |
read_channel_history |
Read recent channel messages | Capped at 100 messages |
search_messages |
Search messages | Mattermost only, capped at 25 results |
react_to_post |
Add an emoji reaction | Defaults to the message that triggered it |
update_own_post |
Edit one of its earlier posts | Bot-authored posts only |
send_dm |
DM a channel member | 3 per recipient per session, each recipient approves first |
permission_prompt |
Ask the thread to approve a tool use | This one is the approval flow (π / β / π) |
Features
- Live output, diffs, and a sticky task list streaming into the thread
- Multiple workspaces at once, Slack and Mattermost side by side
- One session per thread, resumed automatically after a bot restart
- Sessions run against your local checkout, with your own MCP servers and plugins
- Optional account pool that routes each new session to the subscription with the most headroom
- Three permission modes, switchable mid-session
-
!invitecollaborators; commits carryCo-Authored-By:for everyone involved - Attach files up to 100 MB; images and PDFs are read multimodally
- Claude posts screenshots, plots, or generated files back into the thread
- Git worktrees isolate each session's changes on a branch
-
Channels learn over time:
!remembershares team notes with every session, ended sessions distill durable facts, and Claude's native auto-memory keeps per-repo knowledge -
Routines:
!routine every weekday at 9am, ...schedules recurring work that posts its runs as new threads -
Watches:
!watch when someone reports an incident, ...fires a session in the triggering thread when a matching message appears - Quiet mode and per-channel verbosity dials
- Runs on macOS, Linux, and Windows
At home on self-hosted chat
Half of claude-threads lives on Mattermost, where teams run their own chat because the work cannot leave the building. The bot, the session, and the repository all stay on hardware you control.
Commands
| Command | Description |
|---|---|
!help |
Show available commands |
!context |
Show context usage |
!cost |
Show token usage and cost |
!compact |
Compress context |
!cd <path> |
Change working directory |
!permissions <mode> |
Switch between default, auto,
bypass
|
!mentions [on|off] |
Quiet mode: respond only when @mentioned |
!remember <text> |
Save a note to the channel's shared memory |
!memory |
Show channel memory (forget <n|text>
removes an entry)
|
!routine <schedule, task> |
Schedule a recurring routine (confirmed with π) |
!routines |
List routines (pause|resume|delete|run <n>
manage them)
|
!watch <when ..., task> |
Create an event trigger (confirmed with π) |
!watches |
List event triggers (pause|resume|delete <n>
manage them)
|
!worktree <branch> |
Create a git worktree (also: list,
switch, remove,
cleanup, off)
|
!plugin <cmd> |
Manage Claude Code plugins |
!invite @user |
Invite a user (added as Co-Authored-By: on
commits)
|
!kick @user |
Remove an invited user |
!github-email <email> |
Register your GitHub noreply address for commit attribution |
!update |
Auto-update status (!update now /
!update defer)
|
!release-notes |
What changed in the running version |
!bug <desc> |
Report a bug (creates a GitHub issue) |
!approve |
Approve a pending plan (or react π) |
!escape |
Interrupt the current task |
!stop |
Stop the session |
!kill |
Emergency stop for all sessions |
Controls
Permissions
When Claude wants to run a tool:
Plans
When Claude presents a plan:
Questions
Multiple choice:
Session
Pause, stop, or pick a session back up:
Housekeeping
On long output and error posts:
Permission modes
Pick per session with
!permissions default|auto|bypass, set a default in
config, or pass --permission-mode on the command
line.
| Mode | Behavior |
|---|---|
default π |
Every tool use prompts the thread for π / β / π |
auto β‘ |
Claude's classifier approves low-risk actions; high-risk still prompts. Recommended. |
bypass β οΈ |
No prompts, all tools allowed. Trusted environments only. |
Why I built this
I wanted my team to use Claude Code without everyone needing their own setup. Screen sharing works but only one person can type. With claude-threads, colleagues watch Claude work in a thread and can jump in to help, approve actions, or ask questions. All from chat.
After the first minimal version, I built claude-threads using claude-threads. Colleagues watched, asked questions, and caught bugs in real time. It turns out that multiple people guiding the same AI session actually works.
Anthropic now has its own ways to put Claude in Slack, running in Anthropic's cloud. claude-threads remains the local one: your machine, your chat server, any subscription.
How it compares
Anthropic, OpenAI, Cursor, and Cognition each put their agent in Slack, and they did it well. The main difference is where the session runs.
| Product | Sessions run on | Chat platforms | Account |
|---|---|---|---|
| claude-threads (open source, Apache-2.0) | Your machine: local checkout, your MCP servers and plugins | Slack + Mattermost, multiple workspaces at once | Any Claude subscription or API key |
| Claude Code in Slack / Claude Tag (Anthropic) | Anthropic's cloud, against GitHub repos | Slack | Claude Pro/Max; Claude Tag on Team/Enterprise |
| Codex in Slack (OpenAI) | OpenAI's Codex cloud | Slack | ChatGPT plan |
| Cursor in Slack | Cursor's cloud agents | Slack | Cursor plan |
| Devin (Cognition) | Cognition's cloud | Slack (also Linear and Jira tickets) | Devin plan |
| Community bots such as claude-code-slack-bot | Your machine | Slack | Claude subscription or API key |
With the cloud products, you delegate from a thread: the work runs in a vendor-hosted sandbox and comes back as a pull request β Claude Tag additionally stays in the conversation as a shared teammate. claude-threads keeps the session itself in the thread and on your hardware β streamed output, emoji permission prompts, teammates typing into the same session β which matters when chat is self-hosted Mattermost or the code cannot leave the building. The trade-off: you run the bot yourself.
A few more things set it apart: the full Claude Code permission
model lives in the thread (π/β
/π per tool use, three modes
switchable mid-session), sessions are multiplayer (!invite
teammates, guest messages gated behind approval, shared co-author
credit on commits), an optional account pool routes each session
to the Claude subscription with the most headroom, and nothing
assumes GitHub β any local checkout works. Current as of August
2026.
Quickstart
Requires Bun 1.2.21+ or Node 20+ and the Claude Code CLI
The setup wizard walks you through connecting Slack or Mattermost.