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.
---
**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
> ๐ค **[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
---
## 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.*