A collection of composable, Unix-philosophy tools for multi-agent orchestration. Built in Zig with dual-layer storage (JSONL + SQLite).
These tools decompose orchestration into focused primitives that each do one thing well. The goal is not to build a monolithic orchestration system, but to create tools that naturally compose into orchestration when needed.
┌─────────────────────────────────────────────────────────────┐
│ AGENT / PROMPT │
├─────────────────────────────────────────────────────────────┤
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ tix │ │ box │ │ vent │ │ hold │ │ mon │ │
│ │ tasks │ │messages│ │ events │ │ block │ │monitor │ │
│ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │
└─────────────────────────────────────────────────────────────┘
| Tool | Description | Repository |
|---|---|---|
| tix | Lightweight issue tracker with dependencies, priorities, tags, and full-text search | fielding/tix |
| box | Mailbox messaging system for agent-to-agent communication | fielding/box |
| vent | Event logging system for observability and debugging | fielding/vent |
| hold | Block until a shell condition is met | fielding/hold |
| mon | TUI for humans to monitor multi-agent orchestration | fielding/mon |
# Task tracking
tix add "Fix login bug" -p 1 -a alice -t bug
tix list --status open
# Agent messaging
box send orchestrator -s "Review complete" -m "Found 3 issues"
box inbox alice
# Event logging
vent emit orchestrator "phase transition" --data '{"from": "review", "to": "discussion"}'
vent tail --source opus
# Wait for conditions
hold "box inbox me --json | jq -e 'length > 0'"
hold --timeout 30s "curl -sf localhost:8080/health"
# Monitor everything
monhold "box inbox me --json | jq -e 'length > 0'"
msg_id=$(box inbox me --json | jq -r '.[0].id')
box read $msg_idtask_id=$(tix add "Implement feature" -a worker)
box send worker -s "New task" -m "Check tix ready"
hold "tix show $task_id --json | jq -e '.status == \"closed\"'"# Wait for all workers to check in
hold "box inbox orchestrator --json | jq -e 'length >= 3'"- JSONL: Append-only, git-friendly, source of truth
- SQLite: Fast queries, FTS5 full-text search
prefix-hash- Issues (tix) - e.g.,tix-a3f2b1msg_ULID- Messages (box) - 26-char ULID, sortableevt_ULID- Events (vent) - 26-char ULID, sortable
All tools support --json for machine-readable output, enabling composition with jq.
- Emergence over Design - Don't build infrastructure until patterns emerge from real usage
- Composition over Integration - Tools work together via stdin/stdout/exit codes
- Shell as Glue - Bash scripts orchestrate tools
- Exit Codes Matter - Enables
&&,||,hold,if - JSON for Machines -
--jsonflag for scripting - Files as State - JSONL is git-friendly, debuggable, recoverable
Each tool is built with Zig:
git clone https://github.com/fielding/tix && cd tix && zig build -Doptimize=ReleaseFast
git clone https://github.com/fielding/box && cd box && zig build -Doptimize=ReleaseFast
git clone https://github.com/fielding/vent && cd vent && zig build -Doptimize=ReleaseFast
git clone https://github.com/fielding/hold && cd hold && zig build -Doptimize=ReleaseFast
git clone https://github.com/fielding/mon && cd mon && zig build -Doptimize=ReleaseFastBinaries are placed in ./zig-out/bin/.
MIT