v0.34.0#

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

Contributors#

Thanks to everyone who contributed to this release:

@AmaLS367, @aniruddhaadak80, @erikbjare, @simpleqt, @TimeToBuildBob

Changelog#

Changes since v0.33.0:

📦 gptme#

✨ Features (61)#

  • feat(webui): add gptme-host:seed-prompt to pre-fill chat input from host (#3870) (437eca576)

  • feat(memory): add search and export commands to complete #3734 CLI table (#3869) (a0418fe30)

  • feat(memory): migrate-knowledge-jsonl command + deprecate knowledge CLI (#3863) (19f3ece8b)

  • feat(cloud): default service URL → auth.gptme.ai custom domain (#3866) (d78c71188)

  • feat(knowledge): wire search to gptme-rag semantic ranking (#3865) (73074e58d)

  • feat(knowledge): generalize schema with entry_type (problem_resolution, decision, fact, how_to, note) (#3864) (b42d24b85)

  • feat(config): expose preview guidance through runtime prompt fragments (#3821) (c74602087)

  • feat(site): deploy design-v3 landing page to gptme.org (#3849) (170f28bb4)

  • feat(site): prototype of new gptme.org site (design v3) (#3839) (0881c1d98)

  • feat(memory): trigger keyworded entries through the lesson matcher (#3817) (1ced9ccca)

  • feat(subagent): persist registry metadata and rehydrate after restart (#3834) (085bd7bec)

  • feat(skills): persist CostTracker ownership across TUI/server workers (#3833) (3c4326778)

  • feat(subagent): continue completed child conversations (#3820) (e4e0f6980)

  • feat(skills): export lifecycle metrics and measured cost windows (#3793) (6f9a5bdfc)

  • feat(tools): conditional tool docs + companion tools (requires_tools) (#3801) (925eab097)

  • feat(memory): use layered MemoryStore in workspace prompt (#3789) (31a385390)

  • feat(memory): preserve writer provenance through CLI metadata (#3792) (1ecb322fc)

  • feat(memory): persist always-on selection and byte budget (#3791) (587048f44)

  • feat(models): add deepseek/deepseek-v4.1-flash (#3799) (0241c2592)

  • feat(skills): record server and TUI invocation outcomes (#3787) (0e7033754)

  • feat(memory): Codex/AGENTS.md integration for cross-harness memory (#3764) (b5374121c)

  • feat(models): generate recommended-model docs from code; add DeepSeek V4 Flash 0731, GLM 5.3 Flash, GPT-6 Astra, Grok 4.6; OpenRouter provider allowlists (#3786) (a35b7fdf5)

  • feat(cli): add –track-tokens flag to print running token count per LLM call (#3646) (235a3fb90)

  • feat(skills): persist explicit invocation lifecycle evidence (#3750) (fc8024909)

  • feat(llm): make reasoning effort controllable and observable for OpenAI-compatible providers (#3781) (75c65631c)

  • feat(config): trust-on-first-use gate for project-level shell execution (#3782) (dbd5f6173)

  • feat(hooks): add guardrail TOOL_CONFIRM hook for headless safety (#3598) (#3765) (c176aa62d)

  • feat(server): add /preview/{port}/ proxy for cloud port exposure (gptme-cloud#910) (#3767) (5e6083c91)

  • feat(memory): add cross-harness lexical recall (#3740) (d4bcf8658)

  • feat(tools): add ToolSpec.read_only flag; auto-approve in cli_confirm_hook (#3733) (9573ef16e)

  • feat(memory): gptme.memory package + gptme-util memory CLI (layered roots, CC-compatible) (#3735) (21334d854)

  • feat(shell): stream one-shot command output while it runs (#3579) (e3d15c571)

  • feat(memory): add memory write tool for cross-runtime memory sharing (#3638) (39810873a)

  • feat(dataset): trajectory-to-env pipeline for fine-tuning dataset construction (#3719) (86fc95533)

  • feat(cli): add gptme capabilities export (#3705) (6b7d53d1a)

  • feat(harness): actuate request_tool_change — enable/disable tools mid-session (Phase 2) (#3656) (d3b39582d)

  • feat(lessons): class-aware dropout for validated_core (Phase 1) (#3700) (fb8a511b5)

  • feat(context): add context-scout pre-pass (cheap model identifies relevant files) (#3692) (b5ecb8ff8)

  • feat(knowledge): inject matching KB entries at session start (#3678) (a89ef54b9)

  • feat(providers): complete context compression plugin interface - Phase 2 (#3613) (67de83b77)

  • feat(shell): improve background job control (#3673) (01b6ad50a)

  • feat(tools): expose convert as auto-discovered structured tool (#3659) (03529e2fa)

  • feat(knowledge): cross-session KB save/retrieve as gptme-util CLI (#3622) (b5152917d)

  • feat(service-init): add optional local health probe (#3665) (2ccf2ff02)

  • feat(browser): skip html→markdown when server returns text/markdown (#3647) (0565d1548)

  • feat(doctor): add proxy URL format check (LLM_PROXY_URL) (#3645) (c9193879b)

  • feat(eval): route fable-5 and haiku-4.5 to tool format by default (#3655) (1b23b5fb0)

  • feat(tools): add offline file format conversion tool (#3595) (b04893049)

  • feat(ci): use config-driven root structure validator (#3654) (0599fd6da)

  • feat(memory): load Claude Code memory in gptme workspace context (#3626) (f345aaeaf)

  • feat(models): parallel-tool flags from provider docs; eval-format verdict (#3628) (b6a797dc0)

  • feat(media): add 32x32-optimized gptme icon (colour + monochrome) (#3583) (3ddaacaab)

  • feat(cli): auto-discover local Ollama and LM Studio providers (#3593) (30e4b7f94)

  • feat(skills): invoke skills as slash commands (/skill:<name>) (#3587) (d22602fb9)

  • feat(service-init): add launchd support for macOS agents (#3586) (7c52dc6f9)

  • feat(harness): audit assistant harness update requests (#3529) (79750b000)

  • feat(cli): add gptme service init scaffold for headless agents (#3574) (d27f98d3a)

  • feat(precommit): add check-root-structure hook from gptme-contrib (#3580) (77010664a)

  • feat(server): BYOK key validation — warn not block when provider unreachable (#3569) (0fc8208e9)

  • feat(shell): opt-in per-shell memory ceiling via GPTME_SHELL_MEMORY_LIMIT (#3565) (7092325b2)

  • feat(computer): allow out-of-tree transports via register_transport() (#3577) (ddb9dea0f)

🐛 Fixes (123)#

Click to expand

  • fix(logmanager): acknowledge completion after transcript barriers (#3826) (f95c7ed13)

  • fix(knowledge): fall back to keyword search when RAG returns no live entries (#3867) (e8f0e9989)

  • fix(webui): resolve server-relative panel srcs against the instance API origin (#3861) (97fdc483b)

  • fix(cli): validate non-empty query in context retrieve/search-conversations; catch RuntimeError (#3852) (90d251ce0)

  • fix(eval): correct main’s docstring parameter name and semantics (#3858) (69d02e4ef)

  • fix(shell): restore cwd/env after a shell death and tell the model (#3844) (c09a0b3e9)

  • fix(tests): reset leaked shell workspace cwd state between tests (#3854) (55be1b2aa)

  • fix(webui): log readable auth-code exchange failure cause (#3853) (9d576ba93)

  • fix(cli): emit clean error on attest sign –out write failure (#3850) (f32f045c3)

  • fix(llm): _merge_consecutive must not merge parallel tool results with different call_ids (#3847) (8dc34d3ff)

  • fix(eval): keep token counts on timeout instead of zeroing them (#3845) (53fd88323)

  • fix(shell): wake idle sessions on background completion (#3843) (5fa6b67ef)

  • fix(webui): guard console-proxy injection against cross-origin iframes (#3840) (424bd1df7)

  • fix(cli): emit clean error on dataset export -o write failure (#3842) (76113984e)

  • fix(webui): guard undefined values before toLowerCase calls (#3841) (1541e48c6)

  • fix(tools): raise ValueError with tool name when init() returns None (#3835) (7775e3f8b)

  • fix(init): don’t warn when the optional model registry is absent (#3829) (7c8570587)

  • fix(shell): strip shell operators from tokens before sensitive-path check (#3806) (#3807) (93c337cb5)

  • fix(llm): use instructions_format[“tool”] verbatim for tool-schema descriptions (#3823) (db484f284)

  • fix(config): order model layers by specificity, unify resolution (#3825) (d819a9196)

  • fix(config): align CLI model precedence (#3818) (26242d520)

  • fix(cli): emit clean error on status -o write failure, auto-mkdir parent (#3824) (7c713aee4)

  • fix(subagent): deliver subprocess control and capture stderr (#3819) (99eadc0a2)

  • fix(shell): scope set -e per block to prevent persistent errexit deaths (#3810) (50d776486)

  • fix(gh): dispatch structured ‘command’ kwarg calls (#3809) (a17e63542)

  • fix(shell): bound captured subprocess output bytes (GPTME_SHELL_MAX_OUTPUT_BYTES) (#3804) (a5d356fa2)

  • fix(llm): keep tool_call pairing for unavailable tools; dedupe auto-naming threads (#3800) (a43d56930)

  • fix(shell): parse time scripts, stop false syntax errors, unwrap transparent wrappers (#3803) (517771546)

  • fix(webui): persist demo conversations to sessionStorage to survive reload (#3796) (328c62894)

  • fix(llm): honor Retry-After during transient retries (#3797) (9ccf7d0dd)

  • fix(openrouter): always send data_collection=deny for reasoning models (#3788) (83ea90c65)

  • fix(memory): read index entries under the root lock (#3790) (d07a89ab1)

  • fix: decode editable install file URLs (#3721) (0ab1daac3)

  • fix(benchmark): raise cold startup threshold 6.0 → 8.0s for CI noise margin (#3777) (c9f1180aa)

  • fix(server): do not execute caller-supplied agent fork commands (#3783) (12a8be9ed)

  • fix(shell): bound denylist matches to argument tokens (#3761) (65d888f34)

  • fix(server): detect “No provider configured” as config error in server fallback (#3784) (9e46dee08)

  • fix(docs/cli): mention subscription auth in no-provider error paths (#3775) (8f8384965)

  • fix(llm): fold non-leading system messages for models that reject them (fixes #3779) (#3780) (f3f1fce54)

  • fix(mcp): run TOOL_CONFIRM guardrails on MCP tool.execute() (#3776) (34f1178e5)

  • fix(shell): use poll() in _run_with_tty reader (#3715) (#3769) (b5aec1818)

  • fix(memory): reject reserved index names (#3772) (88494416b)

  • fix(shell): use poll() in background job reader (#3715) (#3770) (aafe081a6)

  • fix(codeblock): track triple-quote state in ipython blocks (#3704) (#3773) (e6d488231)

  • fix(acp): attach host-supplied MCP servers to sessions (#3771) (c10397da4)

  • fix(webui): use Bookmark icon for set-default (not Star — fixes confusion with favorites) (#3768) (e905cf701)

  • fix(webui): only show demo content in explicit demo mode, not on connect (#3754) (8232933cc)

  • fix(webui): drop auth-code bootstrap gate before the connection probe (#3751) (4379da00b)

  • fix(cli): render native tool calls as highlighted source (#3752) (bd8e68526)

  • fix(webui): stop event-stream banner from flashing on conversation open (#3753) (9f54511ce)

  • fix(cli): skip root scans and keep path inclusion interruptible (#3762) (797f322b9)

  • fix(cli): reject ambiguous positional resume IDs (#3763) (ddbd6b42e)

  • fix(webui): clear stop flag before edit/rerun/regenerate (#3744) (21125a614)

  • fix(codeblock): carry quote state across lines; close exec-lang blocks in streaming (#3730) (af60f3292)

  • fix(onboard): detect OAuth subscription providers (#3720) (62f5e4fa1)

  • fix(cli): show ‘gptme <cmd>’ instead of ‘gptme-util <cmd>’ in error messages (#3749) (cd5e489ba)

  • fix(review): explain repository-relative reads in isolated sessions (#3731) (ea22cddc1)

  • fix(review-pr): name the offending stdout line when JSONL parsing fails (#3747) (337e0d2f4)

  • fix(telemetry): keep startup diagnostics out of JSON stdout (#3732) (7cb63efb7)

  • fix(webui): pre-set generating state on new-chat placeholder to collapse microsteps (#3743) (a53524527)

  • fix(webui): repair dead conversations-list invalidation after create/delete/import (#3742) (110a4eecd)

  • fix(webui): suppress ‘Cannot reach’ banner while auto-connecting (#3739) (b3b4501d4)

  • fix(security): strip repo-local execution sinks from git inspection commands (#3727) (b65f699d5)

  • fix(tools): suppress duplicate terminal output for shell/IPython tools (#3708) (8a176e21d)

  • fix: reduce lesson/hidden-message log spam in TUI (#3738) (83325b32f)

  • fix(webui): navigate before server response in new-chat flow (#3729) (a87301426)

  • fix(cli): clean error on malformed capabilities --from-json snapshots (#3726) (e8f7ae2f5)

  • fix(reduce): cache proactive_summarize_log result by middle-message content hash (#3620) (133a4b567)

  • fix(codeblock): skip depth-1 look-ahead for execution langs (shell, ipython) (#3703) (1e7e5547c)

  • fix(logmanager): bound trajectory write amplification (#3714) (d7496cb5c)

  • fix(security): upgrade cryptography 46.0.5→50.0.1 and h2 4.3.0→4.4.1 (#3723) (b62ae3a1a)

  • fix(cli,tests): unbreak models list --json under warning providers; scope the gh sleep patch (#3717) (002605256)

  • fix(shell): use poll() instead of select() to survive fds above FD_SETSIZE (#3716) (ebeb21f57)

  • fix(cli): handle capabilities output write errors (#3724) (2789cef63)

  • fix(cli): suppress ANSI in redirected tools list (#3712) (a3902b8a0)

  • fix(server/tasks): reject invalid task IDs at API routes with 400 (#3711) (582ce5b58)

  • fix(browser): gate PDF fetches with the shared URL helper (#3685) (d6f9a4724)

  • fix(dirs): treat empty/whitespace env vars as unset; guard profile_name (#3660) (f22745729)

  • fix(cli): reject negative context tree depth (#3713) (46e6dff06)

  • fix(telemetry): suppress repeated export errors after first occurrence (#3707) (b1e9f037d)

  • fix(server): make /api/v2/server/health unauthenticated for monitoring integrations (#3702) (c5aee1038)

  • fix(models): stamp default_tool_format on dynamic listing constructors; serialize in model_to_dict (#3681) (8a44e8a03)

  • fix(shell): require confirmation for git-credentials and gptme config.toml reads (#3686) (3a929b4d0)

  • fix(knowledge): don’t block on gptme-rag index after save/delete (#3691) (63cb9f24d)

  • fix(llm): stop double-retrying and survive 429s in interactive mode (#3669) (7294393dc)

  • fix(util): handle embedded nulls in batch prompts (#3682) (f8354a042)

  • fix(webui): gate task creation in demo mode (#3684) (b84ee8a3a)

  • fix(llm): pin Codex session_id to conversation instead of uuid4 per turn (#3679) (9f607ea2d)

  • fix(server): return 400, not 500, for non-dict JSON bodies on tools QUERY and steer (#3676) (77661b958)

  • fix(convert): handle non-UTF-8 converter stderr without crashing (#3677) (f5ae30fcf)

  • fix(prompts): move profile system prompts before cache boundary (Phases 2+3) (#3616) (b8501f86c)

  • fix(models): per-model parallel-tool opt-out via PARALLEL_TOOL_CALL_EXCEPTIONS (#3633) (1a1a3f8cf)

  • fix(cli): suppress all shortcut dispatch after double dash (#3670) (59ca891e7)

  • fix: match Claude Code’s cwd→project-dir encoding (CC memory + agent hook) (#3672) (dc593da2c)

  • fix(cli): reject unknown bare –model names before get_prompt() (#3640) (f4d71ca6a)

  • fix(security): route git subprocesses through GIT_CMD in review-pr and 3-way merge (#3674) (00fe1fef5)

  • fix(tests): join subagent threads before teardown in TestParentContextForwarding (#3675) (8213fe835)

  • fix(config): workspace fallback must not use process cwd (P1 follow-up from #3639) (#3657) (9db4f880b)

  • fix(cli): forward nested help to utility shortcuts (#3630) (e8028b797)

  • fix(browser): harden lynx URL validation (#3663) (78ff262b9)

  • fix(shell): route all commands through TOOL_CONFIRM hook chain (closes #3598) (#3636) (d4a6b8f65)

  • fix(convert): register gptme-convert console script and fix error message (#3658) (1ad650ae3)

  • fix(tests): give subagent thread-join guard a real liveness budget (#3662) (c574b83d3)

  • fix(tests): stop pytest-retry x tmp_path teardown KeyError failing green runs (#3661) (c922c9b38)

  • fix(compat): improve Windows and cross-platform compatibility in tools and tests (#3639) (7e7430428)

  • fix(status): serialize list/dict provider values as JSON in table format (#3651) (9b1d7fb06)

  • fix(cli): support stdin dash in slop check (#3650) (958ca6b47)

  • fix(tests): assert webui html hint by content, not by index (#3635) (3a2af3318)

  • fix(tests): scope pytest timeouts to the function so retries can’t INTERNALERROR the run (#3634) (f636b9f70)

  • fix(server): preserve webui html hint on config patch (#3521) (91caf5fd6)

  • fix(prompts): keep volatile context after cache boundary (#3615) (476e8f7a4)

  • fix(models): propagation gap + default_tool_format for OpenAI-compat providers (#3566) (6a20ca2ed)

  • fix(webui): recover local-server bearer handshake after #3430 (#3606) (717df0715)

  • fix(webui): stabilize multi-server query results (#3602) (ea78d4658)

  • fix(server): use os.write() and re-entrance guard in SIGTERM handlers (#3623) (13284c336)

  • fix(server): guard startup SIGTERM handler against overriding custom handlers (#3597) (69ad48725)

  • fix(server): treat missing X display as screenshot-unavailable (#3612) (2e571b362)

  • fix(server): don’t let step() finally clear a continuation reservation (#3592) (a46d9ea20)

  • fix(service-init): make the scaffolded agent actually run gptme (#3609) (7641c015f)

  • fix(server): install SIGTERM handler before slow init to prevent silent failure (#3591) (3cd609a9f)

  • fix(precommit): update gptme-contrib rev to post-#1479 merge (#3584) (904de13a1)

  • fix(tauri): include pyproject.toml and lock file in sidecar freshness check (#3573) (fe99c6635)

  • fix(android): open cloud sign-in in the system browser, not the app WebView (#3578) (f206f94a5)

🔨 Misc (42)#

Click to expand

  • chore: bump version to 0.34.0 (5a8912b64)

  • docs: position cross-harness memory in README and site (closes #3734 item 8) (#3871) (3fb432ce7)

  • docs: point the hooks comment at the subagent package (#3859) (4fb6a6c86)

  • refactor(webui): extract presentational PromptTextarea shell from ChatInput (#3872) (d78b94314)

  • chore: move root-structure allowlist under .github and drop gptme-extension tombstone (#3868) (47cdf776c)

  • test(shell): pin no-retry invariant by watching stdin writes after EPIPE (#3860) (08ce4995b)

  • test(webui): cap jest maxWorkers at 4 to prevent container thrash (#3862) (b827a9db4)

  • docs: fix a TOC anchor and the moved-extension link (#3857) (d33d60647)

  • test(llm): strip ANSI codes before asserting IPython source in terminal output (#3856) (e81224353)

  • docs: add CITATION.cff and a Citation section to README (#3855) (dff9d0e33)

  • test(lessons): stop seeding the global RNG in dropout tests (#3851) (e60462be2)

  • refactor(shell): background whole tool calls and fix exit stalls (#3802) (3411afec5)

  • docs(readme): refresh demos with current screenshots and better asciinema thumbnails (#3837) (deb26dc71)

  • docs: update timeline and README news through September 2026 (#3836) (be6e3b256)

  • docs(readme): replace broken starchart.cc chart with gptme/stats (#3838) (d8f5720d9)

  • docs(contributing): note toolchain drift between venv, lockfile and hooks (#3830) (f3b9c64bc)

  • docs: restructure navigation and page structure (#3813) (d4c57d992)

  • test(memory): assert legacy reads stay bounded (#3815) (13be6aabf)

  • refactor(shell): parse Bash with tree-sitter and retain legacy fallback (#3808) (4a7aff453)

  • docs: rewrite finetuning page as a working, measured recipe (#3778) (7bcd9ae61)

  • ux: hint how to enable disabled-by-default tool in error message (#3748) (9a0c2408a)

  • test(webui): exercise live auto-connect banner transition (#3741) (f184a1532)

  • docs(readme): tag gptme.ai acquisition link (#3725) (43786e7da)

  • docs: separate agent runtimes from providers (#3694) (076e433cc)

  • docs: add core domain guide (#3690) (de6dd04fb)

  • test(codeblock): load fixture files with pathlib so tests pass on Windows (#3637) (5d40b35dc)

  • docs: point the free on-ramp at live OpenRouter models (#3671) (d94dbe1bd)

  • docs(mcp): surface bidirectional server support in README (#3664) (5039ad147)

  • docs(providers): link template and add integration FAQ (#3649) (5a972d4f9)

  • refactor(autocompact): rename /compact modes to ‘trim’ and ‘summarize’ (#3621) (6c0a3f57d)

  • docs(getting-started): add free cloud providers section (OpenRouter, Gemini, Groq) (#3631) (fc98c881a)

  • refactor(agent-cmd): clarify scan scope and add create cross-references (#3619) (19e03514f)

  • test(webui): add opt-in vision_assert helper for generation E2E (#3607) (dba4af2c3)

  • docs: add curated skills gallery page to gptme.org (#3605) (170d87681)

  • refactor(service-init): consolidate and document gptme-agent-template reference (#3614) (e7107777e)

  • docs(hooks): document TOOL_CONFIRM deny semantics and return contract (#3611) (0e3fb1aa7)

  • test(subagent): de-flake test_subagent_wait_polls_cache_after_join_timeout (#3610) (fccc316f4)

  • docs(plugins): fix hook type names and add TOOL_CONFIRM guardrail example (#3608) (0b1897cf1)

  • docs: add headless agents section with gptme service init example (#3588) (a4d403a91)

  • test(server): add subprocess integration test for server startup (#3589) (#3590) (6e4e0015b)

  • test(webui): add regression test for BYOK 422 invalid-key rejection (#3545) (#3581) (b36c05f41)

  • docs: document subscription auth (ChatGPT Plus/Pro, SuperGrok) in README and providers docs (#3582) (433f47f28)

(excluded 7 less relevant commits)

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