Anil-matcha
open-claude-tag
Python

Self-hostable channel-native AI teammate for Slack. Open source alternative to Claude Tag. LLM-agnostic.

Last updated Jul 8, 2026
864
Stars
186
Forks
1
Issues
+8
Stars/day
Attention Score
70
Language breakdown
Python 100.0%
โ–ธ Files click to expand
README

Open Claude Tag โ€” The open-source Claude Tag alternative

๐Ÿ”ฅ Claude Tag launched June 23, 2026 โ€” Anthropic's always-on AI teammate that lives in Slack, learns your company, and works autonomously. It's closed, paid, locked to Anthropic, and cloud-only. This is the open-source alternative: self-hostable, LLM-agnostic, and channel-native.

license python llm-agnostic mcp-native discord

Quickstart ยท How it works ยท Channel config ยท LLMs ยท Roadmap ยท Discord


Open Claude Tag is a free, self-hostable AI teammate for Slack that works the way Claude Tag does โ€” one shared agent per channel, persistent memory, skill auto-creation, ambient monitoring โ€” without Anthropic's paywall, without cloud lock-in, without the single-vendor constraint.

Most Slack AI bots are personal assistants โ€” one context per user, isolated DMs. Open Claude Tag flips this: one agent per channel, shared by the whole team. Everyone sees the same context, picks up mid-thread, and the agent knows who said what.

Community: Join Reddit & Discord for discussions and support. Follow the creator for updates.

Related projects

Open-source AI design agent โ€” alternative to Lovart AI, Runway Agent, Luma Labs Agent โ†’ https://github.com/Anil-matcha/Open-AI-Design-Agent
Open-source multi-modal chatbot and Poe alternative โ†’ https://github.com/Anil-matcha/Open-Poe-AI
Open-source AI voice agent for sales calls and customer support โ†’ https://github.com/Anil-matcha/AI-Voice-Agent

Awesome Generative AI Apps

๐Ÿค– Explore 50+ more open-source AI apps โ†’

Why Open Claude Tag

On June 23, 2026, Anthropic released Claude Tag โ€” the first AI that joins Slack as a shared channel teammate rather than a personal DM bot. It went viral. But it stayed closed-source, paid-only, cloud-only, locked to Claude models, and locked to Anthropic's access control model. No self-host, no BYOK for other providers, no custom tool integrations without Anthropic's approval.

Open Claude Tag is the open-source alternative. Same channel-native mental model, none of the lock-in:

  • ๐Ÿข Channel-scoped, not user-scoped. One agent per channel, shared by the whole team. All users see the same context, pick up mid-thread.
  • ๐Ÿค– LLM-agnostic. Use Claude, GPT-4o, Gemini, Groq, or local Ollama. Swap with one env var. Different channels can use different models.
  • ๐Ÿ’พ Agent-curated memory. After each conversation, the agent decides what's worth keeping in MEMORY.md. No noisy append-only logs.
  • ๐Ÿง  Skill auto-creation. After complex multi-step tasks, the agent writes a SKILL.md capturing what it learned. Institutional knowledge accumulates automatically.
  • ๐Ÿ”” Ambient monitoring. Configurable heartbeat: the agent proactively surfaces stale threads, approaching deadlines, and forgotten questions.
  • ๐Ÿ”Œ MCP-native tools. Plug in any MCP server per channel. Admins control exactly what each channel's agent can access.
  • ๐Ÿ“ File-based config. Each channel is a directory of Markdown files. Version-controllable, auditable, no UI required.
  • ๐Ÿ”’ Self-hostable. Your Slack data stays on your infrastructure. No round-trips to Anthropic's cloud.

Comparison

| | Claude Tag (Anthropic) | OpenClaw / Hermes | Open Claude Tag | |---|---|---|---| | Open source | โŒ | โœ… | โœ… MIT | | Self-hostable | โŒ | โœ… | โœ… | | Channel-scoped shared agent | โœ… | โŒ (per-user) | โœ… | | Multi-user attribution | โœ… | โŒ | โœ… | | Agent-curated memory | โœ… | Append-only | โœ… Letta inner loop | | Skill auto-creation | โŒ | โœ… (Hermes) | โœ… | | Ambient / proactive mode | โœ… | โŒ | โœ… heartbeat cron | | LLM-agnostic | โŒ (Claude only) | โœ… | โœ… LiteLLM | | MCP-native tools | โœ… | Partial | โœ… | | Per-channel model override | โŒ | โŒ | โœ… | | Per-channel tool scoping | โœ… | โŒ | โœ… tools.toml | | Token budget controls | โœ… | โŒ | โœ… BUDGET.md | | Discord / Teams support | โŒ (Slack only) | โœ… | Roadmap | | Pricing | Enterprise + Team plan | Free | Free |


How it Works

The core inversion

Every other Slack bot keys sessions on userid. Open Claude Tag keys sessions on (workspaceid, channel_id). That one change is what makes it feel like a teammate rather than a chatbot.

[#engineering channel]

@alice Can you review the PR for the auth refactor? @agent Sure. I pulled the PR โ€” looks good overall, one concern: the session expiry logic on line 42 doesn't handle clock skew. @bob you mentioned this pattern in the DB migration last week โ€” does the same fix apply here? @bob Yeah, add a 5s leeway. Same as auth/session.py:L88 @agent Got it. Adding to MEMORY.md: "session expiry: always add 5s leeway for clock skew (pattern from auth/session.py:L88)"

Every user in the channel sees the same thread. The agent knows who said what, follows up with the right person, and decides what's worth remembering.

Agent loop

Slack @mention
       โ”‚
       โ–ผ
  Channel Router โ”€โ”€โ”€โ”€ (workspaceid + channelid) โ†’ AgentSession
       โ”‚                  โ†‘ serialized lock: no parallel writes to context
       โ–ผ
  Context Assembler
  โ”œโ”€โ”€ CHANNEL.md       (identity, purpose, tone)
  โ”œโ”€โ”€ MEMORY.md        (agent-curated facts, always in context)
  โ”œโ”€โ”€ skills/*.md      (auto-created playbooks, loaded on semantic match)
  โ””โ”€โ”€ Last 50 messages (with @username attribution)
       โ”‚
       โ–ผ
  Agent Loop  (ReAct + tool-use via LiteLLM)
  โ”œโ”€โ”€ Tool Registry  โ† MCP servers defined in tools.toml
  โ”œโ”€โ”€ Built-in tools โ† web search, Python runner, channel search
  โ””โ”€โ”€ Stream reply โ†’ Slack thread
       โ”‚
       โ”œโ”€โ”€ Memory curation turn  โ† agent decides what to write to MEMORY.md
       โ”‚   (Letta inner-loop: model gets one extra turn to curate)
       โ”‚
       โ””โ”€โ”€ Skill evaluator  โ† โ‰ฅ5 tool calls? write SKILL.md
           (Hermes pattern: agent authors its own playbooks)
       โ”‚
       โ–ผ
  SQLite + FTS5  (per-workspace DB, channel-isolated, WAL mode)
       โ”‚
       โ–ผ
  Ambient Engine  (background โ€” Phase 3)
  โ”œโ”€โ”€ Per-channel APScheduler crons
  โ”œโ”€โ”€ Heartbeat evaluator: "anything worth surfacing?"
  โ””โ”€โ”€ Proactive Slack post if yes, SILENT if no

Memory architecture

Layer 1 โ€” Context window (always loaded)
  CHANNEL.md + MEMORY.md + active SKILL.md files + last 50 messages

Layer 2 โ€” Session store (SQLite + FTS5, per workspace) Full message history with userid, timestamps, threadts Full-text search: "what did we decide about X last month?"

Layer 3 โ€” Semantic recall (Mem0, Phase 2) Embeddings over key decisions and facts Namespace = channel_id (fully isolated per channel)

Layer 4 โ€” Skill library (per channel) Auto-created after complex tasks (โ‰ฅ5 tool calls) Loaded into context when task description matches Curated weekly: stale after 30d, archived after 90d

Ambient heartbeat

The heartbeat evaluator runs on a configurable cron per channel. It dumps recent activity to the LLM and asks: "anything worth surfacing?" It only posts if there's genuine value โ€” stale threads, approaching deadlines, forgotten questions, spotted risks. Otherwise: SILENT.

The agent can also create its own monitoring tasks via schedule_task(cron, description) โ€” it decides what's worth checking and when.


Quickstart

Prerequisites

  • Python 3.11+
  • A Slack app with Socket Mode enabled (create one here)
  • An API key for your preferred LLM provider (Anthropic, OpenAI, Gemini, or Groq)

1. Create the Slack app

  • Go to api.slack.com/apps โ†’ Create New App โ†’ From scratch
  • Settings โ†’ Socket Mode: enable it and generate an App-Level Token (xapp-...) with connections:write scope
  • Event Subscriptions: enable and subscribe to app_mention and message.channels
  • OAuth & Permissions โ†’ Bot Token Scopes: add app_mentions:read, channels:history, channels:read, chat:write, reactions:write, users:read
  • Install to workspace โ†’ copy the Bot Token (xoxb-...)

2. Install and configure

# Clone
git clone https://github.com/Anil-matcha/open-claude-tag
cd open-claude-tag

Install

pip install -e .

Configure

cp .env.example .env

Edit .env:

SLACKBOTTOKEN=xoxb-...
SLACKAPPTOKEN=xapp-...

Pick one LLM provider:

LLM_MODEL=claude-sonnet-4-6 ANTHROPICAPIKEY=sk-ant-...

or: LLMMODEL=gpt-4o + OPENAIAPI_KEY=sk-...

or: LLMMODEL=gemini/gemini-2.0-flash + GEMINIAPI_KEY=...

or: LLM_MODEL=ollama/llama3 (no key needed)

3. Configure your first channel

Get your channel ID: in Slack, right-click channel name โ†’ View channel details โ†’ scroll to the bottom.

mkdir -p data/channels/C01234ABC
cp channels/example/CHANNEL.md data/channels/C01234ABC/CHANNEL.md

Edit CHANNEL.md to describe your channel's purpose and team

4. Run

tagopen

Then @open-claude-tag in your Slack channel.


Channel Configuration

Each channel gets a directory of plain Markdown files under data/channels/<channel_id>/. Version-controllable, human-readable, no database required.

data/channels/C01234ABC/
  CHANNEL.md      โ† identity, purpose, tone
  MEMORY.md       โ† agent-maintained facts (auto-updated, don't edit manually)
  tools.toml      โ† MCP servers and per-channel LLM override
  skills/         โ† auto-created playbooks
    deploy-to-staging.md
    oncall-handoff.md
    pr-review-checklist.md

CHANNEL.md

# Engineering Channel

You are the engineering team's AI teammate in #engineering.

Purpose

Help with deployments, code reviews, incident response, and architecture decisions.

Tone

Technical, direct, concise. Use code blocks. Ask before triggering deploys.

Team context

  • Stack: Python backend, React frontend, PostgreSQL, AWS
  • CI/CD via GitHub Actions
  • We do not deploy on Fridays

MEMORY.md โ€” agent-curated facts

The agent writes this automatically. After each conversation it gets one internal LLM turn to decide what's worth persisting โ€” using memoryappend and memoryreplace tools. Memory stays clean because the agent curates it, not a dumb append-only log.

Example of what accumulates over time:

# Channel Memory
  • Session expiry: always add 5s leeway for clock skew (auth/session.py:L88)
  • We use squash-merge for all PRs โ€” rebase main before merging
  • Alice: infra questions. Bob: auth layer.
  • Never restart worker pods on Fridays โ€” cron runs at 11pm PT

tools.toml โ€” MCP servers and model override

# Per-channel LLM override (optional)
[llm]
model = "gpt-4o"

MCP servers allowed in this channel

[[mcp_server]] name = "github" url = "mcp://localhost:3001" allowedtools = ["listprs", "getfile", "createcomment", "trigger_workflow"]

[[mcp_server]] name = "linear" url = "mcp://localhost:3002" allowedtools = ["listissues", "createissue", "updatestatus"]

Skills โ€” auto-created institutional knowledge

After any task requiring 5+ tool calls, the agent writes a SKILL.md. Next time a similar task comes up, the skill loads into context automatically.

Example auto-created skill:

---
name: deploy-to-staging
description: Deploy a service to staging via GitHub Actions
created: 2026-06-25
uses: 3
status: active

When to use this

When someone asks to deploy a service to staging.

Steps

  • Check CI is passing on the branch (github:list_prs)
  • Confirm with the requester before triggering
  • Trigger deploy-staging workflow (github:trigger_workflow)
  • Monitor the run for 2 minutes, post the staging URL

Known gotchas

  • No deploys on Fridays โ€” check day of week first
  • worker service uses a separate deploy-worker workflow
Skills lifecycle: active โ†’ stale (30d unused) โ†’ archived (90d). A weekly curator pass merges overlapping skills and patches outdated ones.

Supported LLMs

Uses LiteLLM โ€” one interface for every provider. Set LLMMODEL and the matching key:

| Provider | LLM_MODEL | Key env var | |---|---|---| | Anthropic Claude (default) | claude-sonnet-4-6 | ANTHROPICAPIKEY | | Anthropic Claude Opus | claude-opus-4-8 | ANTHROPICAPIKEY | | Anthropic Claude Haiku | claude-haiku-4-5-20251001 | ANTHROPICAPIKEY | | OpenAI GPT-4o | gpt-4o | OPENAIAPIKEY | | OpenAI o3 | o3 | OPENAIAPIKEY | | Google Gemini | gemini/gemini-2.0-flash | GEMINIAPIKEY | | Groq (fast open-weight) | groq/llama-3.3-70b-versatile | GROQAPIKEY | | Local Ollama | ollama/llama3 | (none needed) |

Per-channel model override โ€” run a lighter model in #general, a more powerful one in #engineering. Add to data/channels/<id>/tools.toml:

[llm]
model = "claude-opus-4-8"

Built-in Tools

Always available in every channel โ€” no configuration needed:

| Tool | What it does | |---|---| | web_search | DuckDuckGo instant search โ€” no API key required | | run_python | Execute Python snippets and return stdout (sandboxed) | | searchchannelhistory | Full-text search across this channel's message history | | memory_append | Append a fact to MEMORY.md | | memory_replace | Update an outdated fact in MEMORY.md |

Add any other tool by listing an MCP server in tools.toml. Any MCP-compatible server works โ€” GitHub, Linear, Notion, Jira, Datadog, PagerDuty, Sentry, etc.


Development

# Install with dev dependencies
pip install -e ".[dev]"

Run tests

pytest

Lint

ruff check .

Type check

mypy tagopen/

Project structure

tagopen/
  gateway/
    app.py       โ† Slack Bolt async app, @mention handler
    router.py    โ† channel router: (workspaceid, channelid) โ†’ AgentSession
  agent/
    loop.py      โ† ReAct agent loop, tool dispatch, memory + skill hooks
    context.py   โ† system prompt assembler (CHANNEL.md + MEMORY.md + skills)
    skills.py    โ† skill auto-creation after complex tasks
  memory/
    store.py     โ† SQLite + FTS5 message store, channel-isolated
    writer.py    โ† inner loop: agent curates MEMORY.md
  tools/
    registry.py  โ† per-channel tool registry, reads tools.toml
    builtins.py  โ† web search, Python runner, channel history search
  ambient/
    heartbeat.py โ† proactive monitoring (Phase 3)
  llm.py         โ† LiteLLM wrapper: key injection, per-channel model resolve
  config.py      โ† settings from .env via pydantic-settings
  cli.py         โ† entry point: tagopen
channels/
  example/       โ† copy these to data/channels/<id>/ to get started
tests/
  unit/          โ† channel isolation, SQLite store, router tests
PLAN.md          โ† full architecture and design decisions

Roadmap

  • [x] Phase 1 โ€” Channel-native reactive teammate
- [x] Slack Bolt async app, Socket Mode - [x] Channel router: (workspaceid, channelid) โ†’ shared AgentSession - [x] Multi-user attribution in context window - [x] ReAct agent loop via LiteLLM - [x] SQLite + FTS5 per-channel message store - [x] File-based channel config (CHANNEL.md, MEMORY.md, tools.toml) - [x] Built-in tools: web search, Python runner, channel history search - [x] Per-channel model override - [x] Multi-provider: Anthropic, OpenAI, Gemini, Groq, Ollama
  • [ ] Phase 2 โ€” Memory + Skills
- [ ] Letta inner-loop memory curation (agent writes MEMORY.md) - [ ] Skill auto-creation (โ‰ฅ5 tool calls โ†’ SKILL.md) - [ ] Skill loader: semantic match to incoming task - [ ] Skill curator: weekly prune, stale/archived lifecycle - [ ] Mem0 semantic recall layer
  • [ ] Phase 3 โ€” Ambient mode
- [ ] Per-channel APScheduler heartbeat crons - [ ] LLM heartbeat evaluator (SILENT or post) - [ ] Stale thread detection - [ ] schedule_task tool: agent creates its own monitoring crons - [ ] Temporal for durable task orchestration
  • [ ] Phase 4 โ€” Governance + Admin UI
- [ ] Per-channel audit log (tokens spent, tools invoked) - [ ] Hard token budget enforcement via BUDGET.md - [ ] Next.js admin UI: channel config, tool access, budget view
  • [ ] Phase 5 โ€” Multi-platform
- [ ] Discord adapter - [ ] Microsoft Teams adapter

See PLAN.md for full architecture decisions and research notes.


Community

  • ๐Ÿ’ฌ Discord โ€” questions, feature requests, show-and-tell โ†’ discord.gg/s7KW4fsqXK
  • ๐Ÿฆ X / Twitter โ€” updates and releases โ†’ @matchaman11
  • ๐Ÿ› GitHub Issues โ€” bug reports, feature requests โ†’ Issues

Contributing

Contributions welcome โ€” especially:

| Want to shipโ€ฆ | Where | |---|---| | A new built-in tool | tagopen/tools/builtins.py + schema in BUILTIN_TOOLS | | A new platform adapter (Discord, Teams) | tagopen/gateway/ | | Memory improvements | tagopen/memory/ | | Ambient mode (Phase 3) | tagopen/ambient/heartbeat.py | | Example channel configs | channels/ | | Bug fixes | Issues |

git clone https://github.com/Anil-matcha/open-claude-tag
cd open-claude-tag
pip install -e ".[dev]"
pytest && ruff check .

Star history

Star history


References

| Project | Role | |---|---| | Claude Tag โ€” Anthropic | The closed-source product this repo is the open-source alternative to | | OpenClaw | Gateway architecture, workspace file pattern, multi-agent routing | | Hermes Agent | Skill auto-creation pattern, agent-managed crons, SQLite + FTS5 | | Letta (MemGPT) | Inner-loop memory curation, memory block tools | | LiteLLM | Multi-provider LLM routing |


License

MIT โ€” free to use, modify, and self-host.


This project is independent and not affiliated with Anthropic or Slack. References to third-party platforms are for interoperability and educational purposes. All trademarks are the property of their respective owners.

ยฉ 2026 GitRepoTrend ยท Anil-matcha/open-claude-tag ยท Updated daily from GitHub