arizuko is a multitenant Claude agent router. Channel adapters (telegram, discord, web, …) push messages over HTTP; the router routes each message to a per-group containerized Claude agent and streams the reply back.
One deployment, many groups, many channels. The agent in each group is a Claude Code CLI process — full tool use, MCP, skills, hooks.
/auth/login to reach dashboards and your chat./slink/<token> when an operator shares a link — no login required. The same endpoint is also a public HTTP API.web/pub/ directory.Two instance-wide env vars on the gateway let you run a group or a whole platform in shadow mode: the agent keeps producing turns, every outbound is persisted to the messages table, but nothing is forwarded to the channel adapter. Useful for dry-running a new persona, a routing change, or a fresh group before unmuting.
SEND_DISABLED_GROUPSSEND_DISABLED_GROUPS=atlas,research.SEND_DISABLED_CHANNELS: in a JID). Mutes outbound for an entire platform across all groups. Example: SEND_DISABLED_CHANNELS=discord.Behaviour:
messages with bot_msg=1, from_me=1, status=sent, routed_to=<chat_jid>. The agent sees send_reply / send_message return success — it does not know it was muted./dash/activity/ (sender is the folder name) and via the inspect_messages MCP tool. A dedicated per-folder audit view is not shipped today.Recipe — deploy a new Discord group in shadow mode:
# 1. enable the Discord adapter (DISCORD_TOKEN etc.) so messages flow inbound
# 2. add the mute knob to the instance .env
echo 'SEND_DISABLED_GROUPS=atlas' >> /srv/data/arizuko_<name>/.env
# 3. restart the instance so gateway picks up the new env
sudo systemctl restart arizuko_<name>
# 4. send a test message; confirm a row lands in messages without
# anything appearing in the Discord channel
sqlite3 /srv/data/arizuko_<name>/store/messages.db \
"SELECT id, sender, routed_to, status FROM messages \
WHERE bot_msg=1 ORDER BY timestamp DESC LIMIT 5;"
Source — gateway enforcement: gateway/gateway.go:821 (group mute), gateway/gateway.go:1141 (platform mute). Config parsing: core/config.go:140. Test that locks the behaviour: gateway/gateway_test.go:1052 (TestMakeOutputCallback_MutedGroup).
concepts — how arizuko thinks, primitive by primitive.