Repository navigation
Releases: mpankaj151/session-browser
Release list
v2.0.0 — OpenCode, archived sessions, any laptop
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.
v1.1.0 — automatic work journal
Every session now journals itself — and any window of your history becomes a report.
Work journal (new)
- Journal-grade enrichment — the nightly one-liner becomes a full journal per session: accomplishments, key decisions with rationale, explorations set aside, open threads, and a reusability note. Stored in
sessions.*,session_snapshots, and a rendered markdown journal artifact. - SessionEnd hook — sessions are journaled the moment they end (detached, never blocks shutdown). Stop keeps its instant-indexing role; a re-fire with no new activity costs nothing.
- Resumed sessions re-enrich incrementally — prior journal + only the new turns, so updates never re-pay for the whole transcript.
- Daily digest —
daily-logs/YYYY-MM-DD.mdassembled deterministically per local day (no LLM cost), self-healing for missed or stale days; final step of every refresh. - work-journal skill — linked into
~/.claude/skillsat install. Ask Claude "what did I do last week", "monthly summary", or "draft my self-assessment for the last quarter" → paste-ready Markdown + a self-contained HTML timeline, generated from the journal, never by re-reading transcripts. Personal report framing via[reports].style_override.
Fixes & defaults
- Codex sessions were silently never enriched (transcript lookup missed
rollout-*.jsonlnaming) — fixed viaadapter.session_id_for_path. - Enrichment now pins
claude-sonnet-5by default (predictable cost on API billing;[enrichment.claude_headless] modelto change,""for CLI default). install.shregisters Stop + SessionEnd hooks and symlinks shipped skills;uninstall.shreverses both.
Upgrading: git pull && ./install.sh (idempotent — registers the new hook and skill links). One-time journal of existing history: sb refresh --enrich.
v1.0.2 — cold-machine install fixes
Patch release — three more first-run fixes from real cold-machine installs (thanks again to our field tester 🙌). No feature changes.
Fixed
- Embedding model download failed on machines without a warm cache — even when explicitly authorized.
semsearchsetHF_HUB_OFFLINE/TRANSFORMERS_OFFLINEat import;huggingface_hubfreezes those into module constants on first use, so the authorized download retry was a permanent no-op ("outgoing traffic has been disabled"). The offline-first guarantee now uses thelocal_files_only=Truekwarg instead of env vars — same privacy promise, no frozen global state — andembed-sessions.pyprints a 3-line actionable message instead of a 100-line traceback when the model is genuinely unreachable. New regression test runs against an emptyHF_HOME. sb doctorcould hang forever at the UI probe: thecurlhad no deadline, and a wedged/suspended process holding port 7655 accepts the TCP connect but never answers. The probe now has a 3-second timeout and distinguishes "UI not running" from "port held by a non-answering process —sb stop, thensb ui".sb uion a busy port died with a bareexit 1. It now checks the port first and tells you the UI may already be running (and how to restart) instead of silently spawning a doomed process. Existing installs: re-run./bin/install-cr.shto pick up the new function.- Post-install "what now?" moment:
install.shnow ends with an unmissable next-steps block (./bin/install-cr.sh→source ~/.zshrc→sb ui/sb demo/sb doctor), matchingbootstrap.sh— and mentioning theinstall-cr.shstep manual-clone users need beforesbexists.
Full changelog: v1.0.1...v1.0.2
v1.0.1 — first-run & recovery fixes
Patch release — first-run and recovery fixes from launch-week field reports. No feature or behavior changes beyond the installers.
Fixed
- Install failed on stock Macs with
!! python3 >= 3.11 required(reported by our first field tester 🎉). macOS resolvespython3to the Xcode CLT build (often 3.9) even when a modern Python is installed. Bothinstall.shandbootstrap.shnow hunt forpython3.13/python3.12/python3.11before settling forpython3, and the error — when it does fire — prints the version found plus the exactbrew/aptcommand to fix it. The README Quick start now states the prerequisite above the one-liner. - Moving the repo directory broke the install unrecoverably. Both installers checked for the presence of their artifacts (Stop hook,
cr/sbrc blocks) rather than their correctness, so re-running them didn't repair stale absolute paths. They now repoint stale entries — foreign hooks and unmanaged rc content preserved — making the documented recovery (./install.sh && ./bin/install-cr.shfrom the new location) actually work. Covered by new regression tests that simulate the move under an isolatedHOME.
Docs
- New README section on AI summaries/topics: enriching your existing history is opt-in (
sb refresh --enrich) since it spends your plan's quota; new sessions are summarized automatically by the nightly job (only summary-less sessions are ever sent). docs/SETUP.md: install flags are now a table with explanations.
Full changelog: v1.0.0...v1.0.1
v1.0.0 — Session Browser
First stable release — one local, private home for every AI coding session across Claude Code, GitHub Copilot CLI, and Codex.
Highlights
- Unified session index — every session from
~/.claude,~/.copilot, and~/.codexin one searchable place, updated live by a file watcher. - Search three ways — keyword, semantic (vector), and FTS5 full-text over the actual conversations.
- Usage dashboard — GitHub-style activity heatmap, per-day/model/project/CLI token + cost breakdowns, and the headline: what this month's work would have cost at public API list prices on your flat-rate plan. Also in the terminal:
sb stats. - Resume from anywhere —
cr <session_id>resumes any session in the current directory, not just where it started. - Cross-CLI bridge — hand a session off Claude ⇄ Copilot ⇄ Codex with a context primer.
- Reasoning trails — a readable decision trail for each session.
- MCP server — your session history as tools inside Claude Code itself.
- Demo mode —
sb demoseeds synthetic sessions so you can see everything in 30 seconds with zero real data.
Privacy by design
Everything runs and stays on your machine: SQLite + Flask + vanilla JS. No cloud calls, no telemetry, works fully offline. A single redaction chokepoint masks API keys, tokens, Authorization headers, and URL credentials in every egress — copy/export/bridge primers, the search index, reasoning trails, LLM enrichment prompts, and MCP tool results. The web UI binds to loopback with Host-header and CSRF protection.
Install
curl -fsSL https://raw.githubusercontent.com/mpankaj151/session-browser/main/bootstrap.sh | bashSB_INSTALL_ARGS=--lite skips the ~2 GB semantic-search ML stack (keyword + full-text search still work).
Quality
- 20-test suite (redaction shapes, monotonic upserts, timestamp normalization, XSS escaping, shell-heredoc compilation) running on a ubuntu/macos × Python 3.11/3.12 CI matrix.
- Two full adversarial review rounds — ~60 findings found, verified, and fixed before this release.
