arizuko › products › Slack team agent
One agent in a Slack channel, with channel-scoped persona and thread context but per-teammate memory, grants, and private web chat.
~/.claude/CLAUDE.md; the channel’s own
~/CLAUDE.md overrides and extends them — allowed
tools, citation rules, refusals, voice for this channel. #eng-support
behaves differently from #design from #incidents. The folder mounts at
/dav/<channel>/ over WebDAV — edit in Finder,
rclone, or any editor.
users/<channel>-<id>.md inside
the channel folder) — preferences, recurring tasks, prior
conclusions. Alice has hers, Bob has his. (Per-user
secrets — distinct from memory — are spec 9/11,
not yet shipped; folder-scoped secrets work today.)
eng/alice/) inherits from the channel
and overrides only what differs — tweak one skill, keep
everything else.
/chat/<token>/) — a browser chat against the
same agent. Take the conversation off Slack onto a phone or laptop
without losing context.
/dash/ for grants,
routing, scheduled tasks, admission queue, and per-channel health.
#eng-support · thread
alice @bot summarize the fix from the cold-start runbook for this thread
bot Bundle growth after deploy is coming from broad SDK imports.
Recommended: switch back to per-service imports.
source: /docs/runbooks/lambda-cold-start.md:67
bob @bot save that conclusion to my notes
bot Wrote notes/lambda-cold-start.md in your user area.
alice @bot remember: prefer per-service imports for any new lambda
bot Saved to your memory.
Same thread, same channel CLAUDE.md, different resolved
user state. The answer is visible to the team; Bob’s write lands
in Bob’s user area; Alice’s preference lands in her memory
file. Shared deliberation, user-scoped state. None of Bob’s notes
are visible to Alice; none of either user’s memory leaks into the
channel’s shared context.
@bot mentions fire a turn. With the recommended
routing rule (see setup), channel chatter lands in
#observe — agent reads for context but
doesn’t reply unless called on.
/srv/data/arizuko_<name>/. Backup is one
tar of the directory; no DB dump.
secrets table (plaintext at rest;
operator trusts disk + FS perms). Folder-scoped values are merged into
the container's spawn env; Slack channels get folder secrets only
(per-user overlay is 1:1-chat only).
/auth/login with GitHub or Google
links that identity to their Slack user. Memory and grants
then survive across surfaces: the same person reaches the
same notes from the web chat, from a DM, or from a different
channel.
arizuko user-secret CLI exists today, but the
full broker model (per-tool, audit-logged) is not yet shipped.
For now, secrets are folder-scoped.
Most of this maps to Discord 1:1 — guild channels behave like
Slack channels (room JID, per-channel CLAUDE.md,
per-user memory), threads behave like Slack threads. Three
deltas worth flagging:
discd). DM + mention flow works
the same.
<@USERID> in body; Discord uses
<@123…>. Both are normalized to
@<assistant-name> before reaching the agent.
slack:T1234/channel/C5678. Discord:
discord:guild/channel. Same grant primitive,
different namespace.
Run the same product over both: install both adapters, route each channel to the same folder, agent doesn't care.
arizuko create acme
cd /srv/data/arizuko_acme
$EDITOR .env # set Slack/Discord/Telegram tokens; enable the adapters you want
arizuko run acme
# in Slack:
# create the Slack App, set bot token + signing secret in .env
# subscribe events to https://<your-host>/slack/events
# invite the bot to a channel; teammates sign in via OAuth at /auth/login
# linked identities resolve to the same user record; per-user state goes live
Full step-by-step is in the
operator setup guide;
the Slack adapter how-to covers
Slack-specific quirks. Per-channel CLAUDE.md override
lives in the channel folder; edit via WebDAV or directly on the
server.