Changelog
All notable changes to ThreadHop are documented here. The format follows
Keep a Changelog, and versions
follow major.minor.patch.
[0.3.2] — 2026-05-07
Added
- Per-session digest bar pinned to the right of the transcript pane.
Surfaces the highlighted session's title, custom name, working
directory, recent activity, and turn count at a glance — no need
to open the transcript to see what a session is about. Refreshes
on highlight and on selection, and reads the same JSONL view the
transcript uses (
extract_digest) so what you see in the bar always matches what's about to render. - TUI grid widened from 2 columns to 3 to host the digest bar; the reply input now spans all three columns so the existing input experience is unchanged.
[0.3.1] — 2026-04-26
Fixed
- Sidebar and Kanban board now show the same set of sessions. Previously
with more than 50 sessions, the sidebar's global cap could slice
later-status buckets (
in_review,done,archived) off the bottom of the sorted list while the Kanban board still rendered them. The symptom: clicking a card on the board that wasn't in the sidebar did nothing —_on_kanban_dismissedwalks the sidebar'sListViewto drive selection and silently bailed when the session was missing. - Both views now read from a single
_visible_sessions()helper that appliesMAX_SESSIONSper status bucket (so each column gets its own budget) and honors the_show_archivedtoggle uniformly. Manual reorder (shift+j/shift+k) reuses the same helper so swap-with- neighbor matches what's on screen. _on_kanban_dismissednow flips_show_archivedon and rebuilds when an archived card is clicked from the board with the archived view hidden, so the navigation always lands instead of silently failing.
Notes
- Added
pyrightconfig.jsonso basedpyright/pyright can resolve third-party imports (textual,rich,watchdog,pydantic) from a local.venv/. Editor-only — runtime still uses PEP 723 inline metadata viauv run --script. Contributors who want red-squiggle- free editor support should runuv venv && uv pip install textual watchdog pydantic pytestonce after cloning.
[0.3.0] — 2026-04-26
Added
- TUI theme system with five vendored themes —
opencode,nord,gruvbox,catppuccin,tokyonight. Themes are JSON files loaded bythreadhop_core/tui/theme/loader.pyand registered as Textual themes at app startup. The default look-and-feel mirrors OpenCode's palette and message-surface treatment so transcripts feel at home next to a Claude Code terminal session. - TUI visual updates inspired by OpenCode — refreshed message
surfaces, role borders, status pills, sidebar density, and
contextual-footer styling. Behavior unchanged; the diff is in the
*.tcssstylesheets and message-widget rendering.
Changed
- Slash-command rendering in the transcript no longer stalls on long sessions. The indexer now streams parsed messages incrementally instead of loading the entire JSONL file before mounting the first widget, so the transcript paints quickly even on multi-megabyte sessions.
- Session-loading spinner clears as soon as the first batch of messages is mounted rather than waiting for the full parse.
Notes
- Internal repo refactor (no user-visible behavior change). The
monolithic
./threadhopscript (2500+ lines) and./tui.py(5900+ lines) have been split into a proper Python package atthreadhop_core/with submodules forcli/,cli/commands/,storage/,observation/,harness/,session/,config/, andtui/{widgets,screens,css,theme}/. The./threadhopentrypoint is now a ~27-line dispatcher that hands off tothreadhop_core.cli.dispatch.main.tui.pyat the repo root remains as a thin backward-compat shim. All 201 tests pass; CLI surface, DB schema, and observation pipeline are unchanged. - New
threadhop_core/harness/claude.pyadapter unifies the three near-identicalclaude -psubprocess call sites (observer,reflector,handoff) behind onerun_claude_p()entrypoint. Documented as ADR-028 indocs/DESIGN-DECISIONS.md; prepares the seam for futurecodex.py/gemini.pyadapters. RELEASE.mdrewritten as an agent-followable runbook with explicit pre-flight, version-decision, failure-mode, and recovery sections. CI workflows (validate.yml,release.yml) repointed at the newthreadhop_core/__init__.pyversion-of-truth so version detection survives the package refactor.
[0.2.1] — 2026-04-22
Added
threadhop copy [N|all]— copy the last N rendered turns (default1,allfor the whole session) of the current session to the macOS clipboard as markdown. Sidechains, tool calls, tool results, thinking blocks,<system-reminder>tags, and Claude Code harness wrappers (<bash-input>,<bash-stdout>,<bash-stderr>,<local-command-caveat>,<command-name>,<command-message>,<command-args>) are stripped so the paste reads as conversation. Usesindexer.parse_messages(include_tool_calls=False)— the same cleaning pipeline the TUI renders — so the output is deterministic and byte-reproducible across invocations. Prints only a one-line✓ copied N turns (≈W words) to clipboard.confirmation; the payload is never echoed to stdout (defeats the point of reducing context). Falls back to dumping to/tmp/threadhop/<sid>-copy-<ts>.mdand copying the path ifpbcopyis unavailable./threadhop:copy [N|all]plugin command — one-line bash passthrough intothreadhop copy, matching the existing/threadhop:tag//threadhop:bookmarkpattern. Auto-detects the host session via the same parent-process resolver the other plugin commands use.
Notes
- Python module is
copier.py, notcopy.py, to avoid losing the import race against stdlibcopy(pytest and anything transitive throughcopy.deepcopypreloadsys.modules['copy']). The CLI subcommand and plugin command are still spelledcopy.
[0.2.0] — 2026-04-22
Added
threadhop update [--to <ref>] [--check]— refresh the installed checkout in place. With no flags, runsgit fetch+git reset --hard origin/main.--to <ref>pins to a tag, branch, or SHA for rollback.--checkreports without pulling.threadhop changelog— print this file, paginated throughless -Rwhen stdout is a TTY. Falls back to fetchingraw.githubusercontent.com/.../main/CHANGELOG.mdon installs that predate the file.threadhop future— print the top five entries fromROADMAP.md.- 24-hour startup version check. The first CLI command of the day and
each TUI launch compares the installed
__version__against the latest GitHub release tag; if newer, the CLI prints a three-line stderr nudge and the TUI raises a transient toast. Suppressed inside Claude Code sessions (context gate), in pipelines (TTY gate), and whenTHREADHOP_NO_UPDATE_CHECKis set (env gate). CHANGELOG.md,ROADMAP.md,RELEASE.mdat the repo root.
Changed
- Plugin manifests (
.claude-plugin/marketplace.json,plugin/.claude-plugin/plugin.json) bumped to0.2.0to stay in lockstep with the CLI. SeeRELEASE.mdfor the release discipline.
[0.1.0] — 2026-04-20
Added
- Initial public release.
- Textual TUI over
~/.claude/projects/**/*.jsonlwith FTS5 search, bookmarks, status tags, archive toggle, message-range selection, and AI-generated session titles. - CLI subcommands (
tag,bookmark,todos,decisions,observations,conflicts,observe,handoff,config) with parent-process session auto-detection for use inside liveclaudechats. - Observer + reflector sidecars that append typed observations and cross-session decision conflicts per session (ADR-018 – ADR-020).
- Claude Code plugin with the
/threadhop:handoffskill plus/threadhop:observe,/threadhop:tag,/threadhop:bookmarkcommands. --versionflag, did-you-mean suggestions on unknown subcommands or enum values,curl | bashinstaller, plugin marketplace manifest.