JIVA
One terminal, many souls — a self-healing fleet of Claude Code sessions on a private tmux server, with a desk, a boss, workers and a bash watchdog.
JIVA keeps a small fleet of Claude Code sessions alive in a private tmux server. A desk talks to you, a boss splits the work, and workers do it. A plain bash watchdog checks every session every five seconds and swaps any of them for a fresh one before it gets past 200k tokens of context. Sessions coordinate through a handful of verbs (claim, report, ask, ship, handoff, inbox) and one append-only board, so you keep one window open and questions reach you there while the rest of the fleet stays out of your way.
- Bash
- tmux
- jq
- just
- Python
- JavaScript
- Claude Code
- ShellCheck
- Apache
JIVA runs a small fleet of Claude Code sessions on a private tmux server, one per repo, and never touches your own tmux. Three roles: a desk that is the only session that talks to you, a boss that splits work into task cards of 20 lines or fewer, and workers that claim paths, do the work and ship it.
The watchdog
A plain bash loop checks every session every five seconds. A pane
that dies is respawned with the same role and name, and it re-reads
its boot payload. A session approaching 200k tokens of context
writes a handoff of 40 lines or fewer and is swapped for a fresh
body before the context degrades. jiva doctor live
proves it by sending kill -9 to a pane and timing the
recovery.
How sessions coordinate
claim: directory-level path claims with no overlaps, taken before any edit.ask/answer: typed questions for the desk (decision, permission, deploy, spend), each with options and a default.ship: commits only the claimed paths and pushes under a lock.report,handoff,inbox: one append-only board instead of sessions typing into each other.
Budgets as tests
just check fails the build when a file passes 150
lines, a note passes 30, a script fails to parse or ShellCheck
complains, and when the README's verb table drifts from
jiva help. Workers have a soft cap of six and a hard
cap of twelve. JIVA never auto-accepts Claude Code's workspace
trust dialog; you accept it yourself, once per repo. There is a
local dashboard on a random loopback port, and the public site
ships under a strict Content-Security-Policy with no third-party
scripts.
Straight from the source
The project's own README.
Rendered in place — every link, image, and code block carried over from the repo. The page below is what a contributor would see opening the project for the first time.
JIVA — one terminal, many souls
JIVA keeps a small fleet of Claude Code sessions alive in a private tmux server. A desk talks to you, a boss splits the work, workers do it. A plain bash watchdog checks every session every 5 seconds and swaps any of them for a fresh one before it gets past 200k tokens of context.
You keep one window open. Questions reach you there. The rest of the fleet stays out of your way.
Site: https://jiva.meiuxmeiux.com · Status: private alpha, runs on your machine.
Install
You need git, tmux (tested on 3.4), jq, just and Claude Code. With access to the private repo:
git clone [email protected]:saintpetejackboy/jiva.git ~/jiva
export PATH="$HOME/jiva/bin:$PATH"
bin/jiva works from any repo (code comes from the checkout, state goes in that repo's .jiva/).
Inside the jiva checkout itself, just --list shows the same runtime as recipes (just up, just status,
just down) plus the verb wrappers just j-*.
60-second quickstart
Run from the repo you want the fleet to work on:
jiva init # .jiva/, gitignore, CLAUDE.md pointer
jiva up 2 # watchdog + boss + 2 workers on a private tmux server
jiva status # one-line fleet summary
jiva assign w1 card.md # give w1 a ≤20-line task card; it respawns and starts
jiva down # kill this repo's tmux server + dash (never your own tmux)
First jiva up in a new repo stops at Claude Code's workspace-trust dialog, once per repo. Attach with
tmux -L jiva-<repo> a and accept it yourself; JIVA never auto-accepts it. Workers: soft cap 6
(above it, JIVA_CONFIRM=1), hard cap 12. The full walk-through is docs/QUICKSTART.md.
Verbs
Generated from jiva help + just --list by scripts/readme-drift.py --table; just check fails if a
verb is missing here.
| verb | what it does |
|---|---|
jiva plugin [install|uninstall|status|mode] |
local plugin at user scope (plugin/install.sh); mode = hooks source |
jiva init |
make this repo fleet-ready (.jiva/, .gitignore, CLAUDE.md pointer if absent) |
jiva up [workers] |
watchdog + boss + N workers (default 2) |
jiva spawn <role> <name> |
start one session in its own window |
jiva respawn <name> |
kill the pane and boot a fresh body (same role/name, re-reads boot payload) |
jiva assign <w> <card> |
install a task card for worker <w>, respawn it, kick it off |
jiva restart-watchdog |
respawn the watchdog pane (picks up core/watchdog.sh edits; fleet untouched) |
jiva say <name> <text> |
type a line into a session |
jiva down |
stop everything (kills this target's tmux server + dash only) |
jiva status |
one-line fleet summary from .jiva/state.json |
jiva doctor [live|breakers|asks|perm|lease|plugin|watch|fault] |
budgets as tests; live kill -9 self-heal; others run only that set |
jiva dash [start|stop|url] |
tier-1 dashboard on 127.0.0.1:<random port> |
jiva watch |
one live terminal view: bar + open asks + last board lines (core/watch.sh) |
jiva mine [n] |
rank repeated Bash commands from this repo's transcripts (recipe candidates) |
jiva roster [gen|check|show] [pack] |
name/color/avatar pack tooling (scripts/roster.sh; default pack) |
jiva pick <paths…> |
best idle worker for these paths (affinity table; boss still chooses) |
jiva check |
files ≤150 lines, notes ≤30, scripts parse, shellcheck (run in the target) |
jiva spike |
re-test version-sensitive assumptions on scratch socket jiva-spike |
jiva claim |
claim paths before editing (directory-level, no overlaps) |
jiva report |
report done/blocked/note "<msg>" (done runs core/check.sh) |
jiva ask |
typed ask for the desk: question, options, default, class (decision/permission/deploy/spend/…) |
jiva answer |
answer an open ask (no text = its default); the asker gets "JIVA answer <id>: <text>" |
jiva ship |
commit claimed paths only and push under a lock |
jiva handoff |
save a ≤40-line handoff from stdin or a file, then stop (watchdog respawns you) |
jiva inbox |
recent board + open desk asks |
jiva pending |
sessions stuck at a native prompt and where to answer them |
jiva help |
this list. Workers: soft cap 6 (JIVA_CONFIRM=1 above it), hard cap 12. |
Sessions coordinate through six of these — claim, report, ask, ship, handoff, inbox —
plus one append-only board. The desk has two more: answer and pending.
Docs
- docs/QUICKSTART.md — step by step for a second repo.
- docs/DEPLOY.md — human-only site deploy runbook.
- notes/ — durable facts per area (core, plugin, site, perms, breakers, …), ≤30 lines each.
docs/PLAN.md(core runtime) anddocs/KICKOFF.md(original brief) are on-demand history.
Checks
just check runs the budgets as tests (files ≤150 lines, notes ≤30, scripts parse, shellcheck) and this
README's drift test. just doctor checks boot payload, handoffs, hooks and state; just site-check the site.
Build something like this
Want a tool like this for your shop?
We've shipped this kind of thing before. Twenty-minute intro call, no slides.