Repository navigation
Four CLIs, nothing ages out, and it runs on any laptop that has any one of them.
OpenCode (new source)
- Mirror adapter — OpenCode's SQLite DB is read read-only and projected to one JSONL per root session (sub-agents embedded, cost rolled up). The binary is never invoked on the indexing path; the mirror doubles as the backup.
- Live — the watcher re-syncs on DB/WAL writes; the opt-in plugin (
./install.sh --opencode-plugin) indexes a session the moment a turn settles. - Loss protection — a session deleted in OpenCode is archived to the raw vault before its mirror file goes; spilled tool outputs are inlined before OpenCode purges them; weekly
VACUUM INTODB snapshots. - Restore into OpenCode — a deleted session goes back through
opencode importwith its directory and parent links intact. - Enrichment through OpenCode — the
opencode-headlessprovider runs the summariser viaopencode run, selectable per machine;[enrichment].provider = "auto"picks whichever summariser CLI is on PATH.
Archived sessions and Restore
- Rows are never deleted. When a transcript ages out (Claude Code's
cleanupPeriodDays,opencode session delete, a manualrm) the session keeps its title, summary, cost and reasoning trail and moves to the new Archived tab. Usage stats, search, digests and the MCP server still count it. - ♻ Restore brings a session back from the raw vault, per row, only where it will actually succeed.
scripts/restore-session.py --all --applyfor a machine that already lost sessions. archived_reasonseparates real sessions from subagent sidechain noise. Sidechains no longer create rows at all — 93% of one registry was emptyagent-*rows.
Codex tracked again
- Paginated rollouts (
item_completed), zstd-compressed rollouts (.jsonl.zst) andarchived_sessions/are all indexed, archived and restored. An unknown dialect indexes with 0 turns and warns instead of vanishing silently. - Pricing uses the rollout's real model — every Codex session had been billed as
gpt-5.
Any laptop, any subset of CLIs
- Source availability means transcripts on disk, not the binary;
config.tomlis layered overconfig.toml.example;CLAUDE_CONFIG_DIR/CODEX_HOME/XDG_DATA_HOME/OPENCODE_DBare followed and baked into the background jobs. - Linux —
install.shrenders and enables systemd--userunits (watcher + nightly timer) from the same template as the launchd plists;--no-scheduler. - The nightly pipeline degrades cleanly: embeddings skip without the model, enrichment skips without a summariser, and a real failure exits non-zero instead of "Enriched 0/4".
tests/test_portability.pyboots one-CLI laptops with stub binaries; CI runs Ubuntu and macOS × Python 3.11/3.12.
Correct costs
pricing.jsonre-tiered per model generation (Opus 4.5+/5, Sonnet 5, Haiku 4.5, gpt-5.2…5.5, Fable/Mythos). Every Opus session had been priced at the retired Opus 4.1 rate, 3× too high. An unknown model is loud and never overwrites a stored cost.
Honest UI and MCP
- Resume and Bridge refuse for a CLI not installed on this machine; Restore is offered per row; truncated lists are marked; stats windows no longer leak the cutoff day; the heatmap follows the theme;
sbanddoctorread[ui].port. - Redaction extended (
hf_,glpat-,pypi-, Slack webhook URLs) at every egress.
Docs
- README, SETUP, ARCHITECTURE and ADDING-A-CLI rewritten for the current feature set; screenshots and the GIF tour regenerated from
sb demo, which now seeds archived sessions and accepts--port N.
Upgrading: no breaking changes for an existing install — git pull && ./install.sh (idempotent — migrates the schema, re-renders the launchd/systemd jobs with your CLI home variables, rebuilds a venv older than Python 3.11, and re-prices every session on the first refresh). Then scripts/restore-session.py --all shows which aged-out sessions can come back, and raise cleanupPeriodDays in ~/.claude/settings.json on every machine.