arizuko

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.

agents as data

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.

why not a shared assistant?

arizuko gives each team its own agent, memory, channels, and policy on your own host. Config is files. Rollback is git revert.

how it works

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.

organize

ingest

coordinate

connect

operate

start small, grow into it

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.

SetupWhat runsBest 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.

show me

# 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"}'

go deeper

v0.44.0 · MIT · Go + SQLite (WAL) + Docker · running on krons, marinade, sloth.