Run persistent AI agents on your own host. Each folder is an agent
with its own persona, memory, skills, routes, and files. Agents and
operators use the same MCP tools and REST endpoints.
gated checks every call.
An agent is a folder of files the LLM loop reads. The persona is a
file. Memory is a file. Skills are directories. Config is a file you
can diff, review in a PR, and roll back with git revert.
The org chart is the folder tree.
Each folder is a context boundary: corp/sales
doesn’t see corp/eng/sre’s memory. Change
the persona by editing a file; the next session picks it up. Add a
skill by dropping a directory. Everything an agent knows or can do
is readable, inspectable, and replaceable.
Agents need structure the same way humans do — not bureaucracy, but enough to know what they can reach, what their job is, and who they answer to. Minimality and orthogonality provide that: one concept per primitive, nothing hidden, everything composable. A system simple enough for a human to reason about is simple enough for an agent to manage. That’s the design principle arizuko is built around.
arizuko gives each team its own agent, memory, channels, and policy
on your own host. Config is files. Rollback is git revert.
A folder is an agent: PERSONA.md, a skills/
set, memory files, and an ACL row. When a message arrives, a Docker
container starts for the folder and connects to gated
via MCP over a unix socket. Every tool call goes through that socket;
the host controls what the agent can reach. Every platform operation
is an MCP tool and a REST endpoint — no separate agent API.
All state is in SQLite WAL; the container is stateless.
The stack is sized for agent teams: dozens of messages a day, not
web-scale traffic. Go binaries, Docker Compose, SQLite WAL,
proxyd signing identity headers — no Auth0, no
Redis, no Vault.
corp/sales, corp/eng/sre,
corp/support — each a directory with a prompt
file, a memory file, and a skill set. Add a folder, get an agent.
PERSONA.md (voice and instructions), a
skills/ set, and memory that accumulates across weeks.
An agent that helped close a deal in January remembers it in March.
facts/. The next session, it already knows. No admin
step, no sync job.
delegate_group, escalate_group, and
observe_group are MCP tools built around the same
coordination protocols a human operator would use.
/hook/<token> from any external system —
the payload lands as a message in any folder. Pair with a scheduled
curation agent: no custom integration code, just a prompt and a cron.
slakd, AI assistant
pane), Reddit (reditd), X/Twitter (twitd),
LinkedIn (linkd).
/chat/<token>/ page
(SSE, works in a browser) and a /hook/<token>
endpoint (POST JSON, fires the agent). No extra config.
messages.db.
Routes match on key=glob. ACL is one row:
(principal, action, scope, params). Siblings see each
other’s observed messages unless the group is closed. Channels
speak HTTP. No hidden state elsewhere.
gated via a MCP unix socket bridged into the container.
Tool calls go through that socket; the host controls what the agent
can reach. Side effects are auditable, revocable, and scoped to the
folder’s grant rules.
/dash/ — routes
editor, task scheduler, per-group model selector (Opus /
Sonnet / Haiku), skill toggles, grants editor, invite
management, usage metrics, and secrets (AES-256-GCM encrypted at
rest). No editing .env by hand to rewire a route.
crackbox wraps each
container with a per-folder hostname allowlist, HTTPS via CONNECT,
and DNS filtering. The agent can only reach what you explicitly
permit. See crackbox.
A minimal deploy is gated and one channel adapter. Add
components as you need them — each is a standalone binary with its
own TOML block. There’s no managed control plane; every piece is
replaceable.
| Setup | What runs | Best for |
|---|---|---|
| Minimal | gated + one adapter |
First deployment, one team |
| Standard | + dashd + timed |
Ongoing ops, scheduled tasks |
| Multi-team | + onbod + crackbox |
Isolated teams, egress control |
| Product recipe | Pre-seeded config | slack-team, reality — 5 minutes |
One tar of /srv/data/arizuko_<name>/
backs up the entire instance: messages.db (WAL), group
folders, per-user memory, secrets, agent files.
# seed the instance directory
arizuko create demo
# /srv/data/arizuko_demo/ now has .env, store/, groups/, ipc/, web/pub/
# pick adapters + tokens
$EDITOR /srv/data/arizuko_demo/.env
# register the first group's inbound JID
arizuko group demo add tg:-123456789 main
# render docker-compose.yml from .env + extras, then bring it up
arizuko run demo
# systemd unit: arizuko_demo (sudo systemctl status arizuko_demo)
# talk to the default group from a browser
arizuko token issue demo chat # prints a /chat/<token>/ URL
# or from a script — same endpoint, JSON in / JSON out
curl -X POST https://example.com/chat/<token>/ \
-H 'Content-Type: application/json' \
-d '{"text":"hello"}'
gated, webd,
proxyd, dashd, onbod,
timed, plus the channel adapters.
v0.44.0 · MIT ·
Go + SQLite (WAL) + Docker · running on
krons, marinade, sloth.