# 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](https://github.com/gptme/gptme/issues/3870)) ([`437eca576`](https://github.com/gptme/gptme/commit/437eca576))
 - feat(memory): add search and export commands to complete [#3734](https://github.com/gptme/gptme/issues/3734) CLI table ([#3869](https://github.com/gptme/gptme/issues/3869)) ([`a0418fe30`](https://github.com/gptme/gptme/commit/a0418fe30))
 - feat(memory): migrate-knowledge-jsonl command + deprecate knowledge CLI ([#3863](https://github.com/gptme/gptme/issues/3863)) ([`19f3ece8b`](https://github.com/gptme/gptme/commit/19f3ece8b))
 - feat(cloud): default service URL → auth.gptme.ai custom domain ([#3866](https://github.com/gptme/gptme/issues/3866)) ([`d78c71188`](https://github.com/gptme/gptme/commit/d78c71188))
 - feat(knowledge): wire search to gptme-rag semantic ranking ([#3865](https://github.com/gptme/gptme/issues/3865)) ([`73074e58d`](https://github.com/gptme/gptme/commit/73074e58d))
 - feat(knowledge): generalize schema with entry_type (problem_resolution, decision, fact, how_to, note) ([#3864](https://github.com/gptme/gptme/issues/3864)) ([`b42d24b85`](https://github.com/gptme/gptme/commit/b42d24b85))
 - feat(config): expose preview guidance through runtime prompt fragments ([#3821](https://github.com/gptme/gptme/issues/3821)) ([`c74602087`](https://github.com/gptme/gptme/commit/c74602087))
 - feat(site): deploy design-v3 landing page to gptme.org ([#3849](https://github.com/gptme/gptme/issues/3849)) ([`170f28bb4`](https://github.com/gptme/gptme/commit/170f28bb4))
 - feat(site): prototype of new gptme.org site (design v3) ([#3839](https://github.com/gptme/gptme/issues/3839)) ([`0881c1d98`](https://github.com/gptme/gptme/commit/0881c1d98))
 - feat(memory): trigger keyworded entries through the lesson matcher ([#3817](https://github.com/gptme/gptme/issues/3817)) ([`1ced9ccca`](https://github.com/gptme/gptme/commit/1ced9ccca))
 - feat(subagent): persist registry metadata and rehydrate after restart ([#3834](https://github.com/gptme/gptme/issues/3834)) ([`085bd7bec`](https://github.com/gptme/gptme/commit/085bd7bec))
 - feat(skills): persist CostTracker ownership across TUI/server workers ([#3833](https://github.com/gptme/gptme/issues/3833)) ([`3c4326778`](https://github.com/gptme/gptme/commit/3c4326778))
 - feat(subagent): continue completed child conversations ([#3820](https://github.com/gptme/gptme/issues/3820)) ([`e4e0f6980`](https://github.com/gptme/gptme/commit/e4e0f6980))
 - feat(skills): export lifecycle metrics and measured cost windows ([#3793](https://github.com/gptme/gptme/issues/3793)) ([`6f9a5bdfc`](https://github.com/gptme/gptme/commit/6f9a5bdfc))
 - feat(tools): conditional tool docs + companion tools (requires_tools) ([#3801](https://github.com/gptme/gptme/issues/3801)) ([`925eab097`](https://github.com/gptme/gptme/commit/925eab097))
 - feat(memory): use layered MemoryStore in workspace prompt ([#3789](https://github.com/gptme/gptme/issues/3789)) ([`31a385390`](https://github.com/gptme/gptme/commit/31a385390))
 - feat(memory): preserve writer provenance through CLI metadata ([#3792](https://github.com/gptme/gptme/issues/3792)) ([`1ecb322fc`](https://github.com/gptme/gptme/commit/1ecb322fc))
 - feat(memory): persist always-on selection and byte budget ([#3791](https://github.com/gptme/gptme/issues/3791)) ([`587048f44`](https://github.com/gptme/gptme/commit/587048f44))
 - feat(models): add deepseek/deepseek-v4.1-flash ([#3799](https://github.com/gptme/gptme/issues/3799)) ([`0241c2592`](https://github.com/gptme/gptme/commit/0241c2592))
 - feat(skills): record server and TUI invocation outcomes ([#3787](https://github.com/gptme/gptme/issues/3787)) ([`0e7033754`](https://github.com/gptme/gptme/commit/0e7033754))
 - feat(memory): Codex/AGENTS.md integration for cross-harness memory ([#3764](https://github.com/gptme/gptme/issues/3764)) ([`b5374121c`](https://github.com/gptme/gptme/commit/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](https://github.com/gptme/gptme/issues/3786)) ([`a35b7fdf5`](https://github.com/gptme/gptme/commit/a35b7fdf5))
 - feat(cli): add --track-tokens flag to print running token count per LLM call ([#3646](https://github.com/gptme/gptme/issues/3646)) ([`235a3fb90`](https://github.com/gptme/gptme/commit/235a3fb90))
 - feat(skills): persist explicit invocation lifecycle evidence ([#3750](https://github.com/gptme/gptme/issues/3750)) ([`fc8024909`](https://github.com/gptme/gptme/commit/fc8024909))
 - feat(llm): make reasoning effort controllable and observable for OpenAI-compatible providers ([#3781](https://github.com/gptme/gptme/issues/3781)) ([`75c65631c`](https://github.com/gptme/gptme/commit/75c65631c))
 - feat(config): trust-on-first-use gate for project-level shell execution ([#3782](https://github.com/gptme/gptme/issues/3782)) ([`dbd5f6173`](https://github.com/gptme/gptme/commit/dbd5f6173))
 - feat(hooks): add guardrail TOOL_CONFIRM hook for headless safety ([#3598](https://github.com/gptme/gptme/issues/3598)) ([#3765](https://github.com/gptme/gptme/issues/3765)) ([`c176aa62d`](https://github.com/gptme/gptme/commit/c176aa62d))
 - feat(server): add /preview/{port}/ proxy for cloud port exposure (gptme-cloud[#910](https://github.com/gptme/gptme/issues/910)) ([#3767](https://github.com/gptme/gptme/issues/3767)) ([`5e6083c91`](https://github.com/gptme/gptme/commit/5e6083c91))
 - feat(memory): add cross-harness lexical recall ([#3740](https://github.com/gptme/gptme/issues/3740)) ([`d4bcf8658`](https://github.com/gptme/gptme/commit/d4bcf8658))
 - feat(tools): add ToolSpec.read_only flag; auto-approve in cli_confirm_hook ([#3733](https://github.com/gptme/gptme/issues/3733)) ([`9573ef16e`](https://github.com/gptme/gptme/commit/9573ef16e))
 - feat(memory): gptme.memory package + gptme-util memory CLI (layered roots, CC-compatible) ([#3735](https://github.com/gptme/gptme/issues/3735)) ([`21334d854`](https://github.com/gptme/gptme/commit/21334d854))
 - feat(shell): stream one-shot command output while it runs ([#3579](https://github.com/gptme/gptme/issues/3579)) ([`e3d15c571`](https://github.com/gptme/gptme/commit/e3d15c571))
 - feat(memory): add memory write tool for cross-runtime memory sharing ([#3638](https://github.com/gptme/gptme/issues/3638)) ([`39810873a`](https://github.com/gptme/gptme/commit/39810873a))
 - feat(dataset): trajectory-to-env pipeline for fine-tuning dataset construction ([#3719](https://github.com/gptme/gptme/issues/3719)) ([`86fc95533`](https://github.com/gptme/gptme/commit/86fc95533))
 - feat(cli): add gptme capabilities export ([#3705](https://github.com/gptme/gptme/issues/3705)) ([`6b7d53d1a`](https://github.com/gptme/gptme/commit/6b7d53d1a))
 - feat(harness): actuate request_tool_change — enable/disable tools mid-session (Phase 2) ([#3656](https://github.com/gptme/gptme/issues/3656)) ([`d3b39582d`](https://github.com/gptme/gptme/commit/d3b39582d))
 - feat(lessons): class-aware dropout for validated_core (Phase 1) ([#3700](https://github.com/gptme/gptme/issues/3700)) ([`fb8a511b5`](https://github.com/gptme/gptme/commit/fb8a511b5))
 - feat(context): add context-scout pre-pass (cheap model identifies relevant files) ([#3692](https://github.com/gptme/gptme/issues/3692)) ([`b5ecb8ff8`](https://github.com/gptme/gptme/commit/b5ecb8ff8))
 - feat(knowledge): inject matching KB entries at session start ([#3678](https://github.com/gptme/gptme/issues/3678)) ([`a89ef54b9`](https://github.com/gptme/gptme/commit/a89ef54b9))
 - feat(providers): complete context compression plugin interface - Phase 2 ([#3613](https://github.com/gptme/gptme/issues/3613)) ([`67de83b77`](https://github.com/gptme/gptme/commit/67de83b77))
 - feat(shell): improve background job control ([#3673](https://github.com/gptme/gptme/issues/3673)) ([`01b6ad50a`](https://github.com/gptme/gptme/commit/01b6ad50a))
 - feat(tools): expose convert as auto-discovered structured tool ([#3659](https://github.com/gptme/gptme/issues/3659)) ([`03529e2fa`](https://github.com/gptme/gptme/commit/03529e2fa))
 - feat(knowledge): cross-session KB save/retrieve as gptme-util CLI ([#3622](https://github.com/gptme/gptme/issues/3622)) ([`b5152917d`](https://github.com/gptme/gptme/commit/b5152917d))
 - feat(service-init): add optional local health probe ([#3665](https://github.com/gptme/gptme/issues/3665)) ([`2ccf2ff02`](https://github.com/gptme/gptme/commit/2ccf2ff02))
 - feat(browser): skip html→markdown when server returns text/markdown ([#3647](https://github.com/gptme/gptme/issues/3647)) ([`0565d1548`](https://github.com/gptme/gptme/commit/0565d1548))
 - feat(doctor): add proxy URL format check (LLM_PROXY_URL) ([#3645](https://github.com/gptme/gptme/issues/3645)) ([`c9193879b`](https://github.com/gptme/gptme/commit/c9193879b))
 - feat(eval): route fable-5 and haiku-4.5 to tool format by default ([#3655](https://github.com/gptme/gptme/issues/3655)) ([`1b23b5fb0`](https://github.com/gptme/gptme/commit/1b23b5fb0))
 - feat(tools): add offline file format conversion tool ([#3595](https://github.com/gptme/gptme/issues/3595)) ([`b04893049`](https://github.com/gptme/gptme/commit/b04893049))
 - feat(ci): use config-driven root structure validator ([#3654](https://github.com/gptme/gptme/issues/3654)) ([`0599fd6da`](https://github.com/gptme/gptme/commit/0599fd6da))
 - feat(memory): load Claude Code memory in gptme workspace context ([#3626](https://github.com/gptme/gptme/issues/3626)) ([`f345aaeaf`](https://github.com/gptme/gptme/commit/f345aaeaf))
 - feat(models): parallel-tool flags from provider docs; eval-format verdict ([#3628](https://github.com/gptme/gptme/issues/3628)) ([`b6a797dc0`](https://github.com/gptme/gptme/commit/b6a797dc0))
 - feat(media): add 32x32-optimized gptme icon (colour + monochrome) ([#3583](https://github.com/gptme/gptme/issues/3583)) ([`3ddaacaab`](https://github.com/gptme/gptme/commit/3ddaacaab))
 - feat(cli): auto-discover local Ollama and LM Studio providers ([#3593](https://github.com/gptme/gptme/issues/3593)) ([`30e4b7f94`](https://github.com/gptme/gptme/commit/30e4b7f94))
 - feat(skills): invoke skills as slash commands (/skill:`<name>`) ([#3587](https://github.com/gptme/gptme/issues/3587)) ([`d22602fb9`](https://github.com/gptme/gptme/commit/d22602fb9))
 - feat(service-init): add launchd support for macOS agents ([#3586](https://github.com/gptme/gptme/issues/3586)) ([`7c52dc6f9`](https://github.com/gptme/gptme/commit/7c52dc6f9))
 - feat(harness): audit assistant harness update requests ([#3529](https://github.com/gptme/gptme/issues/3529)) ([`79750b000`](https://github.com/gptme/gptme/commit/79750b000))
 - feat(cli): add gptme service init scaffold for headless agents ([#3574](https://github.com/gptme/gptme/issues/3574)) ([`d27f98d3a`](https://github.com/gptme/gptme/commit/d27f98d3a))
 - feat(precommit): add check-root-structure hook from gptme-contrib ([#3580](https://github.com/gptme/gptme/issues/3580)) ([`77010664a`](https://github.com/gptme/gptme/commit/77010664a))
 - feat(server): BYOK key validation — warn not block when provider unreachable ([#3569](https://github.com/gptme/gptme/issues/3569)) ([`0fc8208e9`](https://github.com/gptme/gptme/commit/0fc8208e9))
 - feat(shell): opt-in per-shell memory ceiling via GPTME_SHELL_MEMORY_LIMIT ([#3565](https://github.com/gptme/gptme/issues/3565)) ([`7092325b2`](https://github.com/gptme/gptme/commit/7092325b2))
 - feat(computer): allow out-of-tree transports via register_transport() ([#3577](https://github.com/gptme/gptme/issues/3577)) ([`ddb9dea0f`](https://github.com/gptme/gptme/commit/ddb9dea0f))

### 🐛 Fixes (123)
<details><summary>Click to expand</summary>
<p>

 - fix(logmanager): acknowledge completion after transcript barriers ([#3826](https://github.com/gptme/gptme/issues/3826)) ([`f95c7ed13`](https://github.com/gptme/gptme/commit/f95c7ed13))
 - fix(knowledge): fall back to keyword search when RAG returns no live entries ([#3867](https://github.com/gptme/gptme/issues/3867)) ([`e8f0e9989`](https://github.com/gptme/gptme/commit/e8f0e9989))
 - fix(webui): resolve server-relative panel srcs against the instance API origin ([#3861](https://github.com/gptme/gptme/issues/3861)) ([`97fdc483b`](https://github.com/gptme/gptme/commit/97fdc483b))
 - fix(cli): validate non-empty query in context retrieve/search-conversations; catch RuntimeError ([#3852](https://github.com/gptme/gptme/issues/3852)) ([`90d251ce0`](https://github.com/gptme/gptme/commit/90d251ce0))
 - fix(eval): correct main's docstring parameter name and semantics ([#3858](https://github.com/gptme/gptme/issues/3858)) ([`69d02e4ef`](https://github.com/gptme/gptme/commit/69d02e4ef))
 - fix(shell): restore cwd/env after a shell death and tell the model ([#3844](https://github.com/gptme/gptme/issues/3844)) ([`c09a0b3e9`](https://github.com/gptme/gptme/commit/c09a0b3e9))
 - fix(tests): reset leaked shell workspace cwd state between tests ([#3854](https://github.com/gptme/gptme/issues/3854)) ([`55be1b2aa`](https://github.com/gptme/gptme/commit/55be1b2aa))
 - fix(webui): log readable auth-code exchange failure cause ([#3853](https://github.com/gptme/gptme/issues/3853)) ([`9d576ba93`](https://github.com/gptme/gptme/commit/9d576ba93))
 - fix(cli): emit clean error on attest sign --out write failure ([#3850](https://github.com/gptme/gptme/issues/3850)) ([`f32f045c3`](https://github.com/gptme/gptme/commit/f32f045c3))
 - fix(llm): _merge_consecutive must not merge parallel tool results with different call_ids ([#3847](https://github.com/gptme/gptme/issues/3847)) ([`8dc34d3ff`](https://github.com/gptme/gptme/commit/8dc34d3ff))
 - fix(eval): keep token counts on timeout instead of zeroing them ([#3845](https://github.com/gptme/gptme/issues/3845)) ([`53fd88323`](https://github.com/gptme/gptme/commit/53fd88323))
 - fix(shell): wake idle sessions on background completion ([#3843](https://github.com/gptme/gptme/issues/3843)) ([`5fa6b67ef`](https://github.com/gptme/gptme/commit/5fa6b67ef))
 - fix(webui): guard console-proxy injection against cross-origin iframes ([#3840](https://github.com/gptme/gptme/issues/3840)) ([`424bd1df7`](https://github.com/gptme/gptme/commit/424bd1df7))
 - fix(cli): emit clean error on dataset export -o write failure ([#3842](https://github.com/gptme/gptme/issues/3842)) ([`76113984e`](https://github.com/gptme/gptme/commit/76113984e))
 - fix(webui): guard undefined values before toLowerCase calls ([#3841](https://github.com/gptme/gptme/issues/3841)) ([`1541e48c6`](https://github.com/gptme/gptme/commit/1541e48c6))
 - fix(tools): raise ValueError with tool name when init() returns None ([#3835](https://github.com/gptme/gptme/issues/3835)) ([`7775e3f8b`](https://github.com/gptme/gptme/commit/7775e3f8b))
 - fix(init): don't warn when the optional model registry is absent ([#3829](https://github.com/gptme/gptme/issues/3829)) ([`7c8570587`](https://github.com/gptme/gptme/commit/7c8570587))
 - fix(shell): strip shell operators from tokens before sensitive-path check ([#3806](https://github.com/gptme/gptme/issues/3806)) ([#3807](https://github.com/gptme/gptme/issues/3807)) ([`93c337cb5`](https://github.com/gptme/gptme/commit/93c337cb5))
 - fix(llm): use instructions_format["tool"] verbatim for tool-schema descriptions ([#3823](https://github.com/gptme/gptme/issues/3823)) ([`db484f284`](https://github.com/gptme/gptme/commit/db484f284))
 - fix(config): order model layers by specificity, unify resolution ([#3825](https://github.com/gptme/gptme/issues/3825)) ([`d819a9196`](https://github.com/gptme/gptme/commit/d819a9196))
 - fix(config): align CLI model precedence ([#3818](https://github.com/gptme/gptme/issues/3818)) ([`26242d520`](https://github.com/gptme/gptme/commit/26242d520))
 - fix(cli): emit clean error on status -o write failure, auto-mkdir parent ([#3824](https://github.com/gptme/gptme/issues/3824)) ([`7c713aee4`](https://github.com/gptme/gptme/commit/7c713aee4))
 - fix(subagent): deliver subprocess control and capture stderr ([#3819](https://github.com/gptme/gptme/issues/3819)) ([`99eadc0a2`](https://github.com/gptme/gptme/commit/99eadc0a2))
 - fix(shell): scope set -e per block to prevent persistent errexit deaths ([#3810](https://github.com/gptme/gptme/issues/3810)) ([`50d776486`](https://github.com/gptme/gptme/commit/50d776486))
 - fix(gh): dispatch structured 'command' kwarg calls ([#3809](https://github.com/gptme/gptme/issues/3809)) ([`a17e63542`](https://github.com/gptme/gptme/commit/a17e63542))
 - fix(shell): bound captured subprocess output bytes (GPTME_SHELL_MAX_OUTPUT_BYTES) ([#3804](https://github.com/gptme/gptme/issues/3804)) ([`a5d356fa2`](https://github.com/gptme/gptme/commit/a5d356fa2))
 - fix(llm): keep tool_call pairing for unavailable tools; dedupe auto-naming threads ([#3800](https://github.com/gptme/gptme/issues/3800)) ([`a43d56930`](https://github.com/gptme/gptme/commit/a43d56930))
 - fix(shell): parse `time` scripts, stop false syntax errors, unwrap transparent wrappers ([#3803](https://github.com/gptme/gptme/issues/3803)) ([`517771546`](https://github.com/gptme/gptme/commit/517771546))
 - fix(webui): persist demo conversations to sessionStorage to survive reload ([#3796](https://github.com/gptme/gptme/issues/3796)) ([`328c62894`](https://github.com/gptme/gptme/commit/328c62894))
 - fix(llm): honor Retry-After during transient retries ([#3797](https://github.com/gptme/gptme/issues/3797)) ([`9ccf7d0dd`](https://github.com/gptme/gptme/commit/9ccf7d0dd))
 - fix(openrouter): always send data_collection=deny for reasoning models ([#3788](https://github.com/gptme/gptme/issues/3788)) ([`83ea90c65`](https://github.com/gptme/gptme/commit/83ea90c65))
 - fix(memory): read index entries under the root lock ([#3790](https://github.com/gptme/gptme/issues/3790)) ([`d07a89ab1`](https://github.com/gptme/gptme/commit/d07a89ab1))
 - fix: decode editable install file URLs ([#3721](https://github.com/gptme/gptme/issues/3721)) ([`0ab1daac3`](https://github.com/gptme/gptme/commit/0ab1daac3))
 - fix(benchmark): raise cold startup threshold 6.0 → 8.0s for CI noise margin ([#3777](https://github.com/gptme/gptme/issues/3777)) ([`c9f1180aa`](https://github.com/gptme/gptme/commit/c9f1180aa))
 - fix(server): do not execute caller-supplied agent fork commands ([#3783](https://github.com/gptme/gptme/issues/3783)) ([`12a8be9ed`](https://github.com/gptme/gptme/commit/12a8be9ed))
 - fix(shell): bound denylist matches to argument tokens ([#3761](https://github.com/gptme/gptme/issues/3761)) ([`65d888f34`](https://github.com/gptme/gptme/commit/65d888f34))
 - fix(server): detect "No provider configured" as config error in server fallback ([#3784](https://github.com/gptme/gptme/issues/3784)) ([`9e46dee08`](https://github.com/gptme/gptme/commit/9e46dee08))
 - fix(docs/cli): mention subscription auth in no-provider error paths ([#3775](https://github.com/gptme/gptme/issues/3775)) ([`8f8384965`](https://github.com/gptme/gptme/commit/8f8384965))
 - fix(llm): fold non-leading system messages for models that reject them (fixes [#3779](https://github.com/gptme/gptme/issues/3779)) ([#3780](https://github.com/gptme/gptme/issues/3780)) ([`f3f1fce54`](https://github.com/gptme/gptme/commit/f3f1fce54))
 - fix(mcp): run TOOL_CONFIRM guardrails on MCP tool.execute() ([#3776](https://github.com/gptme/gptme/issues/3776)) ([`34f1178e5`](https://github.com/gptme/gptme/commit/34f1178e5))
 - fix(shell): use poll() in _run_with_tty reader ([#3715](https://github.com/gptme/gptme/issues/3715)) ([#3769](https://github.com/gptme/gptme/issues/3769)) ([`b5aec1818`](https://github.com/gptme/gptme/commit/b5aec1818))
 - fix(memory): reject reserved index names ([#3772](https://github.com/gptme/gptme/issues/3772)) ([`88494416b`](https://github.com/gptme/gptme/commit/88494416b))
 - fix(shell): use poll() in background job reader ([#3715](https://github.com/gptme/gptme/issues/3715)) ([#3770](https://github.com/gptme/gptme/issues/3770)) ([`aafe081a6`](https://github.com/gptme/gptme/commit/aafe081a6))
 - fix(codeblock): track triple-quote state in ipython blocks ([#3704](https://github.com/gptme/gptme/issues/3704)) ([#3773](https://github.com/gptme/gptme/issues/3773)) ([`e6d488231`](https://github.com/gptme/gptme/commit/e6d488231))
 - fix(acp): attach host-supplied MCP servers to sessions ([#3771](https://github.com/gptme/gptme/issues/3771)) ([`c10397da4`](https://github.com/gptme/gptme/commit/c10397da4))
 - fix(webui): use Bookmark icon for set-default (not Star — fixes confusion with favorites) ([#3768](https://github.com/gptme/gptme/issues/3768)) ([`e905cf701`](https://github.com/gptme/gptme/commit/e905cf701))
 - fix(webui): only show demo content in explicit demo mode, not on connect ([#3754](https://github.com/gptme/gptme/issues/3754)) ([`8232933cc`](https://github.com/gptme/gptme/commit/8232933cc))
 - fix(webui): drop auth-code bootstrap gate before the connection probe ([#3751](https://github.com/gptme/gptme/issues/3751)) ([`4379da00b`](https://github.com/gptme/gptme/commit/4379da00b))
 - fix(cli): render native tool calls as highlighted source ([#3752](https://github.com/gptme/gptme/issues/3752)) ([`bd8e68526`](https://github.com/gptme/gptme/commit/bd8e68526))
 - fix(webui): stop event-stream banner from flashing on conversation open ([#3753](https://github.com/gptme/gptme/issues/3753)) ([`9f54511ce`](https://github.com/gptme/gptme/commit/9f54511ce))
 - fix(cli): skip root scans and keep path inclusion interruptible ([#3762](https://github.com/gptme/gptme/issues/3762)) ([`797f322b9`](https://github.com/gptme/gptme/commit/797f322b9))
 - fix(cli): reject ambiguous positional resume IDs ([#3763](https://github.com/gptme/gptme/issues/3763)) ([`ddbd6b42e`](https://github.com/gptme/gptme/commit/ddbd6b42e))
 - fix(webui): clear stop flag before edit/rerun/regenerate ([#3744](https://github.com/gptme/gptme/issues/3744)) ([`21125a614`](https://github.com/gptme/gptme/commit/21125a614))
 - fix(codeblock): carry quote state across lines; close exec-lang blocks in streaming ([#3730](https://github.com/gptme/gptme/issues/3730)) ([`af60f3292`](https://github.com/gptme/gptme/commit/af60f3292))
 - fix(onboard): detect OAuth subscription providers ([#3720](https://github.com/gptme/gptme/issues/3720)) ([`62f5e4fa1`](https://github.com/gptme/gptme/commit/62f5e4fa1))
 - fix(cli): show 'gptme `<cmd>`' instead of 'gptme-util `<cmd>`' in error messages ([#3749](https://github.com/gptme/gptme/issues/3749)) ([`cd5e489ba`](https://github.com/gptme/gptme/commit/cd5e489ba))
 - fix(review): explain repository-relative reads in isolated sessions ([#3731](https://github.com/gptme/gptme/issues/3731)) ([`ea22cddc1`](https://github.com/gptme/gptme/commit/ea22cddc1))
 - fix(review-pr): name the offending stdout line when JSONL parsing fails ([#3747](https://github.com/gptme/gptme/issues/3747)) ([`337e0d2f4`](https://github.com/gptme/gptme/commit/337e0d2f4))
 - fix(telemetry): keep startup diagnostics out of JSON stdout ([#3732](https://github.com/gptme/gptme/issues/3732)) ([`7cb63efb7`](https://github.com/gptme/gptme/commit/7cb63efb7))
 - fix(webui): pre-set generating state on new-chat placeholder to collapse microsteps ([#3743](https://github.com/gptme/gptme/issues/3743)) ([`a53524527`](https://github.com/gptme/gptme/commit/a53524527))
 - fix(webui): repair dead conversations-list invalidation after create/delete/import ([#3742](https://github.com/gptme/gptme/issues/3742)) ([`110a4eecd`](https://github.com/gptme/gptme/commit/110a4eecd))
 - fix(webui): suppress 'Cannot reach' banner while auto-connecting ([#3739](https://github.com/gptme/gptme/issues/3739)) ([`b3b4501d4`](https://github.com/gptme/gptme/commit/b3b4501d4))
 - fix(security): strip repo-local execution sinks from git inspection commands ([#3727](https://github.com/gptme/gptme/issues/3727)) ([`b65f699d5`](https://github.com/gptme/gptme/commit/b65f699d5))
 - fix(tools): suppress duplicate terminal output for shell/IPython tools ([#3708](https://github.com/gptme/gptme/issues/3708)) ([`8a176e21d`](https://github.com/gptme/gptme/commit/8a176e21d))
 - fix: reduce lesson/hidden-message log spam in TUI ([#3738](https://github.com/gptme/gptme/issues/3738)) ([`83325b32f`](https://github.com/gptme/gptme/commit/83325b32f))
 - fix(webui): navigate before server response in new-chat flow ([#3729](https://github.com/gptme/gptme/issues/3729)) ([`a87301426`](https://github.com/gptme/gptme/commit/a87301426))
 - fix(cli): clean error on malformed `capabilities --from-json` snapshots ([#3726](https://github.com/gptme/gptme/issues/3726)) ([`e8f7ae2f5`](https://github.com/gptme/gptme/commit/e8f7ae2f5))
 - fix(reduce): cache proactive_summarize_log result by middle-message content hash ([#3620](https://github.com/gptme/gptme/issues/3620)) ([`133a4b567`](https://github.com/gptme/gptme/commit/133a4b567))
 - fix(codeblock): skip depth-1 look-ahead for execution langs (shell, ipython) ([#3703](https://github.com/gptme/gptme/issues/3703)) ([`1e7e5547c`](https://github.com/gptme/gptme/commit/1e7e5547c))
 - fix(logmanager): bound trajectory write amplification ([#3714](https://github.com/gptme/gptme/issues/3714)) ([`d7496cb5c`](https://github.com/gptme/gptme/commit/d7496cb5c))
 - fix(security): upgrade cryptography 46.0.5→50.0.1 and h2 4.3.0→4.4.1 ([#3723](https://github.com/gptme/gptme/issues/3723)) ([`b62ae3a1a`](https://github.com/gptme/gptme/commit/b62ae3a1a))
 - fix(cli,tests): unbreak `models list --json` under warning providers; scope the gh sleep patch ([#3717](https://github.com/gptme/gptme/issues/3717)) ([`002605256`](https://github.com/gptme/gptme/commit/002605256))
 - fix(shell): use poll() instead of select() to survive fds above FD_SETSIZE ([#3716](https://github.com/gptme/gptme/issues/3716)) ([`ebeb21f57`](https://github.com/gptme/gptme/commit/ebeb21f57))
 - fix(cli): handle capabilities output write errors ([#3724](https://github.com/gptme/gptme/issues/3724)) ([`2789cef63`](https://github.com/gptme/gptme/commit/2789cef63))
 - fix(cli): suppress ANSI in redirected tools list ([#3712](https://github.com/gptme/gptme/issues/3712)) ([`a3902b8a0`](https://github.com/gptme/gptme/commit/a3902b8a0))
 - fix(server/tasks): reject invalid task IDs at API routes with 400 ([#3711](https://github.com/gptme/gptme/issues/3711)) ([`582ce5b58`](https://github.com/gptme/gptme/commit/582ce5b58))
 - fix(browser): gate PDF fetches with the shared URL helper ([#3685](https://github.com/gptme/gptme/issues/3685)) ([`d6f9a4724`](https://github.com/gptme/gptme/commit/d6f9a4724))
 - fix(dirs): treat empty/whitespace env vars as unset; guard profile_name ([#3660](https://github.com/gptme/gptme/issues/3660)) ([`f22745729`](https://github.com/gptme/gptme/commit/f22745729))
 - fix(cli): reject negative context tree depth ([#3713](https://github.com/gptme/gptme/issues/3713)) ([`46e6dff06`](https://github.com/gptme/gptme/commit/46e6dff06))
 - fix(telemetry): suppress repeated export errors after first occurrence ([#3707](https://github.com/gptme/gptme/issues/3707)) ([`b1e9f037d`](https://github.com/gptme/gptme/commit/b1e9f037d))
 - fix(server): make /api/v2/server/health unauthenticated for monitoring integrations ([#3702](https://github.com/gptme/gptme/issues/3702)) ([`c5aee1038`](https://github.com/gptme/gptme/commit/c5aee1038))
 - fix(models): stamp default_tool_format on dynamic listing constructors; serialize in model_to_dict ([#3681](https://github.com/gptme/gptme/issues/3681)) ([`8a44e8a03`](https://github.com/gptme/gptme/commit/8a44e8a03))
 - fix(shell): require confirmation for git-credentials and gptme config.toml reads ([#3686](https://github.com/gptme/gptme/issues/3686)) ([`3a929b4d0`](https://github.com/gptme/gptme/commit/3a929b4d0))
 - fix(knowledge): don't block on gptme-rag index after save/delete ([#3691](https://github.com/gptme/gptme/issues/3691)) ([`63cb9f24d`](https://github.com/gptme/gptme/commit/63cb9f24d))
 - fix(llm): stop double-retrying and survive 429s in interactive mode ([#3669](https://github.com/gptme/gptme/issues/3669)) ([`7294393dc`](https://github.com/gptme/gptme/commit/7294393dc))
 - fix(util): handle embedded nulls in batch prompts ([#3682](https://github.com/gptme/gptme/issues/3682)) ([`f8354a042`](https://github.com/gptme/gptme/commit/f8354a042))
 - fix(webui): gate task creation in demo mode ([#3684](https://github.com/gptme/gptme/issues/3684)) ([`b84ee8a3a`](https://github.com/gptme/gptme/commit/b84ee8a3a))
 - fix(llm): pin Codex session_id to conversation instead of uuid4 per turn ([#3679](https://github.com/gptme/gptme/issues/3679)) ([`9f607ea2d`](https://github.com/gptme/gptme/commit/9f607ea2d))
 - fix(server): return 400, not 500, for non-dict JSON bodies on tools QUERY and steer ([#3676](https://github.com/gptme/gptme/issues/3676)) ([`77661b958`](https://github.com/gptme/gptme/commit/77661b958))
 - fix(convert): handle non-UTF-8 converter stderr without crashing ([#3677](https://github.com/gptme/gptme/issues/3677)) ([`f5ae30fcf`](https://github.com/gptme/gptme/commit/f5ae30fcf))
 - fix(prompts): move profile system prompts before cache boundary (Phases 2+3) ([#3616](https://github.com/gptme/gptme/issues/3616)) ([`b8501f86c`](https://github.com/gptme/gptme/commit/b8501f86c))
 - fix(models): per-model parallel-tool opt-out via PARALLEL_TOOL_CALL_EXCEPTIONS ([#3633](https://github.com/gptme/gptme/issues/3633)) ([`1a1a3f8cf`](https://github.com/gptme/gptme/commit/1a1a3f8cf))
 - fix(cli): suppress all shortcut dispatch after double dash ([#3670](https://github.com/gptme/gptme/issues/3670)) ([`59ca891e7`](https://github.com/gptme/gptme/commit/59ca891e7))
 - fix: match Claude Code's cwd→project-dir encoding (CC memory + agent hook) ([#3672](https://github.com/gptme/gptme/issues/3672)) ([`dc593da2c`](https://github.com/gptme/gptme/commit/dc593da2c))
 - fix(cli): reject unknown bare --model names before get_prompt() ([#3640](https://github.com/gptme/gptme/issues/3640)) ([`f4d71ca6a`](https://github.com/gptme/gptme/commit/f4d71ca6a))
 - fix(security): route git subprocesses through GIT_CMD in review-pr and 3-way merge ([#3674](https://github.com/gptme/gptme/issues/3674)) ([`00fe1fef5`](https://github.com/gptme/gptme/commit/00fe1fef5))
 - fix(tests): join subagent threads before teardown in TestParentContextForwarding ([#3675](https://github.com/gptme/gptme/issues/3675)) ([`8213fe835`](https://github.com/gptme/gptme/commit/8213fe835))
 - fix(config): workspace fallback must not use process cwd (P1 follow-up from [#3639](https://github.com/gptme/gptme/issues/3639)) ([#3657](https://github.com/gptme/gptme/issues/3657)) ([`9db4f880b`](https://github.com/gptme/gptme/commit/9db4f880b))
 - fix(cli): forward nested help to utility shortcuts ([#3630](https://github.com/gptme/gptme/issues/3630)) ([`e8028b797`](https://github.com/gptme/gptme/commit/e8028b797))
 - fix(browser): harden lynx URL validation ([#3663](https://github.com/gptme/gptme/issues/3663)) ([`78ff262b9`](https://github.com/gptme/gptme/commit/78ff262b9))
 - fix(shell): route all commands through TOOL_CONFIRM hook chain (closes [#3598](https://github.com/gptme/gptme/issues/3598)) ([#3636](https://github.com/gptme/gptme/issues/3636)) ([`d4a6b8f65`](https://github.com/gptme/gptme/commit/d4a6b8f65))
 - fix(convert): register gptme-convert console script and fix error message ([#3658](https://github.com/gptme/gptme/issues/3658)) ([`1ad650ae3`](https://github.com/gptme/gptme/commit/1ad650ae3))
 - fix(tests): give subagent thread-join guard a real liveness budget ([#3662](https://github.com/gptme/gptme/issues/3662)) ([`c574b83d3`](https://github.com/gptme/gptme/commit/c574b83d3))
 - fix(tests): stop pytest-retry x tmp_path teardown KeyError failing green runs ([#3661](https://github.com/gptme/gptme/issues/3661)) ([`c922c9b38`](https://github.com/gptme/gptme/commit/c922c9b38))
 - fix(compat): improve Windows and cross-platform compatibility in tools and tests ([#3639](https://github.com/gptme/gptme/issues/3639)) ([`7e7430428`](https://github.com/gptme/gptme/commit/7e7430428))
 - fix(status): serialize list/dict provider values as JSON in table format ([#3651](https://github.com/gptme/gptme/issues/3651)) ([`9b1d7fb06`](https://github.com/gptme/gptme/commit/9b1d7fb06))
 - fix(cli): support stdin dash in slop check ([#3650](https://github.com/gptme/gptme/issues/3650)) ([`958ca6b47`](https://github.com/gptme/gptme/commit/958ca6b47))
 - fix(tests): assert webui html hint by content, not by index ([#3635](https://github.com/gptme/gptme/issues/3635)) ([`3a2af3318`](https://github.com/gptme/gptme/commit/3a2af3318))
 - fix(tests): scope pytest timeouts to the function so retries can't INTERNALERROR the run ([#3634](https://github.com/gptme/gptme/issues/3634)) ([`f636b9f70`](https://github.com/gptme/gptme/commit/f636b9f70))
 - fix(server): preserve webui html hint on config patch ([#3521](https://github.com/gptme/gptme/issues/3521)) ([`91caf5fd6`](https://github.com/gptme/gptme/commit/91caf5fd6))
 - fix(prompts): keep volatile context after cache boundary ([#3615](https://github.com/gptme/gptme/issues/3615)) ([`476e8f7a4`](https://github.com/gptme/gptme/commit/476e8f7a4))
 - fix(models): propagation gap + default_tool_format for OpenAI-compat providers ([#3566](https://github.com/gptme/gptme/issues/3566)) ([`6a20ca2ed`](https://github.com/gptme/gptme/commit/6a20ca2ed))
 - fix(webui): recover local-server bearer handshake after [#3430](https://github.com/gptme/gptme/issues/3430) ([#3606](https://github.com/gptme/gptme/issues/3606)) ([`717df0715`](https://github.com/gptme/gptme/commit/717df0715))
 - fix(webui): stabilize multi-server query results ([#3602](https://github.com/gptme/gptme/issues/3602)) ([`ea78d4658`](https://github.com/gptme/gptme/commit/ea78d4658))
 - fix(server): use os.write() and re-entrance guard in SIGTERM handlers ([#3623](https://github.com/gptme/gptme/issues/3623)) ([`13284c336`](https://github.com/gptme/gptme/commit/13284c336))
 - fix(server): guard startup SIGTERM handler against overriding custom handlers ([#3597](https://github.com/gptme/gptme/issues/3597)) ([`69ad48725`](https://github.com/gptme/gptme/commit/69ad48725))
 - fix(server): treat missing X display as screenshot-unavailable ([#3612](https://github.com/gptme/gptme/issues/3612)) ([`2e571b362`](https://github.com/gptme/gptme/commit/2e571b362))
 - fix(server): don't let step() finally clear a continuation reservation ([#3592](https://github.com/gptme/gptme/issues/3592)) ([`a46d9ea20`](https://github.com/gptme/gptme/commit/a46d9ea20))
 - fix(service-init): make the scaffolded agent actually run gptme ([#3609](https://github.com/gptme/gptme/issues/3609)) ([`7641c015f`](https://github.com/gptme/gptme/commit/7641c015f))
 - fix(server): install SIGTERM handler before slow init to prevent silent failure ([#3591](https://github.com/gptme/gptme/issues/3591)) ([`3cd609a9f`](https://github.com/gptme/gptme/commit/3cd609a9f))
 - fix(precommit): update gptme-contrib rev to post-[#1479](https://github.com/gptme/gptme/issues/1479) merge ([#3584](https://github.com/gptme/gptme/issues/3584)) ([`904de13a1`](https://github.com/gptme/gptme/commit/904de13a1))
 - fix(tauri): include pyproject.toml and lock file in sidecar freshness check ([#3573](https://github.com/gptme/gptme/issues/3573)) ([`fe99c6635`](https://github.com/gptme/gptme/commit/fe99c6635))
 - fix(android): open cloud sign-in in the system browser, not the app WebView ([#3578](https://github.com/gptme/gptme/issues/3578)) ([`f206f94a5`](https://github.com/gptme/gptme/commit/f206f94a5))

</p>
</details>

### 🔨 Misc (42)
<details><summary>Click to expand</summary>
<p>

 - chore: bump version to 0.34.0 ([`5a8912b64`](https://github.com/gptme/gptme/commit/5a8912b64))
 - docs: position cross-harness memory in README and site (closes [#3734](https://github.com/gptme/gptme/issues/3734) item 8) ([#3871](https://github.com/gptme/gptme/issues/3871)) ([`3fb432ce7`](https://github.com/gptme/gptme/commit/3fb432ce7))
 - docs: point the hooks comment at the subagent package ([#3859](https://github.com/gptme/gptme/issues/3859)) ([`4fb6a6c86`](https://github.com/gptme/gptme/commit/4fb6a6c86))
 - refactor(webui): extract presentational PromptTextarea shell from ChatInput ([#3872](https://github.com/gptme/gptme/issues/3872)) ([`d78b94314`](https://github.com/gptme/gptme/commit/d78b94314))
 - chore: move root-structure allowlist under .github and drop gptme-extension tombstone ([#3868](https://github.com/gptme/gptme/issues/3868)) ([`47cdf776c`](https://github.com/gptme/gptme/commit/47cdf776c))
 - test(shell): pin no-retry invariant by watching stdin writes after EPIPE ([#3860](https://github.com/gptme/gptme/issues/3860)) ([`08ce4995b`](https://github.com/gptme/gptme/commit/08ce4995b))
 - test(webui): cap jest maxWorkers at 4 to prevent container thrash ([#3862](https://github.com/gptme/gptme/issues/3862)) ([`b827a9db4`](https://github.com/gptme/gptme/commit/b827a9db4))
 - docs: fix a TOC anchor and the moved-extension link ([#3857](https://github.com/gptme/gptme/issues/3857)) ([`d33d60647`](https://github.com/gptme/gptme/commit/d33d60647))
 - test(llm): strip ANSI codes before asserting IPython source in terminal output ([#3856](https://github.com/gptme/gptme/issues/3856)) ([`e81224353`](https://github.com/gptme/gptme/commit/e81224353))
 - docs: add CITATION.cff and a Citation section to README ([#3855](https://github.com/gptme/gptme/issues/3855)) ([`dff9d0e33`](https://github.com/gptme/gptme/commit/dff9d0e33))
 - test(lessons): stop seeding the global RNG in dropout tests ([#3851](https://github.com/gptme/gptme/issues/3851)) ([`e60462be2`](https://github.com/gptme/gptme/commit/e60462be2))
 - refactor(shell): background whole tool calls and fix exit stalls ([#3802](https://github.com/gptme/gptme/issues/3802)) ([`3411afec5`](https://github.com/gptme/gptme/commit/3411afec5))
 - docs(readme): refresh demos with current screenshots and better asciinema thumbnails ([#3837](https://github.com/gptme/gptme/issues/3837)) ([`deb26dc71`](https://github.com/gptme/gptme/commit/deb26dc71))
 - docs: update timeline and README news through September 2026 ([#3836](https://github.com/gptme/gptme/issues/3836)) ([`be6e3b256`](https://github.com/gptme/gptme/commit/be6e3b256))
 - docs(readme): replace broken starchart.cc chart with gptme/stats ([#3838](https://github.com/gptme/gptme/issues/3838)) ([`d8f5720d9`](https://github.com/gptme/gptme/commit/d8f5720d9))
 - docs(contributing): note toolchain drift between venv, lockfile and hooks ([#3830](https://github.com/gptme/gptme/issues/3830)) ([`f3b9c64bc`](https://github.com/gptme/gptme/commit/f3b9c64bc))
 - docs: restructure navigation and page structure ([#3813](https://github.com/gptme/gptme/issues/3813)) ([`d4c57d992`](https://github.com/gptme/gptme/commit/d4c57d992))
 - test(memory): assert legacy reads stay bounded ([#3815](https://github.com/gptme/gptme/issues/3815)) ([`13be6aabf`](https://github.com/gptme/gptme/commit/13be6aabf))
 - refactor(shell): parse Bash with tree-sitter and retain legacy fallback ([#3808](https://github.com/gptme/gptme/issues/3808)) ([`4a7aff453`](https://github.com/gptme/gptme/commit/4a7aff453))
 - docs: rewrite finetuning page as a working, measured recipe ([#3778](https://github.com/gptme/gptme/issues/3778)) ([`7bcd9ae61`](https://github.com/gptme/gptme/commit/7bcd9ae61))
 - ux: hint how to enable disabled-by-default tool in error message ([#3748](https://github.com/gptme/gptme/issues/3748)) ([`9a0c2408a`](https://github.com/gptme/gptme/commit/9a0c2408a))
 - test(webui): exercise live auto-connect banner transition ([#3741](https://github.com/gptme/gptme/issues/3741)) ([`f184a1532`](https://github.com/gptme/gptme/commit/f184a1532))
 - docs(readme): tag gptme.ai acquisition link ([#3725](https://github.com/gptme/gptme/issues/3725)) ([`43786e7da`](https://github.com/gptme/gptme/commit/43786e7da))
 - docs: separate agent runtimes from providers ([#3694](https://github.com/gptme/gptme/issues/3694)) ([`076e433cc`](https://github.com/gptme/gptme/commit/076e433cc))
 - docs: add core domain guide ([#3690](https://github.com/gptme/gptme/issues/3690)) ([`de6dd04fb`](https://github.com/gptme/gptme/commit/de6dd04fb))
 - test(codeblock): load fixture files with pathlib so tests pass on Windows ([#3637](https://github.com/gptme/gptme/issues/3637)) ([`5d40b35dc`](https://github.com/gptme/gptme/commit/5d40b35dc))
 - docs: point the free on-ramp at live OpenRouter models ([#3671](https://github.com/gptme/gptme/issues/3671)) ([`d94dbe1bd`](https://github.com/gptme/gptme/commit/d94dbe1bd))
 - docs(mcp): surface bidirectional server support in README ([#3664](https://github.com/gptme/gptme/issues/3664)) ([`5039ad147`](https://github.com/gptme/gptme/commit/5039ad147))
 - docs(providers): link template and add integration FAQ ([#3649](https://github.com/gptme/gptme/issues/3649)) ([`5a972d4f9`](https://github.com/gptme/gptme/commit/5a972d4f9))
 - refactor(autocompact): rename /compact modes to 'trim' and 'summarize' ([#3621](https://github.com/gptme/gptme/issues/3621)) ([`6c0a3f57d`](https://github.com/gptme/gptme/commit/6c0a3f57d))
 - docs(getting-started): add free cloud providers section (OpenRouter, Gemini, Groq) ([#3631](https://github.com/gptme/gptme/issues/3631)) ([`fc98c881a`](https://github.com/gptme/gptme/commit/fc98c881a))
 - refactor(agent-cmd): clarify scan scope and add create cross-references ([#3619](https://github.com/gptme/gptme/issues/3619)) ([`19e03514f`](https://github.com/gptme/gptme/commit/19e03514f))
 - test(webui): add opt-in vision_assert helper for generation E2E ([#3607](https://github.com/gptme/gptme/issues/3607)) ([`dba4af2c3`](https://github.com/gptme/gptme/commit/dba4af2c3))
 - docs: add curated skills gallery page to gptme.org ([#3605](https://github.com/gptme/gptme/issues/3605)) ([`170d87681`](https://github.com/gptme/gptme/commit/170d87681))
 - refactor(service-init): consolidate and document gptme-agent-template reference ([#3614](https://github.com/gptme/gptme/issues/3614)) ([`e7107777e`](https://github.com/gptme/gptme/commit/e7107777e))
 - docs(hooks): document TOOL_CONFIRM deny semantics and return contract ([#3611](https://github.com/gptme/gptme/issues/3611)) ([`0e3fb1aa7`](https://github.com/gptme/gptme/commit/0e3fb1aa7))
 - test(subagent): de-flake test_subagent_wait_polls_cache_after_join_timeout ([#3610](https://github.com/gptme/gptme/issues/3610)) ([`fccc316f4`](https://github.com/gptme/gptme/commit/fccc316f4))
 - docs(plugins): fix hook type names and add TOOL_CONFIRM guardrail example ([#3608](https://github.com/gptme/gptme/issues/3608)) ([`0b1897cf1`](https://github.com/gptme/gptme/commit/0b1897cf1))
 - docs: add headless agents section with gptme service init example ([#3588](https://github.com/gptme/gptme/issues/3588)) ([`a4d403a91`](https://github.com/gptme/gptme/commit/a4d403a91))
 - test(server): add subprocess integration test for server startup ([#3589](https://github.com/gptme/gptme/issues/3589)) ([#3590](https://github.com/gptme/gptme/issues/3590)) ([`6e4e0015b`](https://github.com/gptme/gptme/commit/6e4e0015b))
 - test(webui): add regression test for BYOK 422 invalid-key rejection ([#3545](https://github.com/gptme/gptme/issues/3545)) ([#3581](https://github.com/gptme/gptme/issues/3581)) ([`b36c05f41`](https://github.com/gptme/gptme/commit/b36c05f41))
 - docs: document subscription auth (ChatGPT Plus/Pro, SuperGrok) in README and providers docs ([#3582](https://github.com/gptme/gptme/issues/3582)) ([`433f47f28`](https://github.com/gptme/gptme/commit/433f47f28))

</p>
</details>

*(excluded 7 less relevant [commits](https://github.com/gptme/gptme/compare/v0.33.0...v0.34.0))*

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