{"id":51229830,"url":"https://github.com/anil-matcha/open-claude-tag","last_synced_at":"2026-06-28T15:02:05.713Z","repository":{"id":162673563,"uuid":"637158104","full_name":"Anil-matcha/open-claude-tag","owner":"Anil-matcha","description":"Self-hostable channel-native AI teammate for Slack. Open source alternative to Claude Tag. LLM-agnostic.","archived":false,"fork":false,"pushed_at":"2026-06-25T15:33:04.000Z","size":363,"stargazers_count":815,"open_issues_count":0,"forks_count":176,"subscribers_count":16,"default_branch":"main","last_synced_at":"2026-06-25T17:15:00.966Z","etag":null,"topics":["ai-agent","ai-teammate","ambient-agent","anthropic","autonomous-agent","channel-ai","claude-tag","gemini","litellm","llm","mcp","multi-model","open-source","openai","persistent-memory","python","self-hosted","slack","slack-bot","sqlite"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Anil-matcha.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-05-06T17:27:54.000Z","updated_at":"2026-06-25T15:34:02.000Z","dependencies_parsed_at":null,"dependency_job_id":"f5a9077a-aee6-438a-9f08-942a66847c28","html_url":"https://github.com/Anil-matcha/open-claude-tag","commit_stats":{"total_commits":17,"total_committers":3,"mean_commits":5.666666666666667,"dds":0.3529411764705882,"last_synced_commit":"43ff3b3b97d4f3f0d3740b0da5f8e4857ba4316a"},"previous_names":["anil-matcha/chatbase","anil-matcha/chatbase-alternative","anil-matcha/website-to-chatbot","anil-matcha/open-lovart","anil-matcha/open-ai-design-agent"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Anil-matcha/open-claude-tag","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Anil-matcha%2Fopen-claude-tag","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Anil-matcha%2Fopen-claude-tag/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Anil-matcha%2Fopen-claude-tag/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Anil-matcha%2Fopen-claude-tag/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Anil-matcha","download_url":"https://codeload.github.com/Anil-matcha/open-claude-tag/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Anil-matcha%2Fopen-claude-tag/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34892547,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","ai-teammate","ambient-agent","anthropic","autonomous-agent","channel-ai","claude-tag","gemini","litellm","llm","mcp","multi-model","open-source","openai","persistent-memory","python","self-hosted","slack","slack-bot","sqlite"],"created_at":"2026-06-28T15:02:04.927Z","updated_at":"2026-06-28T15:02:05.707Z","avatar_url":"https://github.com/Anil-matcha.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eOpen Claude Tag — The open-source Claude Tag alternative\u003c/h1\u003e\n\n\u003e 🔥 **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.\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/Anil-matcha/open-claude-tag/blob/main/LICENSE\"\u003e\u003cimg alt=\"license\" src=\"https://img.shields.io/badge/license-MIT-blue.svg?style=flat\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.python.org/\"\u003e\u003cimg alt=\"python\" src=\"https://img.shields.io/badge/python-3.11%2B-blue?style=flat\u0026logo=python\u0026logoColor=white\" /\u003e\u003c/a\u003e\n  \u003cimg alt=\"llm-agnostic\" src=\"https://img.shields.io/badge/LLM-agnostic-6366f1?style=flat\" /\u003e\n  \u003cimg alt=\"mcp-native\" src=\"https://img.shields.io/badge/MCP-native-10b981?style=flat\" /\u003e\n  \u003ca href=\"https://discord.gg/s7KW4fsqXK\"\u003e\u003cimg alt=\"discord\" src=\"https://img.shields.io/badge/discord-join-5865F2?style=flat\u0026logo=discord\u0026logoColor=white\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#quickstart\"\u003eQuickstart\u003c/a\u003e ·\n  \u003ca href=\"#how-it-works\"\u003eHow it works\u003c/a\u003e ·\n  \u003ca href=\"#channel-configuration\"\u003eChannel config\u003c/a\u003e ·\n  \u003ca href=\"#supported-llms\"\u003eLLMs\u003c/a\u003e ·\n  \u003ca href=\"#roadmap\"\u003eRoadmap\u003c/a\u003e ·\n  \u003ca href=\"https://discord.gg/s7KW4fsqXK\"\u003eDiscord\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n**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.\n\n\u003e 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.\n\n**Community:** Join [Reddit](https://reddit.com/r/muapi) \u0026 [Discord](https://discord.gg/s7KW4fsqXK) for discussions and support.\n**Follow** the [creator](https://x.com/matchaman11) for updates.\n\n### Related projects\n\n\u003e **Open-source AI design agent — alternative to Lovart AI, Runway Agent, Luma Labs Agent** → https://github.com/Anil-matcha/Open-AI-Design-Agent\n\n\u003e **Open-source multi-modal chatbot and Poe alternative** → https://github.com/Anil-matcha/Open-Poe-AI\n\n\u003e **Open-source AI voice agent for sales calls and customer support** → https://github.com/Anil-matcha/AI-Voice-Agent\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/Anil-matcha/awesome-generative-ai-apps\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Part%20of-Awesome%20Generative%20AI%20Apps-FFD700?style=for-the-badge\u0026logo=github\u0026logoColor=black\" alt=\"Awesome Generative AI Apps\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003e 🤖 **[Explore 50+ more open-source AI apps →](https://github.com/Anil-matcha/awesome-generative-ai-apps)**\n\n---\n\n## Why Open Claude Tag\n\n\u003e **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.\n\nOpen Claude Tag is the open-source alternative. Same channel-native mental model, none of the lock-in:\n\n- 🏢 **Channel-scoped, not user-scoped.** One agent per channel, shared by the whole team. All users see the same context, pick up mid-thread.\n- 🤖 **LLM-agnostic.** Use Claude, GPT-4o, Gemini, Groq, or local Ollama. Swap with one env var. Different channels can use different models.\n- 💾 **Agent-curated memory.** After each conversation, the agent decides what's worth keeping in `MEMORY.md`. No noisy append-only logs.\n- 🧠 **Skill auto-creation.** After complex multi-step tasks, the agent writes a `SKILL.md` capturing what it learned. Institutional knowledge accumulates automatically.\n- 🔔 **Ambient monitoring.** Configurable heartbeat: the agent proactively surfaces stale threads, approaching deadlines, and forgotten questions.\n- 🔌 **MCP-native tools.** Plug in any MCP server per channel. Admins control exactly what each channel's agent can access.\n- 📁 **File-based config.** Each channel is a directory of Markdown files. Version-controllable, auditable, no UI required.\n- 🔒 **Self-hostable.** Your Slack data stays on your infrastructure. No round-trips to Anthropic's cloud.\n\n### Comparison\n\n| | Claude Tag (Anthropic) | OpenClaw / Hermes | **Open Claude Tag** |\n|---|---|---|---|\n| Open source | ❌ | ✅ | **✅ MIT** |\n| Self-hostable | ❌ | ✅ | **✅** |\n| Channel-scoped shared agent | ✅ | ❌ (per-user) | **✅** |\n| Multi-user attribution | ✅ | ❌ | **✅** |\n| Agent-curated memory | ✅ | Append-only | **✅ Letta inner loop** |\n| Skill auto-creation | ❌ | ✅ (Hermes) | **✅** |\n| Ambient / proactive mode | ✅ | ❌ | **✅ heartbeat cron** |\n| LLM-agnostic | ❌ (Claude only) | ✅ | **✅ LiteLLM** |\n| MCP-native tools | ✅ | Partial | **✅** |\n| Per-channel model override | ❌ | ❌ | **✅** |\n| Per-channel tool scoping | ✅ | ❌ | **✅ tools.toml** |\n| Token budget controls | ✅ | ❌ | **✅ BUDGET.md** |\n| Discord / Teams support | ❌ (Slack only) | ✅ | Roadmap |\n| Pricing | Enterprise + Team plan | Free | **Free** |\n\n---\n\n## How it Works\n\n### The core inversion\n\nEvery 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.\n\n```\n[#engineering channel]\n\n@alice  Can you review the PR for the auth refactor?\n@agent  Sure. I pulled the PR — looks good overall, one concern:\n        the session expiry logic on line 42 doesn't handle clock skew.\n        @bob you mentioned this pattern in the DB migration last week —\n        does the same fix apply here?\n@bob    Yeah, add a 5s leeway. Same as auth/session.py:L88\n@agent  Got it. Adding to MEMORY.md: \"session expiry: always add 5s\n        leeway for clock skew (pattern from auth/session.py:L88)\"\n```\n\nEvery 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.\n\n### Agent loop\n\n```\nSlack @mention\n       │\n       ▼\n  Channel Router ──── (workspace_id + channel_id) → AgentSession\n       │                  ↑ serialized lock: no parallel writes to context\n       ▼\n  Context Assembler\n  ├── CHANNEL.md       (identity, purpose, tone)\n  ├── MEMORY.md        (agent-curated facts, always in context)\n  ├── skills/*.md      (auto-created playbooks, loaded on semantic match)\n  └── Last 50 messages (with @username attribution)\n       │\n       ▼\n  Agent Loop  (ReAct + tool-use via LiteLLM)\n  ├── Tool Registry  ← MCP servers defined in tools.toml\n  ├── Built-in tools ← web search, Python runner, channel search\n  └── Stream reply → Slack thread\n       │\n       ├── Memory curation turn  ← agent decides what to write to MEMORY.md\n       │   (Letta inner-loop: model gets one extra turn to curate)\n       │\n       └── Skill evaluator  ← ≥5 tool calls? write SKILL.md\n           (Hermes pattern: agent authors its own playbooks)\n       │\n       ▼\n  SQLite + FTS5  (per-workspace DB, channel-isolated, WAL mode)\n       │\n       ▼\n  Ambient Engine  (background — Phase 3)\n  ├── Per-channel APScheduler crons\n  ├── Heartbeat evaluator: \"anything worth surfacing?\"\n  └── Proactive Slack post if yes, SILENT if no\n```\n\n### Memory architecture\n\n```\nLayer 1 — Context window (always loaded)\n  CHANNEL.md + MEMORY.md + active SKILL.md files + last 50 messages\n\nLayer 2 — Session store (SQLite + FTS5, per workspace)\n  Full message history with user_id, timestamps, thread_ts\n  Full-text search: \"what did we decide about X last month?\"\n\nLayer 3 — Semantic recall (Mem0, Phase 2)\n  Embeddings over key decisions and facts\n  Namespace = channel_id (fully isolated per channel)\n\nLayer 4 — Skill library (per channel)\n  Auto-created after complex tasks (≥5 tool calls)\n  Loaded into context when task description matches\n  Curated weekly: stale after 30d, archived after 90d\n```\n\n### Ambient heartbeat\n\nThe 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`.\n\nThe agent can also create its own monitoring tasks via `schedule_task(cron, description)` — it decides what's worth checking and when.\n\n---\n\n## Quickstart\n\n### Prerequisites\n\n- Python 3.11+\n- A Slack app with Socket Mode enabled ([create one here](https://api.slack.com/apps))\n- An API key for your preferred LLM provider (Anthropic, OpenAI, Gemini, or Groq)\n\n### 1. Create the Slack app\n\n1. Go to [api.slack.com/apps](https://api.slack.com/apps) → **Create New App** → From scratch\n2. **Settings → Socket Mode**: enable it and generate an App-Level Token (`xapp-...`) with `connections:write` scope\n3. **Event Subscriptions**: enable and subscribe to `app_mention` and `message.channels`\n4. **OAuth \u0026 Permissions → Bot Token Scopes**: add `app_mentions:read`, `channels:history`, `channels:read`, `chat:write`, `reactions:write`, `users:read`\n5. Install to workspace → copy the Bot Token (`xoxb-...`)\n\n### 2. Install and configure\n\n```bash\n# Clone\ngit clone https://github.com/Anil-matcha/open-claude-tag\ncd open-claude-tag\n\n# Install\npip install -e .\n\n# Configure\ncp .env.example .env\n```\n\nEdit `.env`:\n\n```bash\nSLACK_BOT_TOKEN=xoxb-...\nSLACK_APP_TOKEN=xapp-...\n\n# Pick one LLM provider:\nLLM_MODEL=claude-sonnet-4-6\nANTHROPIC_API_KEY=sk-ant-...\n\n# or: LLM_MODEL=gpt-4o  +  OPENAI_API_KEY=sk-...\n# or: LLM_MODEL=gemini/gemini-2.0-flash  +  GEMINI_API_KEY=...\n# or: LLM_MODEL=ollama/llama3  (no key needed)\n```\n\n### 3. Configure your first channel\n\nGet your channel ID: in Slack, right-click channel name → **View channel details** → scroll to the bottom.\n\n```bash\nmkdir -p data/channels/C01234ABC\ncp channels/example/CHANNEL.md data/channels/C01234ABC/CHANNEL.md\n# Edit CHANNEL.md to describe your channel's purpose and team\n```\n\n### 4. Run\n\n```bash\ntagopen\n```\n\nThen `@open-claude-tag` in your Slack channel.\n\n---\n\n## Channel Configuration\n\nEach channel gets a directory of plain Markdown files under `data/channels/\u003cchannel_id\u003e/`. Version-controllable, human-readable, no database required.\n\n```\ndata/channels/C01234ABC/\n  CHANNEL.md      ← identity, purpose, tone\n  MEMORY.md       ← agent-maintained facts (auto-updated, don't edit manually)\n  tools.toml      ← MCP servers and per-channel LLM override\n  skills/         ← auto-created playbooks\n    deploy-to-staging.md\n    oncall-handoff.md\n    pr-review-checklist.md\n```\n\n### CHANNEL.md\n\n```markdown\n# Engineering Channel\n\nYou are the engineering team's AI teammate in #engineering.\n\n## Purpose\nHelp with deployments, code reviews, incident response, and architecture decisions.\n\n## Tone\nTechnical, direct, concise. Use code blocks. Ask before triggering deploys.\n\n## Team context\n- Stack: Python backend, React frontend, PostgreSQL, AWS\n- CI/CD via GitHub Actions\n- We do not deploy on Fridays\n```\n\n### MEMORY.md — agent-curated facts\n\nThe 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.\n\nExample of what accumulates over time:\n\n```markdown\n# Channel Memory\n\n- Session expiry: always add 5s leeway for clock skew (auth/session.py:L88)\n- We use squash-merge for all PRs — rebase main before merging\n- Alice: infra questions. Bob: auth layer.\n- Never restart worker pods on Fridays — cron runs at 11pm PT\n```\n\n### tools.toml — MCP servers and model override\n\n```toml\n# Per-channel LLM override (optional)\n[llm]\nmodel = \"gpt-4o\"\n\n# MCP servers allowed in this channel\n[[mcp_server]]\nname = \"github\"\nurl = \"mcp://localhost:3001\"\nallowed_tools = [\"list_prs\", \"get_file\", \"create_comment\", \"trigger_workflow\"]\n\n[[mcp_server]]\nname = \"linear\"\nurl = \"mcp://localhost:3002\"\nallowed_tools = [\"list_issues\", \"create_issue\", \"update_status\"]\n```\n\n### Skills — auto-created institutional knowledge\n\nAfter 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.\n\nExample auto-created skill:\n\n```markdown\n---\nname: deploy-to-staging\ndescription: Deploy a service to staging via GitHub Actions\ncreated: 2026-06-25\nuses: 3\nstatus: active\n---\n\n## When to use this\nWhen someone asks to deploy a service to staging.\n\n## Steps\n1. Check CI is passing on the branch (github:list_prs)\n2. Confirm with the requester before triggering\n3. Trigger `deploy-staging` workflow (github:trigger_workflow)\n4. Monitor the run for 2 minutes, post the staging URL\n\n## Known gotchas\n- No deploys on Fridays — check day of week first\n- `worker` service uses a separate `deploy-worker` workflow\n```\n\nSkills lifecycle: active → stale (30d unused) → archived (90d). A weekly curator pass merges overlapping skills and patches outdated ones.\n\n---\n\n## Supported LLMs\n\nUses [LiteLLM](https://github.com/BerriAI/litellm) — one interface for every provider. Set `LLM_MODEL` and the matching key:\n\n| Provider | `LLM_MODEL` | Key env var |\n|---|---|---|\n| Anthropic Claude (default) | `claude-sonnet-4-6` | `ANTHROPIC_API_KEY` |\n| Anthropic Claude Opus | `claude-opus-4-8` | `ANTHROPIC_API_KEY` |\n| Anthropic Claude Haiku | `claude-haiku-4-5-20251001` | `ANTHROPIC_API_KEY` |\n| OpenAI GPT-4o | `gpt-4o` | `OPENAI_API_KEY` |\n| OpenAI o3 | `o3` | `OPENAI_API_KEY` |\n| Google Gemini | `gemini/gemini-2.0-flash` | `GEMINI_API_KEY` |\n| Groq (fast open-weight) | `groq/llama-3.3-70b-versatile` | `GROQ_API_KEY` |\n| Local Ollama | `ollama/llama3` | *(none needed)* |\n\n**Per-channel model override** — run a lighter model in `#general`, a more powerful one in `#engineering`. Add to `data/channels/\u003cid\u003e/tools.toml`:\n\n```toml\n[llm]\nmodel = \"claude-opus-4-8\"\n```\n\n---\n\n## Built-in Tools\n\nAlways available in every channel — no configuration needed:\n\n| Tool | What it does |\n|---|---|\n| `web_search` | DuckDuckGo instant search — no API key required |\n| `run_python` | Execute Python snippets and return stdout (sandboxed) |\n| `search_channel_history` | Full-text search across this channel's message history |\n| `memory_append` | Append a fact to `MEMORY.md` |\n| `memory_replace` | Update an outdated fact in `MEMORY.md` |\n\nAdd any other tool by listing an MCP server in `tools.toml`. Any MCP-compatible server works — GitHub, Linear, Notion, Jira, Datadog, PagerDuty, Sentry, etc.\n\n---\n\n## Development\n\n```bash\n# Install with dev dependencies\npip install -e \".[dev]\"\n\n# Run tests\npytest\n\n# Lint\nruff check .\n\n# Type check\nmypy tagopen/\n```\n\n### Project structure\n\n```\ntagopen/\n  gateway/\n    app.py       ← Slack Bolt async app, @mention handler\n    router.py    ← channel router: (workspace_id, channel_id) → AgentSession\n  agent/\n    loop.py      ← ReAct agent loop, tool dispatch, memory + skill hooks\n    context.py   ← system prompt assembler (CHANNEL.md + MEMORY.md + skills)\n    skills.py    ← skill auto-creation after complex tasks\n  memory/\n    store.py     ← SQLite + FTS5 message store, channel-isolated\n    writer.py    ← inner loop: agent curates MEMORY.md\n  tools/\n    registry.py  ← per-channel tool registry, reads tools.toml\n    builtins.py  ← web search, Python runner, channel history search\n  ambient/\n    heartbeat.py ← proactive monitoring (Phase 3)\n  llm.py         ← LiteLLM wrapper: key injection, per-channel model resolve\n  config.py      ← settings from .env via pydantic-settings\n  cli.py         ← entry point: tagopen\nchannels/\n  example/       ← copy these to data/channels/\u003cid\u003e/ to get started\ntests/\n  unit/          ← channel isolation, SQLite store, router tests\nPLAN.md          ← full architecture and design decisions\n```\n\n---\n\n## Roadmap\n\n- [x] **Phase 1** — Channel-native reactive teammate\n  - [x] Slack Bolt async app, Socket Mode\n  - [x] Channel router: `(workspace_id, channel_id)` → shared `AgentSession`\n  - [x] Multi-user attribution in context window\n  - [x] ReAct agent loop via LiteLLM\n  - [x] SQLite + FTS5 per-channel message store\n  - [x] File-based channel config (CHANNEL.md, MEMORY.md, tools.toml)\n  - [x] Built-in tools: web search, Python runner, channel history search\n  - [x] Per-channel model override\n  - [x] Multi-provider: Anthropic, OpenAI, Gemini, Groq, Ollama\n- [ ] **Phase 2** — Memory + Skills\n  - [ ] Letta inner-loop memory curation (agent writes MEMORY.md)\n  - [ ] Skill auto-creation (≥5 tool calls → SKILL.md)\n  - [ ] Skill loader: semantic match to incoming task\n  - [ ] Skill curator: weekly prune, stale/archived lifecycle\n  - [ ] Mem0 semantic recall layer\n- [ ] **Phase 3** — Ambient mode\n  - [ ] Per-channel APScheduler heartbeat crons\n  - [ ] LLM heartbeat evaluator (SILENT or post)\n  - [ ] Stale thread detection\n  - [ ] `schedule_task` tool: agent creates its own monitoring crons\n  - [ ] Temporal for durable task orchestration\n- [ ] **Phase 4** — Governance + Admin UI\n  - [ ] Per-channel audit log (tokens spent, tools invoked)\n  - [ ] Hard token budget enforcement via BUDGET.md\n  - [ ] Next.js admin UI: channel config, tool access, budget view\n- [ ] **Phase 5** — Multi-platform\n  - [ ] Discord adapter\n  - [ ] Microsoft Teams adapter\n\nSee [PLAN.md](PLAN.md) for full architecture decisions and research notes.\n\n---\n\n## Community\n\n- 💬 **Discord** — questions, feature requests, show-and-tell → [discord.gg/s7KW4fsqXK](https://discord.gg/s7KW4fsqXK)\n- 🐦 **X / Twitter** — updates and releases → [@matchaman11](https://x.com/matchaman11)\n- 🐛 **GitHub Issues** — bug reports, feature requests → [Issues](https://github.com/Anil-matcha/open-claude-tag/issues)\n\n---\n\n## Contributing\n\nContributions welcome — especially:\n\n| Want to ship… | Where |\n|---|---|\n| A new built-in tool | `tagopen/tools/builtins.py` + schema in `BUILTIN_TOOLS` |\n| A new platform adapter (Discord, Teams) | `tagopen/gateway/` |\n| Memory improvements | `tagopen/memory/` |\n| Ambient mode (Phase 3) | `tagopen/ambient/heartbeat.py` |\n| Example channel configs | `channels/` |\n| Bug fixes | [Issues](https://github.com/Anil-matcha/open-claude-tag/issues) |\n\n```bash\ngit clone https://github.com/Anil-matcha/open-claude-tag\ncd open-claude-tag\npip install -e \".[dev]\"\npytest \u0026\u0026 ruff check .\n```\n\n---\n\n## Star history\n\n\u003ca href=\"https://star-history.com/#Anil-matcha/open-claude-tag\u0026Date\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=Anil-matcha/open-claude-tag\u0026type=Date\u0026theme=dark\" /\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=Anil-matcha/open-claude-tag\u0026type=Date\" /\u003e\n    \u003cimg alt=\"Star history\" src=\"https://api.star-history.com/svg?repos=Anil-matcha/open-claude-tag\u0026type=Date\" /\u003e\n  \u003c/picture\u003e\n\u003c/a\u003e\n\n---\n\n## References\n\n| Project | Role |\n|---|---|\n| [Claude Tag — Anthropic](https://www.anthropic.com/news/introducing-claude-tag) | The closed-source product this repo is the open-source alternative to |\n| [OpenClaw](https://github.com/openclaw/openclaw) | Gateway architecture, workspace file pattern, multi-agent routing |\n| [Hermes Agent](https://github.com/nousresearch/hermes-agent) | Skill auto-creation pattern, agent-managed crons, SQLite + FTS5 |\n| [Letta (MemGPT)](https://github.com/letta-ai/letta) | Inner-loop memory curation, memory block tools |\n| [LiteLLM](https://github.com/BerriAI/litellm) | Multi-provider LLM routing |\n\n---\n\n## License\n\nMIT — free to use, modify, and self-host.\n\n---\n\n*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.*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanil-matcha%2Fopen-claude-tag","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanil-matcha%2Fopen-claude-tag","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanil-matcha%2Fopen-claude-tag/lists"}