v0.35.0#

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

Contributors#

Thanks to everyone who contributed to this release:

@erikbjare, @harimaruthachalam, @jaideeppyne, @Thibaultjaigu, @TimeToBuildBob, @vanshtaneja23

Changelog#

Changes since v0.34.0:

📦 gptme#

✨ Features (61)#

  • feat(shell): memory guard kills the agent’s largest command when system memory runs low (#4348) (6aa340f35)

  • feat(tui): queued prompts steer the running turn at its next step (#4346) (e4fb3d976)

  • feat(tui,ipython): Ctrl+C stops a running tool in the TUI; ipython cells time out (#4354) (d8a54a974)

  • feat(tui): show the running tool call, its elapsed time and timeout (#4344) (804273354)

  • feat(lessons): capture private final-item evidence for precision readouts (#4340) (ffd45727c)

  • feat(tui): command-driven status line ([tui] statusline) (#4339) (3160b45f1)

  • feat(context): add max_tokens to ContextSelectorConfig; use it in LLMSelector (#4336) (c4f1e463d)

  • feat(lessons): record final native context emissions (#4328) (47673511b)

  • feat(compaction): record ‘chunked’ and ‘native’ methods in compaction.jsonl (#4318) (7413443fc)

  • feat(compaction): summarize overflowed history in fresh-context chunks (#4309) (fe24c6c0c)

  • feat(lessons): add optional GPTME_LESSONS_MAX_PER_TURN limit (#4294) (7835c616f)

  • feat(server): apply model default_tool_format when webui omits tool_format (#4245) (3e9169958)

  • feat(compaction): capability-gated Anthropic native compaction with signed-block replay (Phase 2) (#4244) (6fe8ad4e1)

  • feat(lessons): add opt-in shared selector command adapter (#4283) (6b4338cfc)

  • feat(site): add gptme.org/stats/ page from gptme/stats (#4279) (381c29320)

  • feat(config): persist –agent-profile and re-apply it on resume (#4040) (9511db3b7)

  • feat(eval): add constraint-satisfaction eval suite (#4082) (4a9eb56ad)

  • feat(server): share auto-generated token with local clients via token file (#4061) (6fdbc7bac)

  • feat(compaction): run checkpoint through normal tool loop (#4223) (56ae66070)

  • feat(models): register Mistral Large 4 (#4229) (83401e8bf)

  • feat(compaction): remind normal tool loop before context budget (#4174) (021e57777)

  • feat(webui): expose server-owned global MCP settings (#4218) (945cc4da9)

  • feat(server): structured GET/PUT /api/v2/user/config/mcp for global MCP config (#4095) (b8c8527c9)

  • feat(util): add gptme-util sound to play notification sounds from other harnesses (#4205) (70dab56ff)

  • feat(hooks): behavioral anomaly watchdog — scope_escape, write_storm, novel_host (#3953) (3c8408463)

  • feat(subagent): context_mode=fork, per-call reasoning_effort, usage reporting (#4096) (101b8a7e4)

  • feat(compaction): Phase 2 — compact_instructions, keep_recent, structured checkpoint (#3812) (#3966) (e632523b5)

  • feat(watch): refuse sleep-N polling chains in the shell while watch is loaded (#4094) (b3eacfcab)

  • feat(llm): client-side degeneration guard for OpenRouter streams (#4034) (9f1697c21)

  • feat(webui): thread sseToken through to ApiClient EventSource ?token= (#4035) (7f172f7fe)

  • feat(eval): add OpenShellExecutionEnv with kernel-enforced policy isolation (#4027) (e549e7cf6)

  • feat(llm): attribute OpenRouter serving provider from response body (#4031) (43b17c69d)

  • feat(llm): record provider-served model in message metadata (#4026) (852ddc4f8)

  • feat(eval): Phase 0 pruning evaluation script (#3997) (#4021) (86f3ff7c6)

  • feat(autocompact): shadow/dry-run ledger for Phase-0 evaluation (#4015) (39a4b894f)

  • feat(site): port the landing prompt scroller to gptme.org (#4018) (5fca02f3f)

  • feat(plugins): isolate failures and validate plugin contracts (#4010) (1f093d2cf)

  • feat(watch): arm event sources and get woken when they fire (#3987) (08347b887)

  • feat(autocompact): relevance-scored pruning of stale tool outputs (Phase 0) (#4013) (842a2b1ff)

  • feat(compaction): cap long-window context budgets (#3973) (c41a3802a)

  • feat(doctor): validate plugin tool init() contracts in isolation (#3881) (3471bf259)

  • feat(identity): read neutral AGENT_SESSION_ID before BOB_SESSION_ID (#3963) (80ea18e0b)

  • feat(webui): apply configured role colors (#4004) (a171781af)

  • feat(tauri): LAN access settings panel with QR code — Phase 2 (#3958) (353898ec3)

  • feat: [agent].color and [user].color for names in the CLI and TUI (#3977) (7a2cb0e93)

  • feat(restart): switch interface with /restart cli|tui|web (#3990) (58e81a299)

  • feat(tui): accept prompts on the command line, like the CLI (#3980) (4e2816b81)

  • feat(tui): –resume [NAME]: pick from a list, or open NAME directly (#3971) (5a8447560)

  • feat(tui): collapse long pastes into atomic placeholder tokens (#3972) (77e2a5daf)

  • feat(tools): URL host allowlist for autonomous web access (#3954) (e14e96743)

  • feat(compaction): Phase 1 — one budget, always-on trigger, no per-call mutation (#3812) (#3895) (c0a08f821)

  • feat(providers): make api_key_env optional in ProviderPlugin (#3957) (b41335250)

  • feat(tauri): LAN QR access backend — Phase 1 (#3947) (9da3f45f4)

  • feat(server): forward temperature and top_p request overrides to provider (#3942) (00df83152)

  • feat(webui): add provider health dot badge to model picker label (#3917) (c377ecf71)

  • feat(webui): subscription provider setup (ChatGPT/Grok/OpenRouter PKCE) (#3912) (fc2951579)

  • feat(models): add GPT-6 Sol and GPT-6 Luna to OpenAI model registry (#3914) (d22c3f271)

  • feat(subagent): deliver completions to idle server sessions (#3897) (1a0e76109)

  • feat(shell): promote slow foreground commands (#3898) (4b15dfc11)

  • feat(compaction): recover once from provider context overflow (#3816) (0e4ef82bd)

  • feat(doctor): add interactive provider repair (#3891) (7e382b139)

🐛 Fixes (217)#

Click to expand

  • fix(compact): keep the last message, default to summarize, no-op trim says so (#4371) (f1cf26c76)

  • fix(tools): declare undeclared kwargs params; add conformance test (#4366) (f34595c08)

  • fix(tui): use Markdown widget for prose segments to stop layout jump at finalize (#4364) (ba1266910)

  • fix(e2e): fix flaky sidebar tests broken by virtualization scroll-to-bottom (#4362) (b9465faae)

  • fix(tui): show message and tool indicator before tool execution begins (#4347) (3c06e73c6)

  • fix(tui): compact, readable markdown headers in messages (#4358) (a539998e1)

  • fix(tui): drop duplicate _generation_thread declaration (#4344 + #4354) (#4361) (cfab89ad1)

  • fix(tui): handle <think redacted> tags from Anthropic extended thinking (#4345) (274053684)

  • fix(tui): body mode in _update_hidden_segments when show_thinking=True (#4356) (bd96a8016)

  • fix(shell): only block pipes that feed an interpreter its program (#4350) (f0c586178)

  • fix(tui): ignore a statusline result that arrives after the screen is gone (#4357) (64bf8c817)

  • fix(webui): don’t show model selector skeleton pill on home page (#4349) (f70bafa8b)

  • fix(webui): move embedded keyboard shortcuts into account menu (#4343) (d51ee35d3)

  • fix(tui): statusline payload says ‘<no model set>’ instead of None (#4352) (ddf4d42cd)

  • fix(llm): bound selector input and actual provider requests (#4341) (b4d3f35e5)

  • fix(tui): stream tool-call blocks as collapsed stubs to prevent layout jumps (#4342) (785864972)

  • fix(config): accept CSS color names like ‘pink’ for [agent]/[user] color (#4337) (463aa34f6)

  • fix(tui): render assistant message in place, no preview→final swap (#4334) (49472c7f2)

  • fix(webui): patch 7 transitive dependabot alerts in package-lock.json (#4333) (955bb55d1)

  • fix(context): stop attaching bare words that match cwd entries; add TUI path completion (#4329) (35fff805d)

  • fix(tui): run slash-commands in a worker so slow ones don’t freeze the UI (#4330) (2ac769218)

  • fix(context): don’t crash on ‘~word’ prose; include_paths never crashes a prompt (#4326) (1dbdfad6b)

  • fix(context): don’t crash on ‘~word’ prose; include_paths never crashes a prompt (#4326) (b1de5fe9a)

  • fix(tui): don’t crash on a click that hits a just-removed widget (#4323) (fb2b9deed)

  • fix(tui): don’t crash when a prompt contains a URL (#4320) (cb36d2081)

  • fix(docs): fix garbled provider integration table and lint grid table alignment (#4312) (9162d6ef9)

  • fix(tauri): bump rustls to 0.23.45 and serde_with to 3.21.0 in Cargo.lock (#4308) (fff2c75a1)

  • fix(release): fail closed on partial API errors in default shell (#4310) (8bd8a4be1)

  • fix(release): only count push-triggered checks in release preflight (#4305) (6348d7895)

  • fix(deps): switch Dependabot pip → uv ecosystem for root Python deps (#4295) (198742898)

  • fix(models): apply OpenRouter pricing.overrides long-context tiers to cost accounting (#4272) (d694cbc61)

  • fix(mcp): alias qualified tool names for native providers (#4265) (a8a9feeac)

  • fix(tauri): use platform-correct URL in IPC test helper for tauri 2.12 (#4288) (b6e4e7278)

  • fix(server): return empty list for /api/v2/external-sessions when provider unconfigured (#4281) (2062db709)

  • fix(context): fall back to rule-based pre-filter when LLM refinement reply is malformed (#4291) (ca5da494d)

  • fix(mcp): drop the closed client from the registry before reconnecting in _restart_mcp_client (#4292) (411276ae6)

  • fix(context): fall back when selector replies are malformed (#4282) (375c863af)

  • fix(slop): print suppression notice to stderr when –no-fail overrides a FAIL verdict (#4280) (810112bfa)

  • fix(llm): replay Gemini thought signatures on native tool calls (#4276) (5dbbacc68)

  • fix(docs): exclude gptme-contrib from linkcheck to prevent recurring 429s (#4275) (28b9518c5)

  • fix(shell): use incremental UTF-8 decoder in BackgroundJob (#4269) (3c18c09a8)

  • fix(models): remove retired Qwen3 Max OpenRouter entry (#4268) (5b0e5fb9d)

  • fix(gh): preserve explicit repository in native run log retrieval (#4271) (b648113b8)

  • fix(eventlog): recover correctly after a damaged compacted tail (#4249) (0ddbb90f5)

  • fix(docs): skip crawler-throttled GitHub topic links (#4248) (b1af28ed8)

  • fix(server): honor TOOL_FORMAT and parse native tool calls in steps (#4243) (1464b2586)

  • fix(server): reject an exhausted stream with no output instead of persisting an empty assistant turn (#4239) (15210e96b)

  • fix(compaction): reland #4224-#4226 that merged into a stacked branch (#4236) (b5dfecf85)

  • fix(test): use column check instead of substring check in test_shell_session_records_its_pgid (#4241) (f7d38b582)

  • fix(logmanager): handle same-process Windows conversation locks (#3848) (2714e3345)

  • fix(llm): retry plain APIError from in-stream error events (#4074) (bd4a8b4d4)

  • fix(subagent): cap thread-mode subagent LLM request timeout by remaining deadline (#4208) (080097767)

  • fix(openai-responses): drop orphaned tool results with no preceding call (#4207) (05e4508dc)

  • fix(anthropic): pass an explicit timeout so non-streaming chat() accepts 64k+ max_tokens (#4221) (6f4e95081)

  • fix(mcp): preserve complete search queries (#4235) (cad7a5245)

  • fix(llm): reject an exhausted stream with no output instead of persisting an empty assistant turn (#4222) (d538cbf49)

  • fix(ci): retry apt-get update up to 3 times with timeout (#4231) (1dffc3aa9)

  • fix(cli): clean errors for non-UTF-8 input files (tokens count, attest verify, capabilities) (#4176) (35663e34f)

  • fix(compaction): re-compaction carries the previous checkpoint and drops stale intros (#4183) (3502854c5)

  • fix(cli): keep plugin subcommand args opaque to gptme’s own options (#4220) (3f5aa436e)

  • fix(mcp): load_mcp_server now registers ToolSpecs and updates cache (#4215) (f0927eb65)

  • fix(context): skip unreadable files in prompt path inclusion instead of crashing (#4185) (d2ec08d12)

  • fix(init): report invalid gptme-init targets as clean errors (#4173) (c4ecb8183)

  • fix(tokens): warn when model has no native tiktoken encoding (#4196) (a7509a5a0)

  • fix(webui): navigate before clearing store on conversation delete (#4209) (a0705c188)

  • fix(chats): skip malformed external sessions instead of aborting the search (#4192) (e790ad183)

  • fix(read): stream line ranges of large files instead of loading them whole (#4191) (f4f3205dc)

  • fix(context): read only the capped prefix of large files named in a prompt (#4187) (ada33c3b8)

  • fix(models-info): exit 1 when model resolves to unknown provider (#4210) (16ada496c)

  • fix(computer): audit-log sees keyword/positional computer() calls via AST (#4203) (01f7e6b3f)

  • fix(anti-slop): use fractional em-dash excess so short texts aren’t over-penalised (#4195) (63e651b2a)

  • fix(lessons): coerce non-string frontmatter name to str (#4181) (16cfbdd82)

  • fix(slop): lower STACCATO_MAX_WORDS 8→7 to fix false positive on technical doc sentences (#4211) (65c778b6c)

  • fix(init): escape project name when writing gptme.toml (#4175) (461a603d4)

  • fix(cli): tolerate non-UTF-8 .gitignore and journal files in context commands (#4177) (6e1600fb3)

  • fix(config): reject non-list prompt.files and other string-list project settings (#4179) (da489220b)

  • fix(agents): don’t attribute the newest log dir to unnamed gptme processes (#4189) (59db3b19e)

  • fix(chats): reject blank and normalize multi-line names in chats rename (#4198) (3858b248e)

  • fix(save): refuse non-regular-file targets instead of hanging on a FIFO (#4190) (472e98a4d)

  • fix(llm): use NOT_GIVEN timeout in Anthropic non-streaming chat() (#4064) (4885cb0be)

  • fix(logmanager): skip corrupt conversation lines instead of failing the whole read (#4182) (14b9387b5)

  • fix(message): don’t append ellipsis to short oneline messages (#4197) (7454b0f29)

  • fix(hooks): reject malformed Claude Code settings.json instead of crashing (#4178) (fa1842a4f)

  • fix(ci): disable provenance attestation on Docker push to fix GHCR unknown blob (#4202) (a6ce80cdb)

  • fix(openai-responses): clamp instructions to 1MB char cap for Responses API (#4206) (4f2303ce8)

  • fix(openai-subscription): clamp Codex instructions to 1MB char cap (#4166) (db903ba37)

  • fix(cli): reject unknown –provider in models list instead of listing nothing (#4184) (d56550f12)

  • fix(preview): send Cache-Control private, no-store on preview responses (#4180) (c5c520913)

  • fix(llm): accept mixed-case image attachment extensions (#4171) (536e6c379)

  • fix(telemetry): use Fable 5.1 cached-input pricing (#4126) (7bf274124)

  • fix(compaction): reject empty summarize checkpoints instead of replacing history (#4172) (ce5ed9f22)

  • fix(responses): surface explicit SSE generation failures (#4170) (a990d028e)

  • fix(anthropic): register Claude 5 models and use supported thinking modes (#4125) (0939c341d)

  • fix(compaction): share bounded overflow recovery across CLI and server (#4123) (4dab17fb8)

  • fix(cli): warn on stderr when prompts expand path not found (#3943) (127dc5c91)

  • fix(webui): keep welcome view reachable on short/mobile viewports (#4056) (36ada30f8)

  • fix(llm): raise on Responses API error/response.failed events, warn on incomplete (#4084) (c507599ae)

  • fix(server): evict idle client-less sessions unconditionally (#4067) (968f8b381)

  • fix(models): concise provider errors and parallel fetch in models list (#4062) (b7eb9f51c)

  • fix(browser): configure executable independently of engine (#4168) (546e88ab0)

  • fix(subagent): kill the child’s persistent shells when escalating to SIGKILL (#4097) (801f20062)

  • fix(webui): gate sidebar external-sessions query on server capability (#4148) (fec0bec44)

  • fix(webui): anchor toasts at the top so they never cover the composer (#4149) (4ea9068d0)

  • fix(telemetry): account for explicit OpenRouter cache-read prices (#4151) (2992c9a6f)

  • fix(hooks): make deprecated knowledge injection opt in (#4160) (f25cb5bf6)

  • fix(vent): preserve launcher session and runtime provenance (#4156) (944554e39)

  • fix(memory): report the written entry in scoped save JSON (#4155) (ce208c9f6)

  • fix(subagent): select native child tool format from model metadata (#4154) (be054fc58)

  • fix(webui): don’t skip cloud sign-in when a local server is already connected (#4153) (a7702f96f)

  • fix(mcp): load workspace config in diagnostic CLI commands (#4050) (3615e94d9)

  • fix(startup): defer prompt UI imports until interactive input (#4131) (f26d7dbe5)

  • fix(webui): show the sent model in the pill while chatConfig loads (#4150) (ee32da7ec)

  • fix(tools): preserve CRLF line endings in patch and morph (#4081) (a015ee4c4)

  • fix(webui): redirect after deleting active conversation (#4140) (649170b0a)

  • fix(eval): stop leaking multiprocessing_logging wrappers onto the root logger (#4132) (16b93eaf7)

  • fix(context): handle deleted CWD in file_to_display_path (#4142) (75cc006b6)

  • fix(cli): make skills show prefer exact matches and reject ambiguous ones (#4058) (4bad9ea0c)

  • fix(changelog): link commits by full SHA; fix 404 links in release notes (#4113) (eeebc82e2)

  • fix(python): cap unbounded stdout and result output (#4078) (b89b0f84e)

  • fix(responses): pair orphaned function calls with missing-result errors (#4139) (02f025ec6)

  • fix(webui): sync rotated Tauri sidecar token on non-default ports (#4065) (c81db98a1)

  • fix(webui): correct local TTS setup instructions and port (#4124) (a48546e64)

  • fix(server): honor –tools allowlist for new conversations (#4049) (ab0fe88be)

  • fix(server): tool/confirm 404 names the tool and the conversation correctly (#4135) (da71531d9)

  • fix(llm): back off and retry 429/5xx on openai-subscription requests (#4085) (f0dbbffe3)

  • fix(server): trim session events with clients connected; lock append/trim/read (#4087) (2420f9e4f)

  • fix(docs): update dead repo links to current locations (#4043) (5746ec73e)

  • fix(llm): retry Anthropic connection/timeout errors and 408/409 (#4066) (c11f08778)

  • fix(webui): refresh stale ‘How do I use the web UI?’ demo answer (#4042) (39e5ddf33)

  • fix(context): read scout_model from project/user config (#4086) (3eeadc199)

  • fix(cli): print fatal KeyError messages without repr quotes (#4101) (cbefb1d4f)

  • fix(grok-subscription): bump client version header to 1.0.13 (#4063) (f8975b005)

  • fix(server): gate internal error details behind debug setting (#4076) (a5b6f7768)

  • fix(docs): render –cors-origin example as literal and seed theme mode (#4045) (4c9ffee55)

  • fix(compaction): trigger from anchored provider input usage (#4036) (927cba1df)

  • fix(llm): keep tool calls and content in non-stream OpenAI chat() regardless of finish_reason (#4079) (1bcb49ba2)

  • fix(llm): record streamed OpenAI-compat usage once per response (#4044) (e03270c45)

  • fix(telemetry): move LLM token counts and cost out of metric labels (#4053) (c8d2a5cfa)

  • fix(site): hide .sig files on downloads page and list Android APK (#4055) (5bf572162)

  • fix(cli): gptme-auth login tolerates transient network errors (#4077) (52c322428)

  • fix(cli): drop non-interactive stderr noise (#4060) (ec991e34c)

  • fix(llm): serialize tools for all OpenAI-compatible providers (#4047) (4920de63d)

  • fix(webui): shared nav items and 5-slot mobile bottom nav with More sheet (#4059) (38786ee30)

  • fix(webui): show sign-in notice instead of a 401 iframe for remote instance previews (#4093) (4da431fcd)

  • fix(deps): update vulnerable Poetry dependencies and unblock Dependabot (#4068) (9204dcabe)

  • fix(cli): reject unknown options before prompt text (#4051) (1ccd90a71)

  • fix(shell): preserve UTF-8 sequences across persistent pipe reads (#4073) (8857f22d4)

  • fix(todo): replay only assistant messages, ignore system-prompt examples (#4054) (a64460489)

  • fix(subagent): allow graceful cleanup on subprocess timeout (#4075) (1a5a0cff5)

  • fix(patch): actionable messages for non-UTF-8 files and multi-hunk failures (#4083) (d586f8587)

  • fix(hooks): don’t swallow TypeError raised inside generator hooks (#4071) (f4f1e4954)

  • fix(mcp): stop per-tool allowlist warning spam and demote tool repr log (#4057) (e2f48222b)

  • fix(mcp): accept tool-format kwargs in MCP adapter execute (#4048) (a032b0d25)

  • fix(webui): hide e2e stress-test fixture and internal issue ref from users (#4046) (a947fc4aa)

  • fix(compaction): bound summarize request (#3812) (#4037) (8b4fd8c48)

  • fix(webui): share winning connection probe with superseded callers (#4041) (c9c0b6aa6)

  • fix(restart): show the token-bearing URL when the browser fails to open (#4039) (92483d672)

  • fix(webui): don’t render disconnected UI before the connection has failed (#4028) (fedde8ff6)

  • fix(commands): run SESSION_END hooks before the CLI /restart re-exec (#4038) (8e394134f)

  • fix(compaction): Phase 1.5b — hysteresis trim target + post-hoc savings gate (#3812) (#4023) (1f8d73638)

  • fix(server): strip additional identity headers in preview proxy (#4033) (7ef228ec9)

  • fix(server): leave a conversation’s directory before deleting it (cwd vanishes → all PUTs 500) (#4029) (c36a5917c)

  • fix(ci): retry flaky Android NDK download in Tauri workflow (#4022) (2725ba841)

  • fix(compaction): Phase 1.5a — failure latch, pending-tool guard, reasoning policy, UI-only status (#3812) (#3968) (37cff5c08)

  • fix(models): switch OpenRouter recommended model to deepseek-v4.1-flash (#4006) (886ad8a32)

  • fix(doctor): treat placeholder API keys as not-configured, not ERROR (#4014) (39a54936e)

  • fix(ci): stop TUI tmux e2e from hanging the test job for 6h (#4012) (574db0929)

  • fix(ci): give PR test runs the same timeout/retries as master (#4008) (b7512b33c)

  • fix(webui): notify when Tauri window loses focus (#4007) (a1852c5bf)

  • fix(subagent): stop thread-mode subagents from breaking the parent session’s tool calls (#3989) (fea7c6706)

  • fix(tui): no freeze/lost focus on pane switch, /restart after cwd moved, compact + highlighted sections (#3976) (2106abdd1)

  • fix(shell): gate workspace hint on subagent tool, say denied commands ran nothing (#3995) (9a4a80d8a)

  • fix(subagent): load disabled-by-default tools named by a profile allowlist (#3974) (471f0f44b)

  • fix(server): bound client-controlled session_id in reconnect log line (#3969) (92dccaeaa)

  • fix(time-awareness): one timezone-aware clock with full date, real session start and resume gaps (#3992) (deec3974b)

  • fix(hooks): don’t inject another agent’s identity instructions on cd (#3993) (4d7354bcd)

  • fix(confirm): show tool-format call arguments in confirmation previews (#3979) (71f0c4883)

  • fix(cli): print the resume command after a fatal error (#3978) (0fc35b21a)

  • fix(llm): convert OpenAI stream chunk-parsing crash into a clean, classifiable error (#3984) (f0890168e)

  • fix(shell): make promoted background job output reachable and respect explicit timeouts (#3996) (b86177e6e)

  • fix(tools): cap tool descriptions on all provider paths, not just OpenAI (#3964) (a1675a8ae)

  • fix(openrouter): accept every quantization level OpenRouter supports (#3983) (2dfc15255)

  • fix(openrouter): accept max reasoning effort (#3985) (24345a494)

  • fix(tui): normalize CR/CRLF line breaks in collapsed pastes (#3982) (923cdfe92)

  • fix(subagent): preserve result past system postamble (#3986) (d1ae87635)

  • fix(tui): inline-mode UX — hide thinking by default, keep scrollback on resize, show queued prompts and confirm keys (#3970) (c5c9733c8)

  • fix(server,webui): recover event stream after server restart; keep native notification grant out of browser path (#3967) (f7bb34871)

  • fix(webui): preserve generation settings for initial step (#3913) (fbc5825ef)

  • fix(autocompact): only record attempt after successful compaction, not before (#3965) (2cbc587e0)

  • fix(service): parse last systemd Environment model assignment (#3930) (50c92b4b0)

  • fix(tauri): regenerate icons from SVG for readable small-size rendering (#3928) (686ce71df)

  • fix(config): don’t crash on malformed [[mcp.servers]] entry (#3927) (23f548c24)

  • fix(server): honor per-step max token override (#3905) (b51622915)

  • fix(tauri): preserve OAuth chars in deep-link auth code injection (#3926) (6a969f9b8)

  • fix(tauri): retry connect on managed sidecar startup delay (#3934) (69ac31095)

  • fix(review-pr): don’t let a trailing shutdown log mask the real session error (#3910) (274b01c5d)

  • fix(tests): update browser-lynx test to use stable gptme.org assertion (#3916) (29ab7b79f)

  • fix(webui): cancel subscription poll and in-flight request on wizard unmount (#3922) (5b333f06d)

  • fix(webui): bundle Inter font locally instead of CDN import (#3908) (8ff2dadcc)

  • fix(server): add timeout to subscription OAuth background threads (#3923) (43817c81f)

  • fix(config): don’t crash on malformed [[providers]] entry (#3915) (593da3a33)

  • fix(tauri): rename user-facing product to gptme (#3907) (be343267b)

  • fix(memory): reject unknown list filters (#3904) (06e7275b8)

  • fix(doctor): resolve effective model source (#3893) (186123300)

  • fix(cli): import extras lazily so gptme-server and gptme-dspy start without them (#3901) (557b9757e)

  • fix(cli): honor gitignore anchoring and negation in context tree (#3899) (31e6025a9)

  • fix(doctor): surface exhausted OpenRouter quota (#3892) (9547bfed9)

  • fix(llm): render GptmeAuthError as a plain message, not KeyError’s repr (#3889) (16c6ca5c7)

  • fix(lessons): deduplicate skills by name, not by file path (#3887) (5c049d1e9)

  • fix(lessons): skip hidden subdirectories during skill/lesson discovery (#3888) (062ddecf3)

  • fix(anti-slop): fail short dense-slop text instead of skipping it (#3878) (759fa30a0)

  • fix(server): bundle gptme.hooks and gptme.context in the PyInstaller sidecar (#3883) (abd0f3537)

  • fix(server): emit step_complete after generating=False to close queue-flush 409 race (#3874) (879e13e0d)

  • fix(webui): don’t treat the Tauri webview origin as a bundled gptme-server (#3882) (183bfd75d)

  • fix(patch_many): accumulate repeated paths instead of silently dropping hunks (#3880) (f65cb9050)

  • fix(release): always write release notes with a trailing newline (#3876) (da6832bd8)

  • fix: add missing trailing newline to v0.34.0 release notes (#3875) (2e50bdf6b)

🔨 Misc (65)#

Click to expand

  • chore: bump version to 0.35.0 (v0.35.0)

  • test(tui): update thinking-toggle stream test for per-segment stream rows (#4353) (87b376108)

  • test(tui): cover mid-stream thinking toggles and delayed finalization flush (#4338) (3e9b6a455)

  • perf(tui): batch stream renders, anchor the chat scroll, keep one tool status line (#4332) (37c1250ed)

  • docs(voice): install with uv instead of Poetry (#4327) (0880593fb)

  • docs(building): install with uv instead of Poetry (#4316) (9ee310ec1)

  • test(webui): make location mocks jsdom-26-safe and move to jest 30 (#4285) (f2ffcb246)

  • test(logmanager): cover damaged-tail checkpoint and concurrent appends (#4247) (1ff896c9e)

  • test(shell): cover invalid UTF-8 and per-stream decoder state in background jobs (#4267) (c1d42b726)

  • chore(webui): delete unused components and deps, gate with knip (#4290) (987ad1cf0)

  • refactor(webui): drop unused calendar wrapper + react-day-picker, bump date-fns to 4 (#4286) (44e1ef05f)

  • docs(providers): add DemonRoute as remote cloud gateway example (#4277) (6cd42c802)

  • test(eventlog): property test for recovery from arbitrary log damage (#4263) (214d4c328)

  • test(llm): stub init_llm in degeneration reply() test so it runs in isolation (#4242) (c4a3a2ca6)

  • test(server): isolate v2 API tests from the real logs dir (#4240) (9a6e5e42c)

  • docs: add philosophy page (mission, principles, non-goals) (#4232) (6ef2dd14d)

  • docs(mcp): add ContextVar contract to load/unload_mcp_server + copy_context regression test (#4230) (33e1952ee)

  • test(e2e): wait for clickability before clicking wizard buttons (#4219) (eb420fc79)

  • docs(anti-slop): document float types and fix stale rounding comment (#4216) (77d354820)

  • test(browser): add local blockage conformance suite (#4200) (36a9bc146)

  • docs(citation): add Zenodo concept DOI and badge (#4147) (651fec3c3)

  • test(knowledge): protect outside stores across CLI subprocesses (#4159) (67e1c854b)

  • test(cli): add CLI-level regression for KeyError repr-quote stripping (#4105) (ca1310b03)

  • docs(computer-use): note that macOS needs no Full Disk Access (#4152) (41a9986b6)

  • docs(models): recommend GPT-6.1 Sol over GPT-5.6 Sol, describe Astra; add gpt-6.1-sol to registry (#4137) (192393c87)

  • docs(server): document 11 missing /api routes in OpenAPI spec (#4052) (ac501883e)

  • docs(tts): correct Kokoro first-run download size (#4133) (69f0b9e60)

  • docs: make provider host advice policy-first (#4130) (f15f18ed1)

  • docs: refresh model recommendations, data policy, and gptme-tts setup (#4114) (ba1149f0b)

  • chore(deps): apply non-breaking npm audit fixes and configure npm/cargo Dependabot (#4090) (4e5bdfc3a)

  • docs(contributing): fix stale telemetry env vars and metrics path (#4072) (98f0767a7)

  • perf(startup): keep prompt_toolkit out of gptme.message, requests out of gptme.commands (#4088) (0d64706d4)

  • docs(tools): add reference pages for memory, patch_many, convert (+ opt-in watch, progress, clarify) (#4091) (c413a4fdf)

  • docs: surface gptodo and gptmail from gptme-contrib for agent workflows (#4098) (daa4cf883)

  • docs(config): document missing project config keys (#4080) (9043660ee)

  • docs(evals): mention OpenShell policy-governed sandboxes (#4025) (5f6cff254)

  • docs(server): say /preview/{port}/ is the cloud preview backend, not a user URL (#4030) (10133577d)

  • refactor(reduce): delete dead proactive_summarize_log and its cache (#3812) (#4024) (3efde6e80)

  • test: isolate the web-tool host allowlist across tests (fix flaky browser failures) (#4019) (4be9a7883)

  • test: keep the autouse init fixture from scanning the host’s lesson dirs (#4017) (c581aa5a1)

  • test: keep color-warning tests independent of a leaked root log level (#4003) (94383696b)

  • test(tui): cover initial prompt queue exit path (#3998) (2bd15c53b)

  • test(browser): serve read_page_text fixture locally instead of example.com (#3991) (f2061c44d)

  • test: make two order/load-dependent CI tests hermetic (#3988) (01292e009)

  • docs(readme): mention Requesty alongside OpenRouter (#3994) (656b94ac2)

  • test(e2e): Playwright tests for InlineToolConfirmation (tool_pending flow) (#3948) (978d4f9aa)

  • refactor(shell): remove bashlex fallback after tree-sitter soak (#3944) (0c31b18fa)

  • test(hooks): unregister server_confirm in test_register to stop TOOL_CONFIRM leak (#3962) (9e3ab7cf5)

  • perf(shell): batch 7 separate export calls in _init() into one (#3952) (30e7c8407)

  • docs(plugins): add Plugin Registry section — how to get listed via GitHub topics (#3951) (1597a632f)

  • chore(meta): add PyPI keywords and classifiers (#3955) (c251d70be)

  • docs(shell): document allowlist, transparent wrappers, and tree-sitter-bash parser (#3946) (3b6a9bb13)

  • docs(contributing): add setup smoke test (#3902) (992731311)

  • refactor(server): stop falling back to the legacy web UI (#3938) (764b4cc0e)

  • refactor(cli): remove –gear, –multi-tool, –injection-hygiene, –manifest-dir (#3940) (48af60d28)

  • refactor(tools): remove patch_anchored and view_anchored (#3941) (7784b6d59)

  • docs: select workspace before gptme-agent install (#3933) (c41b20cd5)

  • docs: correct inaccurate and stale claims across README and docs (#3936) (886556f74)

  • refactor(cli): remove architect/editor split mode (#3937) (ad622602e)

  • test(server): gate cold conversation scan on scaling, not milliseconds (#3900) (2adc55b81)

  • test(models): make warn-once assertion logger-local (#3896) (4bd2560ef)

  • test(tauri): real first-run E2E with webui + sidecar (#3886) (c8560b2e8)

  • test(eval): isolate process-global side effects of in-process act_process calls (#3885) (f40b6dbf9)

  • test(ci): smoke-test frozen gptme-server startup for missing modules (#3884) (945517f13)

  • test(shell): make SIGTERM regression independent of inherited SIG_IGN (#3877) (4246b6814)

(excluded 49 less relevant commits)

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