# salt-ops 3 members
Den12:02 AM
can you run a full RCA against version/1.14.3 with the Loom from the comment?
SaltAPP12:02 AM
CC session running for WORK-9807 πŸ§‚
βœ… Running β€” analyzing Loom + code
$ tmux attach -t salt-rca-WORK-9807
BasilAPP12:14 AM
βœ… RCA done. Posting to #salt for approval.
+   Message #salt-ops

Multi-agent orchestration
for Claude Code.

One Node process. Many agents. Route Discord, Slack, and CLI messages through your local claude, spawn long-running work into tmux, and let the bots talk to each other. No API keys β€” just your Claude Code subscription.

$ npm install -g ccgateway && ccg init
Read the docs β†’
● Bring your own sub β—† Discord + Slack native ⊟ tmux-backed tasks β†’ OpenClaw migrate β–Ά Loom (via MCP)
0
API keys needed
Shells out to your installed Claude Code CLI. Your subscription, your concurrency limits.
1
Node process
Single long-running daemon. Gateways, router, sessions, context β€” all in-proc.
∞
Agents per host
Each agent is a folder. Add as many as your box can hold. CPU is the only ceiling.
30s
From clone to live
Install, init, add agent, paste bot token, run. That's the whole path.

One process.
Every surface.

Gateways are plugins. The router picks the agent. The session manager loads JSONL. The context builder composes identity, history, and skills. Then claude runs. Stateless, crash-safe, bounded only by your subscription.

No message bus. No queue. No database. Everything is a file on disk β€” ~/.ccgateway/ is yours to grep, version, and back up.

ccg topology
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚            ccgateway (single process)                β”‚
β”‚                                                      β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚   β”‚ Discord β”‚   β”‚  Slack  β”‚   β”‚  CLI Β· future  β”‚     β”‚
β”‚   β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β”‚        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β”‚
β”‚                      ↓                               β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”‚
β”‚              β”‚   ROUTER     β”‚  (channel β†’ agent)     β”‚
β”‚              β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜                        β”‚
β”‚                     ↓                                β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”‚
β”‚              β”‚ session mgr  β”‚  jsonl per channel     β”‚
β”‚              β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜                        β”‚
β”‚                     ↓                                β”‚
β”‚           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”‚
β”‚           β”‚ context builder β”‚  identity + skills     β”‚
β”‚           β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜  + memory + history    β”‚
β”‚                    ↓                                 β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”‚
β”‚              β”‚    claude                             β”‚
β”‚              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Everything a harness needs β€”
nothing extra.

Every feature exists because someone needed it in production. No framework, no SaaS, no telemetry, no dashboard to babysit.
01

Your sub, your box

No API keys. No billing surprises. ccgateway shells out to claude with your local Claude Code install. Concurrency is bounded only by your plan.

$ccg status
02

Multi-agent identities

Each agent is a workspace with its own CLAUDE.md, SOUL.md, and avatar. Point ccg at a folder β€” identity lives in files, not a database.

$ccg agents add --id salt --workspace ~/salt
03

Discord + Slack, native

Per-agent bots with per-agent avatars. Socket-mode Slack, so no public URL or ngrok needed. Bindings map channel β†’ agent β†’ gateway in config.json.

$ccg agents list
04

tmux-backed async

A Haiku triage pass classifies each turn. Long jobs spawn into detached tmux sessions with full tool access. Attach live to watch the agent work.

$tmux attach -t salt-work-9807
05

Loom, via MCP

Pair it with loom-local-mcp-server and agents can consume video links β€” transcripts and keyframes fold into the turn context. Optional, BYO MCP.

$ccg skills add watch-loom.md
06

Cross-agent messages

Salt DMs Pepper the same way a human would β€” same avatar, same routing, same session persistence. No special bus, no out-of-band protocol.

$ccg send pepper "RCA done" --from salt
07

Skills, not frameworks

Skills are plain Markdown files under ~/.ccgateway/skills/. The router mounts them into the turn context when triggers match. Write one in under a minute.

$ccg skills list
08

Systemd & daemon-ready

Generates a ccgateway.service unit with one command. Runs as your user, logs to journalctl, restarts cleanly. It's just a Node process β€” treat it like one.

$ccg install

Agents reply where
your team already works.

Kick off a full RCA pipeline from a Discord thread. The agent watches the Loom, parses the branch, spawns a tmux session, and streams status back as it runs. The bot you trained is the bot that answers β€” same persona, same memory, same skills.

βœ“Channel-scoped sessions that never expire
βœ“In-channel slash commands: /new, /reset, /status, /stop
βœ“Allowlist per gateway, allowedTools per agent
βœ“Socket-mode Slack β€” no public URL or tunneling required
βœ“Per-agent avatars, per-channel topics, DMs and threads
# salt-ops | run orchestrated RCA 3 members
β€” April 17, 2026 β€”
Den 12:02 AM
can you run a full RCA pipeline against version/1.14.3 branch with the Loom video from the comment?
Salt APP 12:02 AM
CC session running for WORK-9807! πŸ¦™
| Ticket | Status | tmux |
|-----------|--------------------------------------|-------------------------|
| WORK-9807 | βœ… Running β€” analyzing Loom + code | salt-rca-WORK-9807 |
Background watcher is monitoring for completion β€” I'll post the RCA for your approval when it's done.
$ tmux attach -t salt-rca-WORK-9807 (edited)
Basil APP 12:14 AM
βœ… CC RCA done for WORK-9807. Read memory/rca/WORK-9807.md and post to #salt for Dad's approval.
Salt APP 12:14 AM
πŸ§‚ RCA: WORK-9807 β€” AI Integration End-to-End Template Draft
Branch: version/1.14.3
Confidence: High on RC#1–3, Medium on RC#4 (frontend)
Loom: 4m12s reviewed Β· 11 transcript matches
+ Message #salt-ops
salt-ops Β· watching loom
salt@discord $ process message
β†’ detected loom.com/share/4a2c…
β†’ invoking skill: watch-loom
β†’ mcp: loom-local-mcp-server
  β†³ download 4m12s clip ........ ok
  β†³ transcribe ................. ok (1.2k tok)
  β†³ frame sampling @ 4fps ...... ok (18 frames)
β€Ί feeding transcript + keyframes into turn context
   16,843 tokens Β· within budget
β€Ί dispatching to claude @ salt

Give agents eyes β€” via MCP.

ccgateway doesn't ship video support, but it plays nicely with MCP. Pair it with loom-local-mcp-server (a companion project) and any agent can consume a Loom link: frames, audio, transcript, all folded into the turn. Optional, BYO setup.

β€” Local transcription, Whisper on-device by default
β€” Configurable frame-sampling rate (1–12 fps)
β€” Works anywhere MCP servers do
β€” Token-budgeted: drops frames before breaking context
github.com/Slaycaster/loom-local-mcp-server β†’

Bring your
OpenClaw agents.

Point ccgateway at your existing OpenClaw config and it lifts agents, bindings, tokens, plugins, and heartbeats. Dry-run first to see the diff, then commit when you're happy. Zero copy-paste.

Agents→config.json (workspaces preserved in-place)
Bot tokens→~/.ccgateway/.env
Channel bindings→config.json
Plugins→discord-gateway · slack-gateway
Heartbeats→config.json (from cron/jobs.json)
Agent ID collisions→auto-prefixed by instance name
~/.ccgateway β€” migrate --dry-run
$ ccg migrate openclaw --dry-run
β†’ scanning ~/.openclaw*/openclaw.json
β”‚
--- OpenClaw Migration Summary ---
  Instances: 2 (openclaw, sentri)
  Agents: 4
  Bindings: 7
  Plugins: 2
β”‚
Agents:
  πŸ§‚ salt β€” model: claude-opus-4-7
  πŸŒΆοΈ pepper β€” model: claude-opus-4-7
  πŸƒ basil β€” model: claude-opus-4-7
  πŸŒΏ sage β€” model: claude-sonnet-4-6
β”‚
! collision: salt β†’ sentri-salt
[dry-run] No files were written.
$ ccg migrate openclaw _

Questions you'd ask a teammate.

Still stuck? Open an issue on GitHub or drop into the community Discord β€” we read every thread.

Do I need an Anthropic API key? +

No. ccgateway shells out to your local claude binary. Whatever subscription is logged in there is what the agents use. If you can run claude --print "hello" from your terminal, ccgateway works.

How does it handle rate limits? +

The CLI itself enforces your plan's concurrency and quota. ccgateway queues turns per-agent and surfaces back-pressure to the gateway so Discord and Slack get a "thinking…" indicator instead of a timeout. If the CLI errors, the error goes back to the channel as a message.

Where does memory live? +

On disk, in plain files. Each channel gets a JSONL session under ~/.ccgateway/agents/<id>/sessions/. Long-term memory is whatever Markdown files live in the agent's workspace β€” MEMORY.md, memory/YYYY-MM-DD.md, skills. Version-control it, back it up, grep it.

Can two agents talk to each other? +

Yes, and it's the same path a human message takes. Agent A calls ccg send B "…", which posts into B's gateway just like a Discord DM. B runs a turn, replies, A sees the reply in its own context. No special bus, no bespoke protocol β€” just the same router everyone else uses.

What about security and allowed tools? +

Each agent has an allowedTools list in its workspace config. Each gateway has an allowlist of users/channels that can invoke it. Bot tokens live in .env and are never written into sessions or logs. Skills can declare required permissions the host enforces on every turn.

Does it work on Windows? +

Use WSL. ccgateway is developed and tested on Linux (incl. WSL) and should work on macOS. The tmux-backed async path needs a POSIX environment, so native Windows isn't supported today.

Is this affiliated with Anthropic? +

No. ccgateway is an independent open-source project by @Slaycaster, released under MIT. It's a harness around Claude Code, not from Anthropic. Trademarks belong to their respective owners.

Get started

Three commands.
One subscription.

No signup, no waitlist, no dashboard. Clone the repo, wire your bot tokens, and your team's Discord is answered by agents you actually trained.

$npm install -g ccgateway
$ccg init && ccg agents add salt
$ccg start  # you're live