All notable changes to this project are documented in this file.
The format is based on Keep a Changelog.
0.2.0 - 2026-07-30
KNOWN_TOOL_TYPESregistry inutils/tool_dispatch.py; sync test keeps dispatch, file activity, Markdown export, and frontend renderers in step (#104)static/tool_types.jsongenerated from the registry and loaded at SPA boot; warns in the console when renderers drift; unknown tools show their type name and JSON payload (#105)GET /api/schema-reportand an amber banner on the session list when upstream JSONL fields appear or go missing (#108)- Disk summary cache at
~/.claude-code-chat-browser/session_summary_cache.sqliteplus a display-name cache so project and session lists load faster after restart (#111) - FTS5 search index in
utils/search_index.pywith background rebuild;/api/searchhits the index first and falls back to live scan; default window is 30 days (all_history,since_daysfor wider ranges) (#120) /api/searchreturns proper error codes for empty queries, overlong queries, badsince_days, and locked indexes; search page gets an all-history checkbox, a 50-result cap warning, snippet highlighting, and separate empty vs error UI (#121)- Lock order and threading model for the search index in
docs/architecture.md(#138) tests/test_search_index_concurrency.pyfor rebuild/query concurrency and lock-order checks (#139)- Python and Vitest parity oracles in
tests/test_dual_path_parity_oracle.pyandstatic/js/render/tool_result/dual_path_parity_oracle.test.js(#140)
- Session, stats, and export routes share
api/_session_handlers.pyand oneSESSION_LOAD_ERRORStuple (#125) - Tool result dispatch picks winners by explicit priority instead of tuple order (
planoverfile_write,task_messageover narrower task shapes) (#127) - CLI bulk export prints the same
ErrorCodevalues and messages as the HTTP API (#134)
- YAML frontmatter in Markdown export now quotes values that contain colons,
#, tabs, newlines, or boolean literals;models_usedandservice_tiersexport as sequences (#107) SEARCH_INDEX_UNAVAILABLE(503) when the FTS index is locked and live scan also fails (#122)
0.1.0 - 2026-06-18
__version__inapp.pyfor release tracking (0.1.0— first tagged release)- Startup guard refusing
--debugwith a non-loopback--host(including bracketed IPv6 loopback such as[::1]) - Deprecation policy for API and JSON field changes
- API field stability tables in
docs/api-reference.md(stable / experimental / deprecated) - Vitest coverage for router, page modules, and tool renderers (
static/js/) Content-Security-Policyheader on all Flask responses; theme-init IIFE externalized tostatic/js/theme-init.jsRoleLiteralnarrowing forMessageDict.rolewith unknown-role fallback- Mtime-invalidated LRU
session_cacheshared across session, stats, search, projects, and export APIs - CI benchmark regression gate with populated
benchmarks/baselines.json(fails on >20% mean regression)
- README notes that the server enforces the debug + host safety rule at startup
utils/jsonl_parser.__all__trimmed to public API symbols only (parse_session,quick_session_info)
export_countonGET /api/export/state— uselast_export_session_count(deprecated in PR #60; removed beforev0.1.0per deprecation policy bundled SPA path; SPA updated in same release cut)