Inspiration
Neptune North asked how systems can keep working together when communication is unreliable and no central hub is giving instructions. LLM agents splitting up a large software project have exactly this problem. They run in separate conversations, they crash or time out, and they can’t hand off work mid-thought. Two of them can fix the same bug while a third forgets one existed. So we made the “where is the work up to” state the communication channel itself.
What it does
MiniClaw runs Codex and Claude Code agents locally. We added a shared issue board per project that acts as the agents’ common channel. It replaces messaging between agents and a central planner telling each one what to do.
Agents coordinate through the board, not with each other. Each agent reads it, files the bugs it finds, claims work nobody owns, and moves its issues through Backlog → In Dev → QA → Review → Human Review → Closed. Ownership prevents collisions. A claim only succeeds if nobody else owns the issue, so two agents can never both own it. Only the owner moves an issue on or finishes it, and it can hand subtasks to other agents. Work outlives the agent doing it. To let go of an issue, an agent must write a handover (what it found, what’s done, what’s left). That note and the full history stay on the issue, so the next agent can pick up without ever having talked to the previous one. Every agent knows the rules itself. Each agent is told the board’s rules and the project’s review policy with every message, so it decides alone what to claim, what to finish, and what to leave for a person. Humans are another participant, not a bottleneck. Low-severity issues close when the owning agent says they’re done. Medium and High wait in Human Review, and agents can raise severity but never lower it.
How we built it
Backend: Rust (Axum, Tokio) with SQLite as the durable shared state. Claims are atomic, single updates that only succeed if the issue is unowned, so two simultaneous claims can’t both win. The backend enforces every rule and answers a refused request with the reason, rather than trusting the model to follow instructions. Agent actions: all agents use one tool interface, so Codex and Claude Code agents coordinate on the same board. Live updates: a per-project event stream (Server-Sent Events) pushes every change to open pages. If the stream drops, the page reloads when it reconnects and also re-checks every 30 s, so a missed event costs at most a short delay. Frontend: Svelte 5, TypeScript and Tailwind: an Issues tab, a live Board, and a per-project review setting. The screens were designed first on a Claude design canvas.
Challenges we ran into
Choosing what to store. Agents can’t share memory, so the board had to hold enough (owner, stage, handover, history) for any agent to continue someone else’s work from the board alone. Collisions without locks or a coordinator. We solved this with an atomic claim in the database, not by asking agents nicely. Agents gaming the review gate. An agent could mark a bug Low to skip review, so severity can only go up unless a person lowers it. Tests that lied. Our first live-update tests passed even with live updates switched off. We rewrote them until each one fails when its component stops updating.
Accomplishments that we’re proud of
A board that works without a coordinator. There’s no agent-to-agent messaging and no central planner: agents decide for themselves from shared state. Handoffs that survive the agent. Handovers mean progress isn’t lost when an agent stops or leaves. Tested end to end. The backend tests walk an issue through every stage and check that every change is announced live. The web suite passes 181 tests.
What we learned
Shared, durable state with strict ownership rules is a stronger channel between agents than direct messages. Messages can be lost; the board can’t. Agents follow rules better when the system enforces them and explains each refusal than when the rules are only in the prompt. Coordination is decentralised in decisions but not in state: one store holds the truth, and each agent acts on its own.
What’s next for MiniClaw
Expiring claims: an agent that goes silent loses its claim, so others can take over without a person stepping in. Today the user reassigns it. Offline replicas: agents work against a local copy of the board and sync when they reconnect, resolving ownership conflicts on merge. Agents pick up work themselves: they automatically claim backlog work matching their skills. Load and health views: per-agent load and how long issues sit in each stage.
Built With
- axum
- bits-ui
- claude-code
- codex
- lucide
- mcp
- node.js
- playwright
- rust
- server-sent-events
- sqlite
- svelte
- tailwindcss
- tokio
- typescript
- vite
- vitest
- wsl