What's Changed
- fix(server): keep subagent transcript updates off shell stream by @Yash-Singh1 in #23783
- fix(deps): pin all patched package versions by @juliusmarminge in #23798
- docs: document the GitCafe mirror and refresh the dev setup by @juliusmarminge in #23808
- fix: no more em dashes in product copy by @t3dotgg in #23799
- chore(mobile): bump Clerk Expo SDKs to the new native client sync by @wobsoriano in #23047
- fix(mobile): capture folded and unfolded Duo store screenshots by @juliusmarminge in #23849
- fix(server): preserve typed requirements as the RPC group grows by @juliusmarminge in #23813
- fix(server): wake PR watches when no checks report by @juliusmarminge in #23863
- fix(server): resume Codex parents after native children finish by @juliusmarminge in #23840
- fix(gitcafe): authored lists, merge progress, and author reviews match git.cafe by @juliusmarminge in #23887
- fix(forgejo): merges follow the repository's delete-branch setting by @juliusmarminge in #23471
- fix(web): keep PR check counts in sync by @juliusmarminge in #23548
- fix(server): speed up shell snapshots on large databases by @Yash-Singh1 in #23751
- fix(server): keep managed Codex token renewal in the server by @juliusmarminge in #21786
- fix(server): renew active managed Codex turns through native auth by @juliusmarminge in #21787
- feat(web): telemetry export settings show where the running endpoint came from by @yordis in #23713
- fix(ui): preserve tool icon detail in light mode by @juliusmarminge in #23896
- fix(mcp): accept GitCafe pull request URLs in link/unlink/watch tools by @juliusmarminge in #23899
- feat(settings): add thread title instructions by @CadenEl in #21882
- fix(mobile): undo toasts keep their action on one row by @saphid in #23910
- docs(connect): correct the relay webhook endpoint key by @juliusmarminge in #23526
- fix(mobile): center Android composer text and pad wrapped drafts by @PixPMusic in #23829
- fix(server): wake PR watches when remaining CI checks finish by @juliusmarminge in #23904
- fix(mobile): the empty composer row shows only the provider icon by @flamboh in #23570
- fix(server): route SQLite reads around writer contention by @Yash-Singh1 in #23902
- fix(claude): route approval feedback to the requesting agent by @Yash-Singh1 in #23657
- fix(web): align pull request file counts with diff stats by @Yash-Singh1 in #23905
- fix(web): task durations over an hour no longer wrap in the tasks panel by @jamesvillarrubia in #13472
- fix(server): preserve Codex sign-in guidance in usage notices by @jieyuexing in #17055
- fix(server): restore Claude subscription usage through proxies by @Kanaliseren in #12069
- fix(server): Forgejo skipped jobs no longer keep a pull request watch pending by @Mnigos in #16668
- fix(mobile): move Android undo toasts above bottom navigation by @PixPMusic in #23928
- perf(server): skip unused Git output line parsing by @juliusmarminge in #23953
- fix(server): abort interrupted ACP MCP fetches by @juliusmarminge in #23955
- fix(web): new threads no longer hang when a project's machine is offline by @t3dotgg in #23967
- fix(pi): stop blank input placeholders from failing the run by @only21mil in #23235
- fix(cursor): fail turns that end in a transport error after commentary by @only21mil in #23273
- test(forgejo): answer the base branch read in the skipped-checks test by @juliusmarminge in #23952
- fix(opencode): retry failed model catalogs until they recover by @Yash-Singh1 in #23939
- fix(server): avoid full shell read on resume by @Yash-Singh1 in #23987
- test: delete low-value tests and dead test-only exports by @t3dotgg in #24058
- test(server): restore DST scheduling tests deleted in the test snap by @t3dotgg in #23991
- test(web): restore project settings permission tests deleted in the test snap by @t3dotgg in #24011
- test(mobile): restore clipboard secret-redaction test deleted in the test snap by @t3dotgg in #23980
- fix(web): Cmd+B toggles the sidebar unless text is selected by @t3dotgg in #24063
- fix(server): agent-browser and Chrome no longer outlive the agent that started them by @josephv123 in #21299
- test(client-runtime): restore render scheduler tests deleted in the test snap by @t3dotgg in #23977
- fix(web): cmd+k search hides subagents and favors recent, whole-word matches by @t3dotgg in #24032
- test(lint): new polling loops in tests now fail lint by @t3dotgg in #23983
- ci: unused dependency patches fail in check:changed, not after push by @t3dotgg in #23988
- fix(desktop): PDFs in the preview can be annotated by @shivamhwp in #24022
- fix(web): instructed compact runs without a bare compaction first by @juliusmarminge in #24008
- fix(desktop): reduce app crashes when a preview tab's renderer dies during agent screenshots by @shivamhwp in #24056
- fix(server): Stop stops a thread's subagents again by @shivamhwp in #23886
- fix(desktop): a stuck quit no longer leaves the app unkillable by @shivamhwp in #23873
- fix(web): keep blockquote text readable in every theme by @Yash-Singh1 in #24036
- fix(bitbucket): stop the startup sweep from flooding Bitbucket with 429s by @shivamhwp in #23889
- fix(web): screen readers hear when the open thread starts, needs you or finishes by @shivamhwp in #23752
- perf(web): reduce allocations in streaming timeline scans by @UtkarshUsername in #23739
- perf(web): reuse a collator when sorting changed-file trees by @UtkarshUsername in #23776
- perf(scripts): check:changed finishes in about 10 s by @t3dotgg in #23581
- fix(web): size Usage header controls to the available width by @nateEc in #24123
- perf(server): speed up large terminal clipboard sequences by @AksharP5 in #23819
- fix(server): make stale CLI service recovery actionable by @juliusmarminge in #23541
- fix(web): pasted images show their upload tile instantly by @bmdavis419 in #23832
- fix(server): clean up deleted threads worktrees with subagents by @juliusmarminge in #23900
- fix(server): pause periodic PR discovery without foreground clients by @juliusmarminge in #23852
- fix(server): meter checkpoint git subprocess attempts by @juliusmarminge in #24218
- fix(web): clear stale resource monitor errors after retry by @juliusmarminge in #24229
- fix(mobile): align draft workspace controls with the composer by @PixPMusic in #24239
- feat(mobile): thread header minimizes on the Duo while reading back through history by @juliusmarminge in #24235
- fix(web): center pull request timeline actions by @PixPMusic in #24259
- fix(server): find the resource monitor when the server runs from its build output by @yordis in #23965
- fix(pull-requests): list filters narrow on every host that can by @juliusmarminge in #23922
- fix(pull-requests): a filtered list fills its page instead of waiting for a scroll by @juliusmarminge in #23923
- feat(pull-requests): label and author filters search the host by @juliusmarminge in #23924
- fix(mobile): chat and composer chips stay readable in light mode by @flamboh in #22585
- fix(web): review thread avatars no longer clip in collapsed activity rows by @flamboh in #23545
- ci: close "needs more info" issues after 7 days without a reply by @juliusmarminge in #22628
- fix(server): Codex accounts show ChatGPT's current plan names by @flamboh in #24200
- fix(observability): desktop dev version and web environment match the other services by @yordis in #23975
- fix(observability): custom resource attributes use the t3code prefix by @yordis in #23974
- fix(mobile): Home and pull request lists let UIKit own their top inset by @juliusmarminge in #24284
- fix(mobile): keep the Duo's Home and pull request headers fixed by @juliusmarminge in #24295
- fix(server): interrupts started by an agent no longer say "by user" in the timeline by @juliusmarminge in #24299
- ci(relay): deploy labeled PRs to relay preview stages by @juliusmarminge in #23872
- fix(mobile): HTML links in pull request comments open when tapped by @flamboh in #22110
- perf(client): avoid full ordering scans for streamed replacements by @juliusmarminge in #24264
- fix(server): a fork's first /compact compacts its inherited history by @juliusmarminge in #24172
- fix(server): agent recordings honor the browser frame rate setting by @juliusmarminge in #23895
- fix(client-runtime): Stop clears commands already finished on the server by @juliusmarminge in #23814
- fix(web): SSH environments on an older reused remote server explain the version mismatch instead of reconnecting forever by @juliusmarminge in #23647
- fix(web): keep usage-limit wake action visible by @juliusmarminge in #23803
- fix(server): reject pairing with an incompatible server protocol by @juliusmarminge in #23789
- fix(mobile): Live Activity stops shouting the running-agent count by @juliusmarminge in #24329
- feat(usage): include Muse Code session history by @Wiktor102 in #22443
- feat(mobile): add Usage and Settings to workspace navigation by @PixPMusic in #23841
- fix(mobile): keep iPad workspace columns aligned while resizing by @PixPMusic in #24182
- fix(mobile): no-project threads show a chat bubble instead of a monogram by @flamboh in #21546
- fix(mobile): stabilize Duo search and portrait navigation by @PixPMusic in #24206
- fix(mobile): the unfolded Duo keeps its header in portrait by @juliusmarminge in #24339
- fix(client-runtime): avoid duplicate handoff previews during startup by @Yash-Singh1 in #24349
- fix(mobile): Usage and Settings use the glass header and the Duo rail by @juliusmarminge in #24348
- perf(server): coalesce superseded streaming text updates by @juliusmarminge in #24267
- fix(server): stop flooding analytics with successful MCP tool calls by @t3dotgg in #24287
- feat(search): Cmd+K finds the right thread first, with indexed message search by @t3dotgg in #24343
- refactor(source-control): forges parse their own change request URLs by @juliusmarminge in #23992
- refactor(source-control): forges recognise their own remotes and repository keys by @juliusmarminge in #23993
- refactor(source-control): drivers build their own services and own host media by @juliusmarminge in #23994
- refactor(source-control): git and process behaviour comes from forge hooks by @juliusmarminge in #23995
- refactor(source-control): pull request behaviour comes from forge capabilities by @juliusmarminge in #23996
- refactor(clients): pull request surfaces ask the forge instead of assuming GitHub by @juliusmarminge in #23997
- refactor(clients): forge settings, routing and icons come from definitions by @juliusmarminge in #23998
- fix(clients): change requests use their host's own term by @juliusmarminge in #23999
- test(source-control): forge behaviour is tested in its own package by @juliusmarminge in #24000
- refactor(source-control): forge definitions live in shared/, not client/ by @juliusmarminge in #24181
- refactor(source-control): forges handle their own listing and SSH host quirks by @juliusmarminge in #24288
- fix(mobile): the question card uses the whole screen while the keyboard is closed by @shivamhwp in #24363
- fix(web): screen readers hear which background thread finished, even with the sidebar collapsed by @shivamhwp in #23839
- fix(web): screen readers say which thread a shortcut switched to by @shivamhwp in #23676
- fix(mobile): Back from a sub-agent opened from its delegator returns to the delegator by @shivamhwp in #23795
- fix(server): migrate-dev-db no longer trips over webhook tables by @juliusmarminge in #24404
- fix(clients): GitCafe links show GitCafe's mark on mobile by @juliusmarminge in #24405
- feat: compactions T3 Code starts read as one working row, and stay quiet by @juliusmarminge in #24334
- fix(source-control): GitCafe checks show each check's newest run by @juliusmarminge in #24406
- fix(html): honor preview light and dark mode by @Bil0000 in #24521
- chore(mobile): move Enriched Markdown to upstream's block renderers by @juliusmarminge in #24534
- fix(provider-cursor): finished Cursor turns no longer end in Provider error after the SDK's late resume by @shivamhwp in #24231
- fix(server): server preview browser rejects the compromised eMudhra intermediates by @juliusmarminge in #24542
- chore(review): Macroscope skips generated code and recorded fixtures by @juliusmarminge in #24548
- fix(server): align delegated review follow-up guidance by @juliusmarminge in #24560
- fix(server): websocket tickets name the route they open by @juliusmarminge in #24554
- perf(mobile): highlight code with native @pierre/highlights instead of Shiki by @juliusmarminge in #24544
- fix(desktop): support Linux distro protocol launchers by @juliusmarminge in #24591
- fix(provider-acp): force-kill terminal commands that ignore SIGTERM by @juliusmarminge in #24596
- fix(grok): invoke leading picked skills through native commands by @juliusmarminge in #24605
- fix(server): long agent turns no longer load whole when a thread opens by @t3dotgg in #24589
- fix(server): analytics stop counting reconnects, retries, and dev servers by @t3dotgg in #24601
- fix(acp): idle agent errors fail their turns by @juliusmarminge in #24615
- fix(provider-acp): Grok monitors show as monitors in background work by @t3dotgg in #24609
- feat(server): devices on the same network reach background services over LAN by @t3dotgg in #24588
- fix(codex): bound pending requests after app-server stdout closes by @juliusmarminge in #24600
- fix(cursor): discover built-in skills in the composer by @juliusmarminge in #24595
- fix(server): retry provider event writes after brief SQLite locks by @juliusmarminge in #24571
- fix(server): settle inactive threads with persisted open PR links by @juliusmarminge in #24617
- feat(mobile): Settings is a workspace tab, and tabs never open on an empty detail by @juliusmarminge in #24524
- feat(mobile): the folded Duo opens search from a search tab below the tab bar by @juliusmarminge in #24360
- revert(mobile): take the folded Duo search tab back out for now by @juliusmarminge in #24626
- fix(web): preview images outside the workspace by @juliusmarminge in #24627
- fix(threads): Working holds only background work the agent waits on by @t3dotgg in #24610
- fix(web): switched threads and Scroll to end land on the real end by @t3dotgg in #24622
- fix(web): attach DNG originals as generic files by @juliusmarminge in #24625
- fix(server): surface failed runtime request answer delivery by @juliusmarminge in #24616
- fix(preview): report navigation timeout accurately by @Ethereal49 in #24356
- fix(web): give PR row metadata room below the title by @juliusmarminge in #24553
- fix(mobile): center floating status actions by @PixPMusic in #24526
- fix(mobile): the iPhone new-chat button sits beside the tab bar on iOS 26.6 by @wojas in #24492
- fix(web): signed-out T3 Connect shows a Sign in button by @t3dotgg in #24636
- perf(mobile): stop menu fault logging and whole-list re-renders on Home by @juliusmarminge in #24646
- fix(mobile): preserve syntax and navigation in large diffs by @juliusmarminge in #24276
- perf(shell): cold connects skip idle subagent threads, a third of the thread list by @t3dotgg in #24648
- feat: share a thread with a guest who watches live and sends messages you approve by @t3dotgg in #24104
- fix(antigravity): say when sign-in cannot reach Google by @t3dotgg in #24652
- fix: canonicalize git.cafe pull request links by @maria-rcks in #22634
- feat(mobile): manage labels, edit PRs and comments, react, and refresh checks live by @juliusmarminge in #24602
- perf(web): highlight code with @pierre/highlights instead of Shiki by @maria-rcks in #23178
- perf(server): thread opens and live events send each message body once by @t3dotgg in #24647
- refactor: halve code comments and cap comment blocks at four lines by @maria-rcks in #21514
- chore: fit three comments to the four-line cap so lint passes on main by @t3dotgg in #24675
- fix(claude): ENABLE_TOOL_SEARCH=auto no longer costs 10x cache writes per session by @t3dotgg in #24654
- perf(orchestration): thread snapshots send each long ID once by @t3dotgg in #24643
- fix(mobile): keep visible diff files highlighted by @juliusmarminge in #24682
- fix(mobile): Settings split view keeps its selection and its header matches the page by @juliusmarminge in #24644
- fix(mobile): every Duo header blurs under the vertical bar, from one place by @juliusmarminge in #24671
- feat(settings): follow-ups steer the running turn by default by @maria-rcks in #24718
- fix(mobile): Duo threads no longer open shifted left by @juliusmarminge in #24732
- fix(mobile): PR links open in the app the same way they do on web by @juliusmarminge in #24738
- feat(web): command palette search finds options inside submenus by @maria-rcks in #24709
- fix(mobile): one way to select a page, so split view stops pushing by @juliusmarminge in #24742
- fix(mobile): Settings pages no longer flicker when switching beside the list by @juliusmarminge in #24749
- fix(server): use Codex native collaboration modes by @t3dotgg in #24737
- fix(clients): threads no longer flash in the inbox before they settle by @t3dotgg in #24760
- fix(mobile): the iPhone compose icon matches the tab icons' size by @juliusmarminge in #24650
- feat(infra): share Vite task cache with Axiom savings telemetry by @juliusmarminge in #24693
- fix(mobile): screen lists register with their header, enforced by lint by @juliusmarminge in #24710
- feat(mobile): search Settings, and keep its sidebar header clean by @juliusmarminge in #24766
- fix(mobile): threads open with less waiting, and the Threads tab remembers drafts by @juliusmarminge in #24750
- fix(mobile): reduce diff entry and source highlighting delays by @juliusmarminge in #24770
- perf(client): skip unchanged shell and config cache writes by @juliusmarminge in #24266
- fix(mobile): remove perpetual reconnect indicator animation by @juliusmarminge in #24273
- feat(mobile): close the keyboard from the Duo's side bar by @t3dotgg in #24696
- fix(mobile): dispatch native toolbar actions to current handlers by @juliusmarminge in #24271
- fix(server): PR watch wakes say the PR stays linked and watched by @t3dotgg in #24781
- feat(server): thread tools return a ready t3-thread link by @t3dotgg in #24784
- fix(server): running task results tell the agent to end its turn by @t3dotgg in #24782
- fix(server): mobile push no longer says "completed" between runs by @t3dotgg in #24769
- fix(server): delegated children no longer see pull request watch tools by @t3dotgg in #24808
- fix(mobile): search stays open after going back from a thread by @t3dotgg in #24748
- feat(server): request_secret can save a CLI token to a private file by @t3dotgg in #24809
- fix(server): threads settle right after a shell merge of an unlinked PR by @t3dotgg in #24830
- fix(server): worktree setup no longer hangs when a shell startup prompt eats the command by @t3dotgg in #24775
- feat(server): link pull requests agents create from the shell by @t3dotgg in #24813
- fix(mobile): queue Steer button no longer opens the editor on a near miss by @t3dotgg in #24832
- fix(usage): Gemini 4 Argon usage from Antigravity now has a price by @t3dotgg in #24834
- fix(server): publish committed events before writer cancellation by @Yash-Singh1 in #24836
- fix(web): shared dev servers no longer crash on lazy routes by @t3dotgg in #24839
- fix(web): chat tables and subagent rows line up by @t3dotgg in #24835
- perf(shell): cold connects skip older settled threads, 93% of the shell JSON by @t3dotgg in #24723
- test(server): restart replay tests no longer hang on a leftover checkpoint capture by @t3dotgg in #24851
- feat(web): Settings and Usage open as large modals over your thread by @t3dotgg in #24847
- fix(server): forked threads get titles from the history they inherit by @t3dotgg in #24857
- fix(release): desktop builds pass again after the vite-plus 1.4 upgrade by @t3dotgg in #24867
- feat(server): cut T3's agent instructions and tool copy by 60% by @t3dotgg in #24850
- perf(desktop): stop decoding snapshots twice for accessibility by @AksharP5 in #19221
- feat(desktop): import cookies from Zen Browser by @UtkarshUsername in #22970
- perf(shared): avoid repeated date parsing when selecting PRs by @UtkarshUsername in #22891
- fix(web): refresh the current branch when opening the picker by @UtkarshUsername in #22807
- fix(mobile): the Duo header blur reaches a vertical bar on the left too by @juliusmarminge in #24807
- fix(mobile): stabilize composer search debounce targets by @juliusmarminge in #24272
- fix(server): surface why process group metrics are not exported by @yordis in #23969
- test(mobile): mock threads in the composer search debounce test by @juliusmarminge in #24954
- fix(server): serve audio and video from draft workspaces by @juliusmarminge in #24275
- fix(mobile): share toast motion and bring bottom undo to iOS by @PixPMusic in #23968
- fix(mobile): the Duo sidebar changes with the rotation, not after it by @juliusmarminge in #24951
- perf(mobile): append terminal output without replaying history by @juliusmarminge in #24261
- fix(server): attachments are no longer silently dropped from prompts by @maria-rcks in #21356
- fix(mobile): images picked with choose files reach the agent as images by @maria-rcks in #21352
- feat(web): attach svg files to messages by @maria-rcks in #21355
- feat(server): send pdf attachments to claude and antigravity as documents by @maria-rcks in #21358
- feat(mobile): play audio inline and open shared files in the viewer by @maria-rcks in #21353
- feat(web): play audio inline and open any file the agent shares in the viewer by @maria-rcks in #21363
- perf(pull-requests): faster pull request timeline, code tab, summary and search by @maria-rcks in #22697
- perf(mobile): bound streaming markdown cache and pending work by @juliusmarminge in #24263
- fix(web): question options show a radio and an aligned shortcut key by @maria-rcks in #23255
- fix(server): notify parents after delegated background runs by @juliusmarminge in #23542
- fix(server): running delegates tell agents to end the turn by @t3dotgg in #24887
- perf(ci): cache server tests individually across shards by @juliusmarminge in #24966
- feat(mobile): one cached native-client install command for agents and machines by @juliusmarminge in #24965
- perf(source-control): pull request previews read only the pull request by @maria-rcks in #22583
- feat(infra): native client cache panels on the task cache dashboard by @juliusmarminge in #24994
- feat(web): UI design overhaul, with the new look behind a Beta toggle by @t3dotgg in #24865
- test(server): tests no longer depend on the host machine by @t3dotgg in #25001
- perf: opening a thread loads 85% less data by @t3dotgg in #24899
- fix(server): orchestrator records command count and duration again by @yordis in #23966
- fix(observability): every app reports its own environment and release channel by @yordis in #24340
- chore(lint): React effects can't grow past each file's budget by @juliusmarminge in #24964
- fix(observability): every exported resource names its service instance by @yordis in #23973
- fix(install): stable installs no longer fail behind a page of nightlies by @t3dotgg in #22907
- fix(server): Grok refresh no longer restores removed models from cache by @t3dotgg in #22849
- fix(server): resume fallback keeps the latest turn when an older handoff is pending by @t3dotgg in #22902
- fix(client-runtime): "Codex (hub)" badges read CH instead of C( by @t3dotgg in #22918
- fix(mobile): retain requested PR environment while connecting by @juliusmarminge in #24262
- fix(web): usage-limit banner reset time follows the Time format setting by @t3dotgg in #22915
- fix(web): terminal drag selection scrolls faster the farther past the edge by @t3dotgg in #22872
- fix(observability): resources add OTel semconv runtime and browser keys by @yordis in #23972
- chore(lint): main passes lint again with effects merged after the budget by @t3dotgg in #25055
- fix(server): ended roots no longer leave provider turns running by @t3dotgg in #22846
- feat(mobile): open threads and devices in a resizable iOS inspector by @juliusmarminge in #24985
- chore(web): measure renders before/after with render scenarios by @juliusmarminge in #24980
- fix(web): asset URLs re-mint per revision and before expiry without effects by @juliusmarminge in #24970
- fix(web): queued-message edits survive navigation and settle once by @juliusmarminge in #24972
- refactor(mobile): thread visits are tracked outside React by @juliusmarminge in #24973
- refactor(client): cloud account transitions run in one service by @juliusmarminge in #24974
- refactor(client): one VCS status refresh owner per checkout by @juliusmarminge in #24975
- refactor(web): document appearance and title are applied from app start by @juliusmarminge in #25004
- refactor(web): app shell shortcuts register once through one command dispatcher by @juliusmarminge in #25016
- refactor(web): shared intersection and document-activity stores by @juliusmarminge in #25020
- refactor(web): the theme store and diff worker pool stop syncing the theme through effects by @juliusmarminge in #25007
- fix(server): keep history discovery off the writer and pace compaction by @JustYannicc in #20877
- perf(mobile): compact persisted thread snapshots by @juliusmarminge in #24265
- fix(server): background compactions no longer flip threads to Working by @juliusmarminge in #25122
- fix(web): a stale queued-edit save no longer clears a newer edit by @juliusmarminge in #25128
- fix(client): a thread opened before its shell loads still counts as opened by @juliusmarminge in #25133
- docs: open and track PRs through GitCafe when origin is git.cafe by @juliusmarminge in #25126
- perf(web): diff file boundaries observe visibility once instead of on every render by @juliusmarminge in #25134
- fix(mobile): center toast actions beside wrapped messages by @PixPMusic in #24986
- fix(server): compact superseded turn-item snapshots by @JustYannicc in #20990
- feat(server): count how guest sharing gets used by @t3dotgg in #24996
- chore(lint): enforce unnecessaryPipeChain by @juliusmarminge in #25077
- test(web): Arabic arrow-key test no longer drops its first key press by @t3dotgg in #25145
- fix(mobile): upgrade react-native-keyboard-controller to 1.22.8 for the Duo fold composer by @juliusmarminge in #25141
- fix(infra): keep task cache cleanup ahead of uploads by @juliusmarminge in #25143
- chore(lint): enforce mapSomeToAsSome by @juliusmarminge in #25078
- chore(lint): enforce flatMapIgnoredParamToAndThen by @juliusmarminge in #25089
- chore(lint): enforce provideLayerSucceedToProvideService by @juliusmarminge in #25090
- chore(lint): enforce unicorn/require-module-specifiers by @juliusmarminge in #25102
- chore(lint): enforce unicorn/no-useless-fallback-in-spread by @juliusmarminge in #25103
- chore(lint): enforce eslint/no-unneeded-ternary by @juliusmarminge in #25105
- chore(lint): enforce eslint/no-unsafe-optional-chaining by @juliusmarminge in #25106
- fix(web): preview favicons resolve their project without ChatView syncing it by @juliusmarminge in #25068
- refactor(mobile): branch picker owns its search and checkout guard by @juliusmarminge in #25067
- refactor(web): composer editor stops mirroring props into refs with effects by @juliusmarminge in #25079
- fix(client): usage-limit Snooze disables at reset even weeks away, via a shared deadline clock by @juliusmarminge in #25005
- fix(infra): task cache cleanup test provides its service directly by @juliusmarminge in #25164
- chore(lint): a new React effect states its reason instead of raising the budget by @juliusmarminge in #25163
- test(web): the diff boundary observer counter lives in its fixture by @juliusmarminge in #25170
- fix(client): a queued-edit save keeps its claim until it finishes by @juliusmarminge in #25169
- refactor(web): terminal focus requests name the terminal they focus by @juliusmarminge in #25009
- fix(web): pull request checks stay current after a checks refresh by @juliusmarminge in #25008
- chore(devices): bump agent-device to 0.21.31 by @juliusmarminge in #25065
- feat(mobile): composer placeholder reads "Ask anything" by @flamboh in #25176
- refactor(mobile): shared AppState, reduce-motion and back-button helpers by @juliusmarminge in #25011
- fix(web): settings panels derive state instead of syncing it with effects by @juliusmarminge in #25070
- refactor(mobile): terminal lifecycle runs in a session store, not screen effects by @juliusmarminge in #25071
- refactor(web): branch toolbar and dialogs stop syncing through effects by @juliusmarminge in #25072
- refactor(web): thread find state lives in one store instead of event buses and mirrors by @juliusmarminge in #25073
- refactor(web): browser panel tabs follow preview sessions without ChatView effects by @juliusmarminge in #25006
- chore(lint): enforce effectSucceedWithVoid by @juliusmarminge in #25074
- chore(lint): enforce preferSucceedSomeOrNone by @juliusmarminge in #25080
- chore(lint): enforce unnecessaryFailYieldableError by @juliusmarminge in #25083
- chore(lint): enforce catchToOrElseSucceed by @juliusmarminge in #25084
- chore(lint): enforce allOfMapToForEach by @juliusmarminge in #25085
- chore(lint): enforce unnecessaryEffectGen by @juliusmarminge in #25086
- chore(lint): enforce catchToIgnore by @juliusmarminge in #25087
- chore(lint): enforce optionMatchToFromOption by @juliusmarminge in #25088
- chore(lint): enforce redundantMapError by @juliusmarminge in #25091
- chore(lint): enforce raceFirstWithSleepToTimeout by @juliusmarminge in #25092
- chore(lint): enforce catchUnfailableEffect by @juliusmarminge in #25093
- chore(lint): enforce preferTypedSchemaDecoder by @juliusmarminge in #25094
- chore(lint): enforce schemaStructWithTag by @juliusmarminge in #25095
- chore(lint): enforce tryCatchInEffectGen by @juliusmarminge in #25097
- chore(lint): enforce eslint/no-unused-vars by @juliusmarminge in #25100
- chore(lint): enforce unicorn/no-useless-spread by @juliusmarminge in #25104
- chore(lint): enforce eslint/no-new by @juliusmarminge in #25107
- fix(web): theme editor returns to its spot after the window shrinks and grows back by @juliusmarminge in #25076
- refactor(mobile): cloud account transitions run in the shared account service by @juliusmarminge in #25150
- refactor(client): drop the VCS wake and dispatcher element scope options nobody uses by @juliusmarminge in #25152
- fix(server): make document attachments readable to agents by @maria-rcks in #21458
- fix(web): keep Windows thread notifications clickable until handled by @AKolenda in #22520
- refactor(client): terminal sessions keep one driver per mode by @juliusmarminge in #25186
- refactor(web): preview tab sync subscribes to the preview store instead of its own listener sets by @juliusmarminge in #25196
- fix(server): use asSome for initial worktree measurement by @juliusmarminge in #25206
- feat(sidebar): working section is on by default by @maria-rcks in #25190
- feat(web): preview office files, fonts, and mermaid diagrams by @maria-rcks in #21362
- feat(web): virtualize large file previews by @maria-rcks in #21466
- feat(web): preview archives, sqlite databases, and decoded images by @maria-rcks in #21467
- feat(web): preview opendocument, epub, rich text, and notebooks by @maria-rcks in #21469
- chore(lint): enforce eslint/no-empty-pattern by @juliusmarminge in #25101
- chore(lint): enforce typescript/no-extraneous-class by @juliusmarminge in #25108
- chore(lint): enforce react/capitalized-calls by @juliusmarminge in #25109
- fix(desktop): hidden preview tabs throttle instead of running at full speed by @t3dotgg in #25184
- chore(lint): enforce react/static-components by @juliusmarminge in #25110
- chore(lint): enforce react/no-unstable-nested-components by @juliusmarminge in #25111
- chore(lint): enforce react/no-array-index-key by @juliusmarminge in #25112
- chore(lint): enforce react/immutability by @juliusmarminge in #25115
- chore(lint): disable react/jsx-no-constructed-context-values by @juliusmarminge in #25039
- chore(lint): disable react/no-object-type-as-default-prop by @juliusmarminge in #25040
- chore(lint): disable unicorn/no-array-reverse by @juliusmarminge in #25041
- chore(lint): disable unicorn/no-new-array by @juliusmarminge in #25042
- chore(lint): disable unicorn/prefer-array-find by @juliusmarminge in #25043
- chore(lint): disable unicorn/prefer-set-has by @juliusmarminge in #25044
- chore(lint): disable unicorn/prefer-string-starts-ends-with by @juliusmarminge in #25045
- chore(lint): disable unicorn/prefer-add-event-listener by @juliusmarminge in #25047
- chore(lint): disable typescript/no-this-alias by @juliusmarminge in #25048
- chore(lint): disable eslint/no-control-regex by @juliusmarminge in #25049
- chore(lint): disable returnEffectInGen by @juliusmarminge in #25050
- refactor(mobile): thread detail and feed reset by key and share one follow owner by @juliusmarminge in #25148
- fix(web): thread find exports the timeline fields type its context names by @juliusmarminge in #25260
- chore(lint): enforce react/memo-dependencies by @juliusmarminge in #25117
- fix(web): Escape and copy work in chat media and markdown widgets, which attach through ref callbacks by @juliusmarminge in #25246
- fix(web): composer banners, menus and pickers act in their handlers by @juliusmarminge in #25238
- refactor(web): device panel reads hub state from atoms by @juliusmarminge in #25265
- feat(web): New design brings back color where it means something by @t3dotgg in #25251
- fix(web): SSH password prompts wait for their dialog, and the app shell drops its sync effects by @juliusmarminge in #25239
- refactor(mobile): settings and usage screens drop sync effects by @juliusmarminge in #25227
- fix(mobile): review opens on Changes and keeps the section you picked by @juliusmarminge in #25223
- fix(mobile): Android dialogs raised before or during activity replacement now show by @juliusmarminge in #25229
- chore(lint): enforce react/purity by @juliusmarminge in #25038
- fix(web): app loads again after a chunk cycle blanked it at boot by @t3dotgg in #25295
- refactor(web): root notification and toast coordinators start with the app by @juliusmarminge in #25233
- refactor(web): sidebar thread lists derive state instead of syncing it in effects by @juliusmarminge in #25234
- chore(lint): enforce react/refs by @juliusmarminge in #25116
- fix(web): new thread shortcut focuses palette search, not the Back button by @t3dotgg in #25315
- chore(lint): enforce react/exhaustive-effect-dependencies by @juliusmarminge in #25118
- fix(web): composer corners and context strip no longer show double edges by @t3dotgg in #25316
- fix(web): VS Code icon in thread details no longer has a box around it by @t3dotgg in #25321
- fix(web): sent messages stand out on the black canvas in the new design by @t3dotgg in #25323
- feat(web): new design is on by default by @t3dotgg in #25324
- chore(lint): enforce react/set-state-in-effect by @juliusmarminge in #25119
- fix(web): short branch names no longer get clipped in thread details by @t3dotgg in #25328
- refactor(mobile): stream and MCP webviews tie their work to the view's lifetime by @juliusmarminge in #25226
- fix(web): stacked notices above the composer no longer cast a dark band by @t3dotgg in #25329
- fix(web): thread undo notice sits above the bottom shelves instead of pushing the list by @maria-rcks in #25270
- feat(web): "could not load" screen tells users how to debug it by @t3dotgg in #25317
- fix(web): usage tabs no longer jump when switching to Limits by @t3dotgg in #25336
- fix(web): composer bottom toolbar keeps its background under update notices by @t3dotgg in #25335
- chore(lint): enforce catchConditionalRefailToCatchIf by @juliusmarminge in #25081
- chore(lint): enforce flatMapConditionalToFilterOrFail by @juliusmarminge in #25082
- chore(lint): enforce runEffectInsideEffect by @juliusmarminge in #25096
- chore(lint): enforce abortControllerInEffect by @juliusmarminge in #25098
- chore(lint): enforce t3code/no-inline-schema-compile by @juliusmarminge in #25113
- chore(lint): enforce oxc/no-accumulating-spread by @juliusmarminge in #25114
- chore(lint): enforce t3code/no-polling-loop-in-tests by @juliusmarminge in #25120
- docs: read GitHub Actions logs through cafe by @juliusmarminge in #25343
- feat(web): "failed to start" screen helps users recover and report the crash by @t3dotgg in #25345
- fix(web): keep large thread counts from shrinking labels by @Yash-Singh1 in #25355
- fix(task-cache): avoid cross-request admission waiters by @juliusmarminge in #25353
- fix(server): select the active iPhone Duo display for screenshots by @shivamhwp in #24912
- fix(server): remove one-child-per-model instruction by @Yash-Singh1 in #25359
- fix(dev): skip auto-seeding large databases by @Yash-Singh1 in #25365
- fix(server): preview snapshots preserve blurred backdrops by @juliusmarminge in #24618
- fix(web): model picker no longer jumps when switching providers by @t3dotgg in #25358
- test(mobile): run React hooks with the release compiler by @juliusmarminge in #24274
- fix(mobile): pause videos outside visible thread and PR content by @juliusmarminge in #24268
- fix(server): retry stalled MCP registration for resumed Claude turns by @Yash-Singh1 in #25372
- fix(mobile): avoid crashes opening wrapped source links by @juliusmarminge in #25156
- refactor(web): disconnect and reconnect delays read a shared deadline instead of effect timers by @juliusmarminge in #25363
- chore(lint): enforce effectFnOpportunity by @juliusmarminge in #25099
- fix(web): composer body ref stops re-attaching on every render by @juliusmarminge in #25409
- fix(web): switching threads no longer delays the next thread's visit by up to 10s by @juliusmarminge in #25368
- fix(mobile): mobile:install builds on a cache miss for pooled devices, iOS on EAS by @juliusmarminge in #25390
- revert(web): composer body ref goes back to the #25079 ref callback by @juliusmarminge in #25412
- feat(mobile): thread rows drop the branch and lead with the title by @juliusmarminge in #25415
- refactor(web): file breadcrumb menus refetch on a new workspace change, not on every open by @juliusmarminge in #25377
- fix(web): citations to older responses load their history instead of failing by @juliusmarminge in #25371
- refactor(client): composers share one workspace snapshot refresh per provider and cwd by @juliusmarminge in #25370
- refactor(mobile): composer pastes and picks are cancelled by their draft, not by the composer by @juliusmarminge in #25376
- fix(mobile): select the correct draft after adding a project by @juliusmarminge in #24269
- fix(server): goals stop the running turn, clear while working, no echoes by @t3dotgg in #25426
- refactor(web): pull request list remembers each answer for the next start by @juliusmarminge in #25364
- refactor(web): HTML previews handle frame messages in one listener by @juliusmarminge in #25456
- refactor(web): review guide runs are watched from their answers, not from mounted components by @juliusmarminge in #25459
- refactor(web): resize drags, panel shells and the browser host own their listeners by @juliusmarminge in #25464
- fix(web): find shows its match after a thread switch, and the timeline hears scrolling through one viewport signal by @juliusmarminge in #25463
- fix(mobile): a new thread's first send no longer sticks on Starting by @juliusmarminge in #25477
- fix(client): drafts for answered questions are cleared even when their thread is not open by @juliusmarminge in #25457
- refactor(web): terminal output no longer re-renders the drawer, theme search runs from handlers by @juliusmarminge in #25458
- fix(web): stable callbacks refresh before layout effects read them by @juliusmarminge in #25489
- test(web): say why the useStableCallback test renders without a router by @juliusmarminge in #25493
- fix(mobile): queued edits end when their run starts, wherever you are by @juliusmarminge in #25468
- refactor(web): root theme, toast and chrome sync start with the app by @juliusmarminge in #25461
- fix(mobile): editing a queued message while a question is open no longer throws by @juliusmarminge in #25503
- fix(web): browser viewport resizes work without an open preview panel by @juliusmarminge in #25462
- test(web): attachment preview omission tests no longer time out on CI by @juliusmarminge in #25515
- fix(mobile): describe when composer view commands can reject by @juliusmarminge in #25516
- fix(web): browser history and titles show up again by @juliusmarminge in #25491
- fix(web): switching back to a thread no longer restores its tab's older title by @juliusmarminge in #25521
- refactor(web): pull request page reacts to turns and sweep Escape without effects by @juliusmarminge in #25523
- fix(web): an armed pull request confirm no longer outlives its button by @juliusmarminge in #25530
- fix(mobile): keep expanding composer text above its toolbar by @saphid in #25396
- fix(server): release completed PR sync sweep data from the read cache by @juliusmarminge in #25285
- fix(mobile): drop the unused useLayoutEffect import that fails lint on main by @juliusmarminge in #25575
- refactor(web): provider settings and Codex setup run as explicit flows by @juliusmarminge in #25524
- test(web): attachment preview omission cases check the prepared document instead of rendering each one by @juliusmarminge in #25562
- refactor(mobile): pull request screens use a file-jump store and handler work by @juliusmarminge in #25525
- fix(mobile): label the pull request toast action View by @PixPMusic in #25581
- refactor(mobile): media previews share file leases and close on blur in one place by @juliusmarminge in #25527
- fix(shared): pin T3 Connect cloudflared to 2026.10.4, which drops the compromised eMudhra intermediates by @Project516 in #25572
- fix(web): skill chips in chat open the same details popover as the composer by @flamboh in #25432
- refactor(web): chat route shortcuts register once instead of rebuilding on every store change by @juliusmarminge in #25366
- fix(clients): queued messages can't be edited while a question is open by @juliusmarminge in #25593
- docs: add an FAQ that answers what people ask every day by @t3dotgg in #25451
- feat(web): warn before adding a second Claude or Codex account by @t3dotgg in #25475
- fix(server): expire new-model badges after seven days by @Yash-Singh1 in #25609
- refactor(web): running timers share one clock instead of an interval each by @juliusmarminge in #25616
- fix(web): simplify the created pull request success row by @Yash-Singh1 in #25613
- fix(web): thread jump hints wait for their delay on every hold by @juliusmarminge in #25636
- fix(mobile): open threads from the local cache instead of "Thread unavailable" by @juliusmarminge in #25627
- fix(infra): task-cache telemetry no longer strands an event queued during a flush by @juliusmarminge in #25653
- refactor(web): video previews attach listeners on their element and share one visibility observer by @juliusmarminge in #25630
- refactor(mobile): voice input session owns recording, metering and keep-awake by @juliusmarminge in #25631
- fix(web): screen readers can wrap to the first and last message of a long thread by @shivamhwp in #23780
- fix(client-runtime): a slow host no longer shows settings as read-only by @yordis in #25526
- refactor(mobile): thread rows share one clock and cache SVGs instead of per-row effects by @juliusmarminge in #25612
- fix(server): a thread whose worktree was deleted recovers on the next message by @yordis in #18359
- refactor(mobile): pull request list records answers where they land by @juliusmarminge in #25373
- fix(mobile): keep floating status within the composer width by @PixPMusic in #25671
- refactor(web): settings group by concern, with General split into focused pages by @juliusmarminge in #25651
- fix(server): telemetry keeps a failed batch for 30 minutes, not 1.5 by @t3dotgg in #25474
- fix(mobile): a caret move in one composer no longer moves another draft's insert point by @juliusmarminge in #25681
- test(web): attachment preview Word and large-text tests no longer flake on CI by @juliusmarminge in #25664
- feat(evals): shared evals package and an eval for T3 tool-use mistakes by @t3dotgg in #24635
- refactor(web): Cmd+O presses the Open in editor button instead of a per-picker listener by @juliusmarminge in #25667
- fix(mobile): queued messages are delivered by an app service, not a render loop by @juliusmarminge in #25678
- test(web): PDF viewer behavior is covered by fast tests by @juliusmarminge in #25699
- refactor(mobile): drop the unreachable pending-task editor from new-task drafts by @juliusmarminge in #25684
- feat(web): thread state lives at the end of the timeline, not stacked on the composer by @t3dotgg in #25401
- refactor(web): drafts promote from the draft store, not from route effects by @juliusmarminge in #25615
- refactor(mobile): settings use web's pages and groups by @juliusmarminge in #25686
- refactor(mobile): thread inspector mode is derived, not synced by @juliusmarminge in #25682
- refactor(mobile): pull request list, filters and viewed files without synchronizing effects by @juliusmarminge in #25614
- fix(web): PDF search finds phrases that wrap across lines by @juliusmarminge in #25702
- feat(server): cut T3's MCP tool schemas by a third and merge 18 tools into action tools by @t3dotgg in #25423
- fix(mobile): pull request rows refresh their diff stats after a new push by @juliusmarminge in #25713
- fix(workflows): keep completed workflows reachable by @Bil0000 in #24587
- fix(web): devices agents open in background threads now show up by @juliusmarminge in #25714
- refactor(web): optimistic chat messages leave without a timer by @juliusmarminge in #25710
- feat(acp): ACP session notices show as notices, not reply text by @juliusmarminge in #25704
- fix(mobile): scale and align thread list icons by @PixPMusic in #25668
- refactor(mobile): new-task branch defaults are derived, not written after render by @juliusmarminge in #25706
- feat(provider): add Vercel fx as a provider by @agadzik in #18277
- fix(mobile): usage chart bars round at the top instead of the bottom by @adityavardhansharma in #21383
- fix(mobile): a draft route's branch checkout runs once, even across a reconnect by @juliusmarminge in #25712
- fix(web): thread details popover closes when the card moves inline by @juliusmarminge in #25731
- refactor(web): diff and file reveals are requests, and workspace edits refetch by construction by @juliusmarminge in #25732
- feat(web): Add provider leads with first-class providers by @juliusmarminge in #25753
- refactor(mobile): app-lifetime services install once, and the usage widget stops re-rendering on every presentation change by @juliusmarminge in #25740
- fix(client-runtime): searches and refreshes no longer wait on an unreachable environment by @juliusmarminge in #25703
- refactor(web): command palette state lives in a store, git and branch pickers drop timer and sync effects by @juliusmarminge in #25733
- fix(mobile): restore Android chat content corners by @PixPMusic in https://github.com/pingdotgg/t3code/pull/23989
- fix(server): agents show trends and comparisons as inline charts again by @t3dotgg in https://github.com/pingdotgg/t3code/pull/25766
New Contributors
- @CadenEl made their first contribution in #21882
- @Kanaliseren made their first contribution in #12069
- @Wiktor102 made their first contribution in #22443
- @Ethereal49 made their first contribution in #24356
- @wojas made their first contribution in #24492
- @agadzik made their first contribution in #18277
Full Changelog: v0.1.2...v0.1.3