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](https://reddit.com/r/muapi) & [Discord](https://discord.gg/s7KW4fsqXK) for discussions and support. **Follow** the [creator](https://x.com/matchaman11) 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 โ†’](https://github.com/Anil-matcha/awesome-generative-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 `user_id`. Open Claude Tag keys sessions on `(workspace_id, 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 โ”€โ”€โ”€โ”€ (workspace_id + channel_id) โ†’ 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 user_id, timestamps, thread_ts 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](https://api.slack.com/apps)) - An API key for your preferred LLM provider (Anthropic, OpenAI, Gemini, or Groq) ### 1. Create the Slack app 1. Go to [api.slack.com/apps](https://api.slack.com/apps) โ†’ **Create New App** โ†’ From scratch 2. **Settings โ†’ Socket Mode**: enable it and generate an App-Level Token (`xapp-...`) with `connections:write` scope 3. **Event Subscriptions**: enable and subscribe to `app_mention` and `message.channels` 4. **OAuth & Permissions โ†’ Bot Token Scopes**: add `app_mentions:read`, `channels:history`, `channels:read`, `chat:write`, `reactions:write`, `users:read` 5. Install to workspace โ†’ copy the Bot Token (`xoxb-...`) ### 2. Install and configure ```bash # 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`: ```bash SLACK_BOT_TOKEN=xoxb-... SLACK_APP_TOKEN=xapp-... # Pick one LLM provider: LLM_MODEL=claude-sonnet-4-6 ANTHROPIC_API_KEY=sk-ant-... # or: LLM_MODEL=gpt-4o + OPENAI_API_KEY=sk-... # or: LLM_MODEL=gemini/gemini-2.0-flash + GEMINI_API_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. ```bash 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 ```bash tagopen ``` Then `@open-claude-tag` in your Slack channel. --- ## Channel Configuration Each channel gets a directory of plain Markdown files under `data/channels//`. 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 ```markdown # 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 `memory_append` and `memory_replace` tools. Memory stays clean because the agent curates it, not a dumb append-only log. Example of what accumulates over time: ```markdown # 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 ```toml # Per-channel LLM override (optional) [llm] model = "gpt-4o" # MCP servers allowed in this channel [[mcp_server]] name = "github" url = "mcp://localhost:3001" allowed_tools = ["list_prs", "get_file", "create_comment", "trigger_workflow"] [[mcp_server]] name = "linear" url = "mcp://localhost:3002" allowed_tools = ["list_issues", "create_issue", "update_status"] ``` ### 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: ```markdown --- 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 1. Check CI is passing on the branch (github:list_prs) 2. Confirm with the requester before triggering 3. Trigger `deploy-staging` workflow (github:trigger_workflow) 4. 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](https://github.com/BerriAI/litellm) โ€” one interface for every provider. Set `LLM_MODEL` and the matching key: | Provider | `LLM_MODEL` | Key env var | |---|---|---| | Anthropic Claude (default) | `claude-sonnet-4-6` | `ANTHROPIC_API_KEY` | | Anthropic Claude Opus | `claude-opus-4-8` | `ANTHROPIC_API_KEY` | | Anthropic Claude Haiku | `claude-haiku-4-5-20251001` | `ANTHROPIC_API_KEY` | | OpenAI GPT-4o | `gpt-4o` | `OPENAI_API_KEY` | | OpenAI o3 | `o3` | `OPENAI_API_KEY` | | Google Gemini | `gemini/gemini-2.0-flash` | `GEMINI_API_KEY` | | Groq (fast open-weight) | `groq/llama-3.3-70b-versatile` | `GROQ_API_KEY` | | 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//tools.toml`: ```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) | | `search_channel_history` | 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 ```bash # 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: (workspace_id, channel_id) โ†’ 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// 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: `(workspace_id, channel_id)` โ†’ 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](PLAN.md) for full architecture decisions and research notes. --- ## Community - ๐Ÿ’ฌ **Discord** โ€” questions, feature requests, show-and-tell โ†’ [discord.gg/s7KW4fsqXK](https://discord.gg/s7KW4fsqXK) - ๐Ÿฆ **X / Twitter** โ€” updates and releases โ†’ [@matchaman11](https://x.com/matchaman11) - ๐Ÿ› **GitHub Issues** โ€” bug reports, feature requests โ†’ [Issues](https://github.com/Anil-matcha/open-claude-tag/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](https://github.com/Anil-matcha/open-claude-tag/issues) | ```bash 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](https://www.anthropic.com/news/introducing-claude-tag) | The closed-source product this repo is the open-source alternative to | | [OpenClaw](https://github.com/openclaw/openclaw) | Gateway architecture, workspace file pattern, multi-agent routing | | [Hermes Agent](https://github.com/nousresearch/hermes-agent) | Skill auto-creation pattern, agent-managed crons, SQLite + FTS5 | | [Letta (MemGPT)](https://github.com/letta-ai/letta) | Inner-loop memory curation, memory block tools | | [LiteLLM](https://github.com/BerriAI/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.*