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.

or

A session, live in a thread

A long Claude Code session streaming into a Slack thread

Scroll: the thread scrolls with you. Task lists, diffs, and permission prompts all land as messages.

How it works

  1. @claude fix the flaky test in ci.yml in your channel
  2. The bot spawns a real Claude Code session in a working directory on your machine
  3. Everything streams into the thread: output, diffs, task lists, permission prompts
  4. 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
  • !invite collaborators; commits carry Co-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: !remember shares 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.

A Claude Code session in a Mattermost thread, with the session header table
A session thread in Mattermost

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:

πŸ‘ allow βœ… allow all πŸ‘Ž deny

Plans

When Claude presents a plan:

πŸ‘ approve πŸ‘Ž request changes

Questions

Multiple choice:

1️⃣ 2️⃣ 3️⃣ 4️⃣

Session

Pause, stop, or pick a session back up:

⏸️ interrupt ❌ stop ↩️ resume

Housekeeping

On long output and error posts:

πŸ”½ collapse πŸ› file a bug

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.