{"slug": "show-hn-hindcast-search-replay-and-resume-any-claude-code-session-on-mac", "title": "Show HN: Hindcast (search, replay, and resume any Claude Code session on Mac)", "summary": "Hindcast, a new Mac app by developer Karan B, indexes, searches, and replays every Claude Code session locally, reading transcripts from ~/.claude/projects/ without sending data off-device. As of August 2026, the developer's own archive contains 114 sessions across 65 projects, half a gigabyte of JSONL, and 17M output tokens, cold-indexed in about 4 seconds on an M3 Pro. The app offers full-text search, a scrubbable event tape, one-paste session resume, usage and cost tracking, and export to markdown or HTML, and is available via Homebrew or DMG for Apple Silicon.", "body_md": "**Every Claude Code session you've ever run. Indexed, searchable, scrubbable.**\n\nFind that session from three weeks ago, scrub through what the agent did,\nand resume it in your terminal with one paste. Local-first: it reads the\ntranscripts Claude Code already writes to `~/.claude/projects/`\n\n,\nand nothing leaves your Mac.\n\nMy own archive, as of August 2026: 114 sessions across 65 projects, half a gigabyte of JSONL, 17M output tokens, reaching back to April. Hindcast cold-indexes all of it in about 4 seconds on an M3 Pro, then keeps the index fresh as new sessions land.\n\n## hindcast-explainer.mp4\n\n```\nbrew tap karanb192/tap\nbrew trust karanb192/tap\nbrew install --cask hindcast\nbrew install ripgrep    # search engine; without it ⌘K matches titles only\nxattr -rd com.apple.quarantine /Applications/Hindcast.app\n```\n\nApple Silicon only for now. The `xattr`\n\nstep is needed because the app isn't\nnotarized yet (Developer ID enrollment in progress); it disappears in an\nupcoming signed release. Prefer a download? Grab the DMG from\n[Releases](https://github.com/karanb192/hindcast/releases).\n\nOne thing worth doing today: Claude Code prunes transcripts by file age,\n`cleanupPeriodDays`\n\nin `~/.claude/settings.json`\n\n, default 30 days. Hindcast\ncan only index what still exists. Mine is set to 60, which is why the archive\nabove still reaches April: those sessions kept getting resumed, so their\nfiles stayed young. Raise yours before the pruner gets to your history.\n\n**⌘K search across everything**: full text over every transcript, tool output included. Opening a result jumps the tape straight to the matched event.** The tape**: every event drawn as a tick (brass = you, ivory/ink = Claude, violet = thinking, teal = tools, brick = errors). Click or drag to scrub; the playhead follows your scroll.**Resume from the archive**: every session header has a`resume`\n\nchip that copies`cd -- <project dir> && claude --resume <session id>`\n\n, ready to paste into a terminal. The command is a template you can edit in place, so shell aliases work (`cd {cwd} && ccr {sessionId}`\n\nif that's your thing).**The Ledger**: a[ccusage](https://github.com/ryoppippi/ccusage)-style usage and cost view: per-day / per-week / per-month tables with per-model breakdowns, estimated dollar cost at published API rates, and a last-7-days figure.**Instant filtering**: type-to-filter the session list by title with zero keystroke lag, plus date presets, a custom range, and a model multi-select. Filters drive both the list and the Archive stats.**Export**: any session to markdown or self-contained HTML (active branch, images inlined), into`~/Downloads/Hindcast Exports`\n\n.**Subagent reels**: sessions list their subagent transcripts, including workflow-nested ones under`subagents/workflows/wf_*/`\n\n; each opens as its own tape with a back link.**Dark, light, and auto themes**, persisted so the window paints the right color from the first frame.\n\nRequires Node 18+:\n\n```\ngit clone https://github.com/karanb192/hindcast.git\ncd hindcast\nnpm install\nnpm start\n```\n\nIf Electron's binary fails to download during install (npm script protection),\nrun `node node_modules/electron/install.js`\n\nonce, then `npm start`\n\n.\n\nTo install it as a proper app, `npm run pack`\n\nbuilds `Hindcast.app`\n\ninto\n`dist/mac-arm64/`\n\n; drag it to /Applications.\n\n**Indexer**(`lib/scanner.js`\n\n): streams every top-level`*.jsonl`\n\ntranscript, extracts the session title (custom-title > ai-title > first prompt), timestamps, models, token usage, and tool counts. Results are cached by file mtime + size + format version in the app's user-data dir, and an fs.watch re-index keeps the list current while you work.**Search**(`lib/search.js`\n\n): shells out to[ripgrep](https://github.com/BurntSushi/ripgrep)across all transcripts (also matching the JSON-escaped spelling of queries containing quotes or backslashes), then re-reads only the matching lines to build snippets.**Transcripts are trees**, not lists: rewinds fork branches. The viewer follows the`leafUuid`\n\npointer from the transcript's`last-prompt`\n\nline (falling back to the last message), shows only the live conversation, and reports how many rewound events it hid. Renders markdown, collapsible thinking, tool cards with inline screenshot results, pasted images, compaction markers, and model-fallback notes.**Usage dedup**: one API response spans several JSONL lines that each repeat the same usage object, and resumed or forked sessions copy history verbatim. So usage is deduplicated globally by message id across every file, subagent transcripts included, the same approach ccusage takes. Cache reads priced at 0.1x, 5-minute cache writes at 1.25x, 1-hour writes at 2x (`lib/pricing.js`\n\n). Costs are estimates of API-equivalent value, not an invoice.- The transcript format is officially internal to Claude Code, so parsing is deliberately tolerant: unknown line types and block types are skipped, never fatal.\n\n\"A reading room for machine work.\" Warm darkroom / warm paper palettes, New York serif for display type, SF Mono for the machine's voice, one brass accent. No neon.\n\nHindcast reads `~/.claude/projects/`\n\nand writes to exactly two places, both\nits own: its user-data dir (index cache, theme, settings) and\n`~/Downloads/Hindcast Exports`\n\nwhen you click export. It never writes into\n`~/.claude/`\n\n, makes no network requests of its own, and has no telemetry.\nThere is no API key to configure because it never calls Claude: it reads\nfiles on disk, and that's the whole trick. The 2026 back-and-forth over\nsubscription auth for third-party agent tools\n([latest round](https://venturebeat.com/technology/anthropic-reinstates-openclaw-and-third-party-agent-usage-on-claude-subscriptions-with-a-catch))\nnever applied to it.\n\n- An open session doesn't show new messages until you click away and back. Deliberate: a background refresh must never move your scroll position. The session list stays live either way.\n- A search match on a rewound (abandoned) branch opens the session but can't jump to the hidden event.\n- Apple Silicon only.\n\n**Live streaming or monitoring of active sessions**: your terminal already shows the stream. Hindcast stays a read-only archive.** Orchestration and team/cloud sync**: local-first and read-only, permanently.\n\n**Signed + notarized builds**: an unsigned DMG ships today; Developer ID enrollment is pending, and the`xattr`\n\nstep dies with it.[Bundle ripgrep](https://github.com/karanb192/hindcast/issues/5)so search works with zero setup.[An opt-in vault](https://github.com/karanb192/hindcast/issues/3)so your archive survives Claude Code's 30-day auto-cleanup.[On-device semantic search](https://github.com/karanb192/hindcast/issues/19)behind the same ⌘K.\n\nMore ideas live in\n[Issues](https://github.com/karanb192/hindcast/issues);\n[CONTRIBUTING.md](/karanb192/hindcast/blob/main/CONTRIBUTING.md) covers the ground rules. If Hindcast dug\nup a session you'd already given up on, a star helps other people find it.", "url": "https://wpnews.pro/news/show-hn-hindcast-search-replay-and-resume-any-claude-code-session-on-mac", "canonical_source": "https://github.com/karanb192/hindcast", "published_at": "2026-08-11 13:54:15+00:00", "updated_at": "2026-08-11 14:13:12.129565+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools", "artificial-intelligence"], "entities": ["Hindcast", "Claude Code", "Karan B", "Apple", "M3 Pro", "Homebrew", "GitHub", "Electron"], "alternates": {"html": "https://wpnews.pro/news/show-hn-hindcast-search-replay-and-resume-any-claude-code-session-on-mac", "markdown": "https://wpnews.pro/news/show-hn-hindcast-search-replay-and-resume-any-claude-code-session-on-mac.md", "text": "https://wpnews.pro/news/show-hn-hindcast-search-replay-and-resume-any-claude-code-session-on-mac.txt", "jsonld": "https://wpnews.pro/news/show-hn-hindcast-search-replay-and-resume-any-claude-code-session-on-mac.jsonld"}}