v0.33.0#

These are the release notes for gptme version v0.33.0.

Contributors#

Thanks to everyone who contributed to this release:

@AlexFerroni02, @eeshsaxena, @erikbjare, @illiand, @sujeito-operator, @TimeToBuildBob

Changelog#

Changes since v0.32.1:

📦 gptme#

✨ Features (76)#

  • feat(autocompact): add keep_head to protect task context from compaction (#3567) (ab731347b)

  • feat(prompts): Add code editing strategy guidance for improved model performance (#3530) (8fb767452)

  • feat(cli): fatal error envelope + exit taxonomy for non-interactive mode (#3568) (3fb862dcc)

  • feat(prompts): end responses with a concrete next step (#3559) (a93bf261f)

  • feat(tools): add read-only audit preset (#3543) (7adb7f765)

  • feat(cli): add gptme explain for offline concept answers (#3542) (bb48ab5be)

  • feat(cli): add –version-short output (#3536) (bff711a52)

  • feat(models): refresh MiniMax plugin registry (#3533) (eb0dae860)

  • feat(cli): add JSON output to status command (#3528) (f232004be)

  • feat(tools/hashline_edit): 3-way merge recovery when file changes between read and edit (#3476 Phase 2) (#3520) (c3bdfb46d)

  • feat(attestation): Phase 1 registry bridge - wire model-capability-registry (#3525) (fce2fbe69)

  • feat(tools/hashline_edit): add register operations (CUT @name / PUT @name) (#3497) (cbce4062e)

  • feat(review): make reviewer toolset configurable with a read-only preset (#3512) (6b3fde6fc)

  • feat(lessons): Stage 1 shadow logging — policy_class/policy_version in dropout logs (#3455) (bd99a0944)

  • feat(review): add gptme-util review pr subcommand — complete the unified review pipeline (gptme#3442) (#3462) (374f94304)

  • feat(llm/webui): capture and display resolved OpenRouter subprovider in message metadata (#3486) (34e8848a8)

  • feat(tools/hashline_edit): add PUT N*: block-aware replace (#3476 Phase 1 remainder) (#3480) (db8fe3881)

  • feat(webui): add trajectory copy commands (#3491) (7c29b4177)

  • feat(webui): add copy trajectory as markdown with detail level toggles (#3485) (786f78642)

  • feat(review): add –trusted-reviewer guard for artifact mode (#3470) (702d9c219)

  • feat(tools): hashline-inspired snapshot-anchored edit format (#3477) (8fcff6ae8)

  • feat(webui/model-picker): add free-text custom model ID entry (#3466) (f5c6c8be5)

  • feat(review): artifact mode + structured handoff for review-watch (#3442) (#3449) (9130a018c)

  • feat(cli): add global stats for CLI subcommand for usage & cost analytics (#3400) (8d88b862e)

  • feat(review): converge review-watch and shared review pipeline (#3442) (#3443) (4a21419d6)

  • feat(timings): persist per-step timing breakdown in session records (#3436) (b0adaa7c7)

  • feat(util): add review-watch command for autonomous PR review iteration (#3437) (81342c4e6)

  • feat(browser): support custom executable path in GPTME_BROWSER_ENGINE (#3439) (08d61d970)

  • feat(cli): add ‘gptme providers add’ command for interactive custom provider setup (#3438) (542f64035)

  • feat(android): sign APK/AAB and verify signature before release upload (#3409) (55ac56712)

  • feat(cost): add session budget warnings (#3423) (be1e0b4f8)

  • feat(attestation): persist ModelSelectionTrace to logdir and embed in attestations (#3424) (5721cd0a7)

  • feat(site): add built-with-gptme badge (#3410) (3e146fcce)

  • feat(attestation): add ModelSelectionTrace for durable model provenance (Phase 0) (#3416) (1b4616ee0)

  • feat(webui): add Tool Activity Panel to right sidebar (#3413) (a598f55d2)

  • feat(tutorial): add gptme-tutorial interactive onboarding mode (#3420) (c284f67e7)

  • feat(k-best): add k_best_guess decorator for K-candidate validation (#3415) (1ebdb1f92)

  • feat(webui): replace CLI server guidance with in-app retry in Tauri desktop app (#3407) (7fe250529)

  • feat(cost): add inline per-message cost display via GPTME_SHOW_COST=1 (#3396) (2b7d77201)

  • feat(webui): virtualize message list with @tanstack/react-virtual (#3379) (ebbce08b9)

  • feat(webui): add model3d artifact kind for glTF/GLB/OBJ/STL inline preview (#3361) (d315f82f3)

  • feat(llm): add native Kimi K3 support (#3385) (8b1a993a9)

  • feat(logmanager): optional S3 replication for session event logs (Phase 2) (#3382) (97bc1dc22)

  • feat(sandbox): add Wasmtime WASI Python sandbox backend (#3381) (3697f4526)

  • feat(sandbox): add Docker sandbox for Python tool (GPTME_SANDBOX=docker) (#3377) (38f893b03)

  • feat(sandbox): add sandboxed execution mode for shell tool (#3367) (89d4ecb9a)

  • feat(config): add layered lifecycle script hooks (#3366) (1531fd15d)

  • feat(tools): add completion verification hook (#3358) (12001f153)

  • feat(tui): collapsible rendering for XML and markdown tool-call formats (#3353) (78c191958)

  • feat(tui): prompt before fetching URLs pasted into TUI (#3351) (609d55a76)

  • feat(tui): prefix-based history search + show Ctrl+J in input hint (#3341) (0faa850fc)

  • feat(tui): render thinking blocks as collapsibles, show Thinking… during generation (#3336) (58851384b)

  • feat(tui): tab-completion candidate overlay (#3311) (#3316) (48143206c)

  • feat(tui): tool-execution placeholder in chat + fix gray message background (#3321) (fe71f1294)

  • feat(tui): persist input history to shared prompt-toolkit history file (#3314) (1787ff47e)

  • feat(tui): add Alt+Left/Right word navigation to ChatInput (#3313) (b5c9edb11)

  • feat(tui): add input history, fix focus and visual polish (#3312) (bb6afedd4)

  • feat(tui): show ‘Generating…’ placeholder before first token arrives (#3310) (762fd3a67)

  • feat(webui): truly mix external sessions inline by recency (#3217) (#3307) (b9f4482e6)

  • feat(webui): open external sessions inline in native chat layout (#3306) (42982c631)

  • feat(tui): add experimental jelly error feedback (#3303) (efd9942f4)

  • feat(auth): add OpenRouter OAuth and gptme.ai device-connect to first-run setup (#3304) (6ad8c372a)

  • feat(webui): steer_inject for external sessions (Phase 2 of #3217) (#3287) (5591dd89b)

  • feat(cli): add full-noexamples system prompt type to reduce token usage (#3296) (f207bbf4d)

  • feat(cli): offer subscription auth on first run (#3295) (8d55746e1)

  • feat(hooks): hash-link manifest records with tamper-detection verification (Phase 2) (#3297) (50ceda783)

  • feat(models): add pricing_type field for subscription-backed providers (#3292) (87944b080)

  • feat(providers): add grok-subscription provider for SuperGrok subscribers (#3289) (e0cd34093)

  • feat(subagent): mid-turn steer injection via STEP_PRE checkpoint (#3290) (a46b5600b)

  • feat(hooks): add –manifest-dir for tool-call attribution at JSON-record granularity (#3291) (b711a662a)

  • feat(subagent): subagent_steer() — inject steering messages into running subagents (#3206) (070c45cee)

  • feat(tools): make lxml optional with stdlib xml.etree fallback; move pypdf to optional (#3280) (1b55e04c2)

  • feat(safety): add optional haiku judge annotation to export CLI (#3276) (61c2f68b5)

  • feat(typecheck): add human-readable imprecision summary to typecheck-coverage (#3272) (9e3b5432e)

  • feat(packaging): add gptme[minimal] install extra for ARM/musl/Termux/Lambda (#3279) (4cb2bfd37)

  • feat(webui): toggleable external sessions in conversation list (#3281) (1dc648dd1)

🐛 Fixes (91)#

Click to expand

  • fix(review): verify finding file/line target matches inline comment location (#3547) (dc0109123)

  • fix(tauri): real API-key errors and Windows sidecar startup (#3552) (3f4127cd1)

  • fix(server): validate provider API key before persisting in BYOK setup (#3555) (33ce4182e)

  • fix(grok-subscription): enable native tools API and add grok-4.6 (#3571) (5fdcd47b9)

  • fix(shell): allowlist permitted flags per binary instead of denying four find flags (GHSA-mfh4-cxj2-jc9p) (#3557) (46806b849)

  • fix(deps): bump Python critical security dependencies (#3556) (c2d1ca9cb)

  • fix(server): validate provider API key before saving it (#3546) (2ac432ef0)

  • fix(android): enable mobile cloud sign-in (#3558) (fef66b7f4)

  • fix(cli): rethink –version output format, remove –version-short (#3539) (49b4cf3aa)

  • fix(dirs): terminate project-dir walk at the filesystem root (Windows infinite loop) (#3509) (0c34ffc2a)

  • fix(llm): normalize proxy URL in _is_proxy() to match init() suffix rule (#3527) (6971a105a)

  • fix(constants): escape assistant display name to prevent rich markup injection (#3517) (3ff8966d1)

  • fix(read): reject non-positive line bounds instead of silently truncating (#3515) (902ab1b5b)

  • fix(prompt_queue): preserve malformed lines on drain instead of dropping them (#3498) (e75f52e1c)

  • fix(replay): read conversation.jsonl master log as explicit UTF-8 (#3474) (d62ae57d3)

  • fix(review): stop discarding reviews whose findings quote a code fence (#3513) (d003ff2bc)

  • fix(taskApi): include HTTP status code in all error messages (#3516) (cc4c2a15a)

  • fix: correct editable-install detection in --version output (#3518) (#3519) (1bdf21a70)

  • fix(cli): preserve lone separator prompt (#3514) (b34ee9b2b)

  • fix(webui): keep hosted demo CTA clickable (#3510) (b4e47e634)

  • fix(message): disable Rich markup for plain rendering (#3505) (ee4bceba4)

  • fix(codeblock): slice body on raw first-line length to avoid lang leaking into content (#3507) (ed08de11d)

  • fix(gh): only replace first /blob/ in transform_github_url (#3473) (7d7565f9d)

  • fix(cli): split chained prompts only on exact separator args (#3502) (7182eaa76)

  • fix(server): preserve interrupt ownership across tool continuations (#3457) (4c10199a3)

  • fix(codeblock): normalize CRLF line endings when parsing code blocks (#3499) (dfafb54ea)

  • fix(lessons): use correct max-z bound for population-SD BM25 z-scores (#3500) (393f7892f)

  • fix(shell): close 4 auto-approval vulnerabilities in shell_validation (#3495) (73931882c)

  • fix(ci): download after-screenshots to /tmp to survive checkout workspace wipe (#3496) (44d14eec4)

  • fix(server): prevent premature continuation when confirming concurrent tools (#3481) (f9d369c53)

  • fix(read): reject inverted line range instead of silently returning empty (#3494) (aa64f7419)

  • fix(ci): use official download-artifact for cross-run artifacts + add more visual snapshots (#3493) (74237f2a4)

  • fix(gh): substitute owner/repo in per-job log-fetch fallback so run-view logs are reachable (#3492) (e461427a2)

  • fix(llm): flatten array tool-result content for DeepSeek via OpenRouter (#3490) (dc7f854af)

  • fix(logmanager): use explicit UTF-8 for JSONL conversation I/O (#3475) (cd12e9e6a)

  • fix(deepseek): flatten text-only merged tool results to string (#3472) (a05fb85e2)

  • fix(webui): expose Accept All as direct one-click button + compact tool cards (#3440) (#3461) (1f70107bd)

  • fix(complete): enable stuck detection for interactive/web sessions (#3463) (0c343ebd9)

  • fix(deepseek): extract <think> reasoning into reasoning_content for deepseek-reasoner tool calls (#3464) (796f3d7cd)

  • fix(webui): scroll past InlineToolExecution during tool execution (#3440) (#3450) (114117db1)

  • fix(lessons): port BM25 z-score gate to HybridLessonMatcher no-embedder path (#3453) (b73e2e476)

  • fix(webui): model selector skeleton while loading + dedupe spinners (#3440) (#3441) (360e11052)

  • fix(webui): remove workspaceUtils debug console.log spam, add useMemo to components (#3446) (d4f12a696)

  • fix(tests): catch TypeError in _has_flask() for Python 3.13 compatibility (#3448) (91c0e25dd)

  • fix(tasks): align list-archived param name and include status code in errors (#3447) (4cba56d56)

  • fix(webui): keep setup wizard reachable after skip and on mobile Tauri (#3445) (f330be623)

  • fix(webui): make settings dialog full-screen on mobile, fixed-height on desktop (#3444) (2704a4f6b)

  • fix(server): propagate branch through tool execution and continuation step (#3432) (6d5f493c7)

  • fix(webui/a11y): raise green text to green-700 for WCAG AA compliance (#3433) (c6309447f)

  • fix(security): require bearer auth for all bind addresses, remove is_local_host() bypass (#3430) (511365332)

  • fix(server): complete cross-session generation guarding for conversations (#3429) (bd9bd781e)

  • fix(webui/demo): use fixed historical timestamp instead of Date.now() (#3431) (6df6b7916)

  • fix(server): check all sessions when guarding concurrent generation in /step (#3428) (6d4c5dba1)

  • fix(android): pin AAB signer fingerprint instead of -strict chain check (#3427) (17e1c1189)

  • fix(android): print actual cert fingerprint on verification mismatch (#3426) (86cf21e4b)

  • fix(config): use explicit UTF-8 encoding for all TOML config I/O (#3399) (f636ae4ac)

  • fix(llm): buffer non-tool system msgs between tool_calls and tool responses (#3422) (09ce9b05d)

  • fix(shell): fold workspace hint into tool response (#3419) (4c8066890)

  • fix(server): acquire step_lock in interrupt endpoint to prevent race (#3414) (c5faab836)

  • fix(server): reject message append during generation (#3412) (aaa96d6a6)

  • fix(server): guard conversation DELETE against concurrent generation (#3405) (2d40121ea)

  • fix(tauri): avoid duplicating webui in server sidecar (#3404) (b4e1871ff)

  • fix(server): acquire step_lock when checking generating flag in fork/edit/delete/config (#3401) (982d2ef8c)

  • fix(ci): bundle webui before building Tauri sidecars (#3403) (26ba55254)

  • fix(webui): a few minor design trims/fixes, including hiding avatars in chat on small screens (#3395) (a8f8509b1)

  • fix(server): actually bundle modern webui in distributions (#3387) (30852e8e2)

  • fix(sandbox): drop all Linux capabilities in Docker Python sandbox (#3380) (a534d8d20)

  • fix(logmanager): enforce call_id atomicity in limit_log for Responses API (#3359) (6b91235d3)

  • fix(tools): don’t stamp call_id on hook messages (fixes Responses API 400) (#3355) (8c8f4afae)

  • fix(tui): update tool format on /model switch, pretty-render tool-format calls (#3347) (38a311d14)

  • fix(subscription): close streaming response on all exit paths to prevent SIGSEGV (#3352) (efd812233)

  • fix(tui): prevent crash when pasting GitHub URL (#3348) (0a310054c)

  • fix(gh): keep the ref intact when turning a blob URL into a raw URL (#3342) (1e0ce256f)

  • fix: improve tui styling (#3340) (65edd236e)

  • fix(tui): use terminal-native background for active output (#3334) (26e85570d)

  • fix(webui): persistent disconnected banner in conversation view (#3327) (41591361d)

  • fix(webui): strip thinking blocks from TTS output (#3332) (1d31b9821)

  • fix(test): kill TestMaxTimeWatchdog xdist flake — prevent untracked threads (#3331) (304631e4a)

  • fix(webui): omit default dot-workspace so server applies its @log default (#3329) (8feb442f2)

  • fix(server): validate Host header to block DNS-rebinding on unauthenticated local servers (#3324) (34b0a33f0)

  • fix(server): allow explicit workspace override when creating conversations (#3319) (711fb826d)

  • fix(server,webui): external sessions dedup, stable detail IDs, admin nav label (#3325) (8fa8315b2)

  • fix(test): use scrollback capture for inline-mode positional assertion (#3305) (b6db634ba)

  • fix(test): wait for input prompt before asserting scrollback order in inline test (#3301) (b86d50a8d)

  • fix(acp): use max_turn_requests stop_reason when GPTME_MAX_STEPS reached (#3302) (2dec6bae4)

  • fix(webui): expose server URL validation inline (#3299) (063b5fec0)

  • fix(acp): complete tool-driven prompt turns (#3300) (a3b121260)

  • fix(logmanager): preserve tool call/result atomicity in prune_ephemeral_messages (#3294) (caabde264)

  • fix(webui): tolerate legacy provider health responses (#3298) (3fd84ba52)

  • fix(models): update stale OpenRouter model IDs (#3288) (dada86411)

  • fix(tauri): make AppImage GTK links idempotent (#3277) (f658a411c)

🔨 Misc (42)#

Click to expand

  • chore: bump version to 0.33.0 (b0f9e1199)

  • docs(models): cite the grok-4.6 model card (#3572) (6fd94609c)

  • refactor(tests): move hashline snapshot test out of test_tools_read.py (#3564) (0a27a4539)

  • docs: fix providers.rst structure, nest provider/browser pages, add Tool Formats guide (#3563) (9062f906d)

  • refactor(tools/read): fully decouple read.py from _hashline_snapshot (#3562) (469e7fe16)

  • refactor(cli): move Bob-specific status fields out of core; add StatusProvider extension point (#3537) (f2438a449)

  • docs(design): complete PTC audit — paper citation + full tools/ coverage (#3554) (3d0005fd9)

  • docs: reordered sections in providers.rst (6e3529153)

  • refactor(tools/read): decouple read tool examples from hashline conventions (#3561) (e8fcfa2fe)

  • docs(tools): document hashline_edit tool + fix read examples with tag header (#3476) (#3532) (369eaac92)

  • docs: PTC tool interface audit + architecture rationale (fixes #3540) (#3541) (66057c6e8)

  • docs: clarify conversation, branch, fork, and session terminology (#3544) (85ac622e8)

  • test(webui): server-backed E2E generation tests with mock/echo provider (#3440) (#3468) (79bfe0def)

  • docs(review): cross-reference the three PR-review implementations (#3511) (ced7357ce)

  • refactor(review): extract infer_owner_repo into shared gptme.util.gh module (#3503) (2a84b1858)

  • test(review): fix brittle live-PR unresolved assertion + add mocked coverage (gptme#3442) (#3501) (0cd374a2b)

  • test(review-watch): stop a global time.monotonic patch from crashing other tests (#3489) (900727b19)

  • test: thread-leak detector + dict-race thread dump (residue of #3257) (#3458) (2f8966884)

  • docs(cookbook): add cookbook with 5 canonical usage patterns (#3398) (d83a093a2)

  • docs(readme): update desktop app from WIP to shipped with download link (#3397) (74ccbb225)

  • docs(automation): add review-gated autonomous workflow section (#3391) (3c1a26807)

  • docs: add task-to-workflow onboarding guide (#3389) (49583dd01)

  • test(webui): add virtualization regression tests for #3379 (0c3a4add1)

  • revert(logmanager): remove speculative S3 event-log replication (#3384) (1362061c2)

  • test(webui): guard streaming performance fixes (#3362) (#3375) (4b0a88ff1)

  • perf(webui): skip buildStepRoles recompute on every streaming token (#3370) (bba854aad)

  • perf(webui): use Record instead of Map for stepRoles$ to enable per-row reactivity (#3371) (530d6ac09)

  • perf(webui): remove debug console.log spam from useConversation (#3369) (c00fce620)

  • perf(webui): fix O(n²) DOM writes during streaming code blocks (#3368) (93c77e29b)

  • docs: add contributor-facing PR lifecycle guide (#3365) (de9e1beaf)

  • perf(webui): skip hljs.highlightAuto for gptme tool-output tags (#3364) (57b2ce0e2)

  • perf(webui): fix O(n²) syntax highlighting and scroll thrash during generation (#3363) (442882760)

  • docs(providers): add LM Studio section and tool-use verification tip (#3357) (b66e24c00)

  • test(acp): add end-to-end smoke test for ACP agent (#3356) (6b9f7db70)

  • docs(providers): add provider integration guide + test scaffold (#3354) (fdd0631b0)

  • test(tui): guard against italic text-style regression (#3340) (#3344) (e6952436f)

  • test(tui): activate gray-background regression guards now that #3334 is merged (#3339) (714035fbb)

  • test(tui): add SVG visual regression tests for TUI rendering (#3338) (f4332b337)

  • docs(server): add Security section — threat model, auth model, and workspace PATCH semantics (#3333) (a314438ad)

  • test(server): regression test for generation_complete ordering (refs #3315) (#3323) (20cb45f58)

  • test(webui): add ExternalSessionDetail unit tests (steer_inject path) (#3308) (a5b65b12a)

  • experiment(computer): semantic verification contract prototype (#3275) (a1d8ca21d)

(excluded 11 less relevant commits)

Full Changelog: https://github.com/gptme/gptme/compare/v0.32.1…v0.33.0