Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1797 commits
Select commit Hold shift + click to select a range
062987b
fix(mobile): improve font-size slider performance and prevent maximum…
bbernag Sep 7, 2026
b919d63
fix(web): keep composer toolbar controls anchored during transitions …
juliusmarminge Sep 7, 2026
f57d383
fix(web): resize the floating preview from any edge (#10467)
juliusmarminge Sep 7, 2026
7129797
fix(mobile): prevent chat from disappearing when scrolling (#10479)
juliusmarminge Sep 7, 2026
b248f5a
fix(mobile): smooth composer status pill resizing (#10484)
juliusmarminge Sep 7, 2026
c0d4e95
fix(mobile): release initial scroll target after dragging (#10483)
juliusmarminge Sep 7, 2026
e32dd42
fix(mobile): animate thread lifecycle transitions consistently (#10487)
juliusmarminge Sep 7, 2026
b717537
fix(mobile): restore assistant message bottom padding (#10491)
juliusmarminge Sep 7, 2026
dc39615
fix(mobile): preserve chat rows when toggling commands (#10492)
juliusmarminge Sep 7, 2026
8b2838e
feat(web): group onboarding project import by repository (#10493)
t3dotgg Sep 7, 2026
fe07ffe
fix(web): remove inserted citations on cancel (#10518)
extoci Sep 7, 2026
357b8d5
fix(mobile): match Working status color to desktop
baptisteArno Sep 7, 2026
8d7f781
fix(mobile): wait for native thread scroll before reveal (#10486)
juliusmarminge Sep 7, 2026
1d1bf50
chore(mobile): bump app version to 1.1.0
t3-code[bot] Sep 7, 2026
62fbbe0
fix(web): tolerate servers that predate git identity in project impor…
juliusmarminge Sep 7, 2026
72d9408
fix(web): restore settled PR colors on hover (#10023)
flamboh Sep 7, 2026
9cc9839
fix(web): keep popup triggers steady when pressed (#10468)
dominic-r Sep 7, 2026
0d34579
fix(web): keep project favicon shape consistent across sizes (#10502)
sameerr03 Sep 7, 2026
3bf74eb
fix(claude): report usage limits on retried turns (#10549)
StiensWout Sep 7, 2026
5b8a69c
refactor(desktop): classify backend exports (#10265)
juliusmarminge Sep 7, 2026
5a853a4
refactor(desktop): classify electron exports (#10266)
juliusmarminge Sep 7, 2026
89dd9ab
refactor(desktop): classify app exports (#10267)
juliusmarminge Sep 7, 2026
e279e40
refactor(desktop): classify preview exports (#10268)
juliusmarminge Sep 7, 2026
b491e41
ci(knip): enforce desktop exports (#10269)
juliusmarminge Sep 7, 2026
577b6cc
fix(web): remove excess sidebar thread spacing (#10569)
maria-rcks Sep 7, 2026
c8ec7df
fix(web): make settings project scopes searchable and scrollable (#10…
maria-rcks Sep 7, 2026
5ec6f77
fix(web): use `tabular-nums` with the ui font for sidebar timer (#10592)
extoci Sep 7, 2026
12f5604
fix(web): correct pending question attachment message (#10599)
dominic-r Sep 7, 2026
c0cad74
fix(mobile): restore brand artwork in the Android adaptive icon (#10598)
juliusmarminge Sep 7, 2026
0244333
fix(mobile): configure iOS Keychain access group (#3665)
VedankPurohit Sep 7, 2026
dadba6d
fix(web): remember Composer Fast mode across new chats (#2981)
aravhawk Sep 7, 2026
95834d6
fix(server): disable executable capabilities in Claude metadata gener…
maxwellyoung Sep 7, 2026
09e8de9
Add stop thread keybinding command (#4308)
jakeleventhal Sep 7, 2026
2c8e95a
fix(mobile): show the provider account badge on thread rows (#9899)
vitalyiegorov Sep 7, 2026
d64335b
fix(codex): name the usage limit and its reset instead of relaying "o…
vitalyiegorov Sep 7, 2026
ea2983a
fix(web): copy selected pull request link from PR page (#10615)
maria-rcks Sep 7, 2026
d67157a
fix(web): keep ref picker steady when opening (#9472)
Adamulek123 Sep 7, 2026
569a8cd
fix(web): play pull request videos inline (#10617)
maria-rcks Sep 7, 2026
8de9169
chore(release): prepare v0.0.40
t3-code[bot] Sep 8, 2026
e0e0bcb
fix(desktop): preserve browser editing shortcuts (#10621)
juliusmarminge Sep 8, 2026
d081ab7
fix(web): open pull request markdown links in the panel (#10623)
juliusmarminge Sep 8, 2026
892de47
fix(mobile): fit the Android splash icon to its circular mask (#10620)
juliusmarminge Sep 8, 2026
299404a
feat(desktop): add cross-platform window capture (#8103)
Bil0000 Sep 8, 2026
8588d7f
fix(web): open proactive panels when entering threads (#10610)
maria-rcks Sep 8, 2026
9fe4d65
fix(native): wait for the KDE feedback test listener (#10645)
juliusmarminge Sep 8, 2026
a01b227
fix(desktop): resolve local media linked from remote threads (#10619)
maria-rcks Sep 8, 2026
b7c002f
fix(web): add bottom padding to project actions header (#10634)
flamboh Sep 8, 2026
15193df
fix(web): update machines together in auto balance (#10596)
maria-rcks Sep 8, 2026
9e37f0c
fix(preview): transfer recordings to the agent environment (#10572)
maria-rcks Sep 8, 2026
f0bd43e
Add 'macroscope-review' label to conventions
juliusmarminge Sep 8, 2026
5a18fb9
Add 'macroscope-review' label to UI consistency
juliusmarminge Sep 8, 2026
6df0add
fix(web): navigate markdown images as galleries (#10625)
maria-rcks Sep 8, 2026
a37c664
chore: upgrade to TypeScript 7.0.2 (#10663)
juliusmarminge Sep 8, 2026
6ba15c0
fix: hide email-bearing account labels in usage limits (#10668)
juliusmarminge Sep 8, 2026
50a76ce
fix(web): keep scroll-to-end button close to composer (#10543)
Bil0000 Sep 8, 2026
bd56e92
chore(deps): upgrade Effect to rc.112 and Alchemy to beta.76 (#10652)
juliusmarminge Sep 8, 2026
458f502
chore(refs): sync Effect reference to rc.112 (#10653)
juliusmarminge Sep 8, 2026
9d345fa
chore(refs): sync Alchemy reference to beta.76 (#10654)
juliusmarminge Sep 8, 2026
bc4b006
fix: generate thread titles with the selected model across connection…
Bil0000 Sep 8, 2026
b5f7fa0
fix(desktop): enable context menus in the browser (#10670)
juliusmarminge Sep 8, 2026
bc88fdf
fix(desktop): stop generating declarations during bundling (#10679)
juliusmarminge Sep 8, 2026
349ce30
fix(desktop): restore layout control hit targets (#10673)
juliusmarminge Sep 8, 2026
7220dfe
feat(chat): attach files to question answers (#9871)
shivamhwp Sep 8, 2026
9915263
feat(desktop): refresh macOS installer with aurora artwork (#10632)
saphid Sep 8, 2026
430fbd1
fix(server): give completed turns a full session idle window (#10689)
StiensWout Sep 8, 2026
7d9aaf6
feat(web): add pull request merge defaults (#8088)
Bil0000 Sep 8, 2026
1f14d6d
fix(usage): keep account columns aligned across limit rows (#10690)
juliusmarminge Sep 8, 2026
11601da
fix(web): chat text no longer shows through a 1px gap under composer …
vitalyiegorov Sep 8, 2026
6f4cd07
refactor(server): classify runtime exports (#10274)
juliusmarminge Sep 8, 2026
0af04f1
refactor(server): classify orchestration exports (#10275)
juliusmarminge Sep 8, 2026
161715b
refactor(server): classify service exports (#10276)
juliusmarminge Sep 8, 2026
77d9ffc
refactor(server): classify telemetry exports (#10277)
juliusmarminge Sep 8, 2026
060c576
refactor(server): classify provider exports (#10278)
juliusmarminge Sep 8, 2026
3b6ce93
refactor(server): classify source control exports (#10279)
juliusmarminge Sep 8, 2026
7cdeb69
refactor(server): classify source control registry API (#10280)
juliusmarminge Sep 8, 2026
1f0a14c
refactor(server): classify preview toolkit exports (#10281)
juliusmarminge Sep 8, 2026
b284715
chore(mobile): bump app version to 1.1.1
t3-code[bot] Sep 8, 2026
7d62050
ci(knip): enforce server exports (#10282)
juliusmarminge Sep 8, 2026
134b719
feat(web): add previous/next turn navigation in minimap (#8531)
UtkarshUsername Sep 8, 2026
d6dbe8d
fix(web): stop the settings sidebar shifting when switching pages (#1…
t3dotgg Sep 8, 2026
83b865f
fix(web): copy terminal selection with Ctrl+Insert (#8541)
iamshadmantaqi Sep 8, 2026
82451ee
fix(web): show the same project icon in the command palette as everyw…
t3dotgg Sep 8, 2026
d7a59c6
fix(web): stop sidebar rows flashing and shifting on click (#10713)
t3dotgg Sep 8, 2026
eb11506
refactor(web): pass the project record to ProjectFavicon so icons can…
t3dotgg Sep 8, 2026
bde39d4
feat(web): accept file drops into sidebar threads (#7892)
UtkarshUsername Sep 8, 2026
b5d8903
feat(web): accept file drops into sidebar threads (#7892)
UtkarshUsername Sep 8, 2026
061543e
fix(mcp): keep preview snapshots usable by the agent and let it save …
t3dotgg Sep 8, 2026
47eed9f
fix(server): stop Windows terminal processes when closing (#10771)
SunkenInTime Sep 8, 2026
579266c
feat(mobile): use Android wallpaper colors (#10691)
juliusmarminge Sep 8, 2026
4664c57
feat(mobile): add optional Material You layout (#10692)
juliusmarminge Sep 8, 2026
12391bd
feat(web): show project favicon in new-thread project picker (#10790)
gsimone Sep 8, 2026
5d14c0e
fix(desktop): use official logo in macOS installer (#10819)
t3-code[bot] Sep 8, 2026
772ea14
fix(web): honor terminal link browser overrides (#10060)
UtkarshUsername Sep 8, 2026
0fe4c99
fix(desktop): neutral artwork for stable macOS installer (#10820)
t3-code[bot] Sep 8, 2026
5e6cc2b
fix(web): restore text-only draft project title (#10821)
juliusmarminge Sep 8, 2026
3faeee4
refactor(web): consolidate setup wizards into shared components (#10832)
juliusmarminge Sep 8, 2026
de545c4
fix(web): stop the bar under the composer popping in after threads lo…
t3dotgg Sep 8, 2026
7fbc545
fix(web): keep the composer footer still while thread data loads (#10…
t3dotgg Sep 8, 2026
20e2e89
fix(desktop): defer keyring loading until macOS cookie import (#10667)
simplythatguy Sep 8, 2026
fdf34c4
fix(relay): share notification policy and prioritize waiting agents (…
juliusmarminge Sep 8, 2026
3dfc134
fix(relay): recheck queued iOS alerts and retain fast completions (#1…
juliusmarminge Sep 8, 2026
9d6c43f
fix(mobile): respect notification permission when tokens rotate (#10850)
juliusmarminge Sep 8, 2026
3e6f856
fix(mobile): tolerate native Headers without getSetCookie (#10851)
juliusmarminge Sep 8, 2026
1862686
fix(relay): use current APNs registration routing for queued jobs (#1…
juliusmarminge Sep 9, 2026
08463e2
fix(server): release consumed event replay pages (#10777)
Gigioxx Sep 9, 2026
2a30353
feat(mobile): arrange threads with drag handles (#10496)
juliusmarminge Sep 9, 2026
6c58362
feat(mobile): add Android agent notifications and ongoing activity (#…
ryanrhughes Sep 9, 2026
a29a7cc
fix(mobile): blur glass fallbacks to prevent background text bleed (#…
juliusmarminge Sep 9, 2026
e16b8b0
feat(web): add provider model bulk toggle (#10947)
UtkarshUsername Sep 9, 2026
50f918c
fix(web): allow expanding duplicate tool call commands (#10981)
Yash-Singh1 Sep 9, 2026
75e4ceb
fix(mobile): prevent Android chat rows overlapping during sync (#10983)
SunkenInTime Sep 9, 2026
383cc40
fix(mobile): prevent text leaking through Android glass (#10998)
juliusmarminge Sep 9, 2026
afb8489
feat(pull-requests): link multiple pull requests to threads (#10839)
juliusmarminge Sep 9, 2026
f0401c6
feat(search): find threads by linked pull request (#10870)
juliusmarminge Sep 9, 2026
de37964
feat(prs): navigate, merge and rebase GitHub stacks (#10875)
juliusmarminge Sep 9, 2026
33242d0
fix(server): preserve recent PR reads across server restarts (#11007)
juliusmarminge Sep 9, 2026
8d8189e
feat(web): zoom and pan expanded images (#10869)
maria-rcks Sep 9, 2026
b7b3ef1
fix(ui): use available space for composer model names (#11002)
juliusmarminge Sep 9, 2026
addfb13
fix(web): restore pr list diff counts to the top right (#10609)
maria-rcks Sep 10, 2026
385cc0a
fix(web): show message copy buttons on touch devices (#11020)
maria-rcks Sep 10, 2026
d1eeb16
fix(web): middle-click pastes in the terminal on Linux (#11018)
maria-rcks Sep 10, 2026
0f602b3
fix(editors): open remote projects in Zed (#11022)
maria-rcks Sep 10, 2026
bb5e824
feat: add blue and orange diff color palette (#10671)
maria-rcks Sep 10, 2026
d29c56a
fix(server): resolve project identity before legacy pr relinks (#11045)
t3-code[bot] Sep 10, 2026
444fd8b
fix(mobile): keep Android markdown icons aligned with text (#11079)
SunkenInTime Sep 10, 2026
3836890
Revert "fix(mobile): keep Android markdown icons aligned with text" (…
juliusmarminge Sep 10, 2026
e784975
fix(ui): simplify multiple linked pull request badges (#11104)
maria-rcks Sep 10, 2026
0882431
fix(preview): return to pip when closing the right panel (#11102)
maria-rcks Sep 10, 2026
0527ddf
fix: quiet settled threads and simplify PR badges (#11101)
juliusmarminge Sep 10, 2026
f814983
fix(web): emphasize primary pull request actions (#11105)
juliusmarminge Sep 10, 2026
21a5ccf
fix(web): prevent seams in the topbar scroll fade (#10914)
caezium Sep 10, 2026
21d7440
fix(web): fit provider update text inside sidebar notices (#11034)
MatthewFeroz Sep 10, 2026
3997b9a
fix(web): align floating browser preview corners (#10915)
caezium Sep 10, 2026
60eff99
fix(web): save PR body edits with Cmd/Ctrl+Enter (#10660)
flamboh Sep 10, 2026
502131a
fix(web): collapse a tool call by clicking its expanded label (#11017)
maria-rcks Sep 10, 2026
dca7b59
feat(devices): add simulator and emulator support (#10677)
juliusmarminge Sep 10, 2026
e022fa4
feat(devices): scope targets and sessions to their hosts (#10854)
juliusmarminge Sep 10, 2026
7734c6d
feat(devices): target concurrent agent sessions across hosts (#10855)
juliusmarminge Sep 10, 2026
d2eeacd
feat(devices): connect simulator hosts over SSH (#10856)
juliusmarminge Sep 10, 2026
dfa345b
feat(web): use a compact right-panel surface menu (#11111)
maria-rcks Sep 10, 2026
32b6909
fix(mobile): keep Android markdown icons aligned (#11118)
none23 Sep 10, 2026
47dbb06
fix(mobile): add close controls to tablet files and terminal (#11115)
juliusmarminge Sep 10, 2026
96f4370
fix(mobile): preserve the final composer animation frame (#11114)
juliusmarminge Sep 10, 2026
859304b
fix(mobile): keep composer transitions aligned (#11127)
juliusmarminge Sep 10, 2026
1a9336b
refactor(mobile): name shared markdown renderer without iOS suffixes …
SunkenInTime Sep 10, 2026
a5ac766
fix(media): preserve playback during fullscreen transitions (#11113)
maria-rcks Sep 10, 2026
39ca417
fix(marketing): redirect /app to app.t3.codes (#11145)
t3-code[bot] Sep 10, 2026
2afa02a
chore(marketing): update to 300k users and 22k stars (#11146)
t3-code[bot] Sep 10, 2026
c52b8d9
feat(command-palette): show environments in search results (#10722)
Cyberlane Sep 10, 2026
6a2d246
fix(pr): update labels and reviewers without redundant reloads (#11117)
maria-rcks Sep 11, 2026
27eb79d
fix(chat): fold question answers into tool activity (#11014)
maria-rcks Sep 11, 2026
48654c1
fix(usage): flag unpriced model activity instead of showing $0.00 (#1…
maria-rcks Sep 11, 2026
5735693
fix(server): let Claude launch args override the derived permission m…
maria-rcks Sep 11, 2026
20ef250
fix(editors): accept root paths and Windows servers in Zed remote lin…
maria-rcks Sep 11, 2026
4d06156
fix(web): center pull request unavailable states (#11110)
maria-rcks Sep 11, 2026
0a37240
fix(web): remove sidebar pull request link icon (#11179)
maria-rcks Sep 11, 2026
02297e3
fix(ui): color linked pr counts by aggregate status (#11180)
maria-rcks Sep 11, 2026
6c69534
fix(preview): render website favicons for browser tool activity (#11032)
maria-rcks Sep 11, 2026
18c5a1d
fix(web): simplify pull request summary sections (#10612)
maria-rcks Sep 11, 2026
ef6fa11
fix(web): preserve drafts when compacting context (#11103)
maria-rcks Sep 11, 2026
57aee3e
fix(server): queue messages during context compaction (#11107)
maria-rcks Sep 11, 2026
8fc2536
perf(web): format minimap previews only when opened (#11181)
juliusmarminge Sep 11, 2026
a9dabbf
perf(web): reuse completed Markdown prefixes while streaming (#11193)
juliusmarminge Sep 11, 2026
d7d7f8f
perf(web): resume syntax highlighting from completed lines (#11196)
juliusmarminge Sep 11, 2026
8078c53
perf(web): preserve completed code-line DOM while streaming (#11198)
juliusmarminge Sep 11, 2026
211618f
perf(web): huge-thread switch no longer blanks the chat pane (#11169)
juliusmarminge Sep 11, 2026
fb3d165
fix(web): show platform file manager icons in Open menu (#11228)
Bil0000 Sep 11, 2026
26894dd
fix(server): detect file renames in review diffs (#8086)
jakeleventhal Sep 11, 2026
5eecc24
fix(cli): pin shared Effect dependency for npm installs (#11240)
jakeleventhal Sep 11, 2026
2ebc9fa
fix(mobile): prevent Hermes crashes when opening threads (#11233)
jakeleventhal Sep 11, 2026
05d4042
feat(web): open Usage on the Limits tab by default (#11261)
juliusmarminge Sep 11, 2026
2b7d3a4
perf(web): avoid scanning chat history for sidebar backgrounds (#11206)
juliusmarminge Sep 11, 2026
7bd7f99
perf(mobile): reuse completed code lines while streaming (#11211)
juliusmarminge Sep 11, 2026
6e8931d
perf(client): reduce remote request and message sync overhead (#11029)
Bil0000 Sep 11, 2026
e1c94f7
fix(web): refresh usage limit countdowns without switching tabs (#11187)
t3-code[bot] Sep 11, 2026
fb52d12
fix(client-runtime): typecheck device hub ticket request on main (#11…
juliusmarminge Sep 11, 2026
2c0e891
feat(settings): add per-project overrides for scopable server setting…
juliusmarminge Sep 11, 2026
8b2c046
feat(web): pick settings environment and project as two selects (#10636)
juliusmarminge Sep 11, 2026
e22040d
feat(settings): edit any scopable setting as a project override (#10639)
juliusmarminge Sep 11, 2026
8bbe2bf
feat(web): float device streams over chat (#11285)
juliusmarminge Sep 11, 2026
18f7254
fix(web): floating preview can use the margins beside the composer (#…
juliusmarminge Sep 11, 2026
e145c5f
perf(client-runtime): speed up message sync on desktop and mobile (#1…
Bil0000 Sep 11, 2026
15c6167
fix(web): use the configured panel shortcut on the PR page (#11292)
Bil0000 Sep 11, 2026
b3ed07f
feat(web): add PR page selections to new draft threads (#11296)
Bil0000 Sep 11, 2026
0eaa18c
feat(web): show recording status on floating previews (#11312)
maria-rcks Sep 11, 2026
095d575
fix(desktop): hold-to-quit no longer strands the quit (#11016)
maria-rcks Sep 11, 2026
4a8ab1b
feat(web): mark projects on another machine in project pickers (#11323)
maria-rcks Sep 11, 2026
8711929
fix(web): show pointer cursors on pull request controls (#11283)
shivamhwp Sep 11, 2026
867eb9b
fix(web): themed panel toggles show their disabled state (#11188)
flamboh Sep 11, 2026
50791a0
fix(web): use branch wording in commit dialogs (#11281)
shivamhwp Sep 11, 2026
cd64ad3
fix(mobile): keep Android file icons on the line with wrapped filenam…
SunkenInTime Sep 11, 2026
a92161a
fix(codex): preserve qualified model ids in selection and generation …
maria-rcks Sep 11, 2026
36668db
feat(desktop): share macOS permission onboarding (#11289)
juliusmarminge Sep 11, 2026
8a2d5f5
fix(test): drain worker broadcasts before restoring browser globals (…
maria-rcks Sep 12, 2026
8461c25
fix(web): disable linked pull requests when none are linked (#11348)
maria-rcks Sep 12, 2026
1f73a89
fix(models): default to astra medium and fable 5.1 medium (#11347)
maria-rcks Sep 12, 2026
4d16e6b
fix(web): align provider settings with shared settings rows (#10571)
maria-rcks Sep 12, 2026
cf1ba3d
feat(settings): configure default permissions for new threads (#11346)
maria-rcks Sep 12, 2026
fd5553f
fix: restore provider history and prompts when rewinding (#11338)
maria-rcks Sep 12, 2026
25da986
fix(web): keep comment actions visible when pr comments are folded (#…
maria-rcks Sep 12, 2026
efccda9
feat: rewind conversations while keeping file changes (#11358)
maria-rcks Sep 12, 2026
3882778
fix(web): keep sidebar scroll position when pinning threads (#10757)
saphid Sep 12, 2026
8eec78c
fix(web): remove pr description reactions (#11361)
maria-rcks Sep 12, 2026
e816064
fix(desktop): keep preview keystrokes out of the composer (#11354)
maria-rcks Sep 12, 2026
4a4c6dd
feat(settings): add open source license notices (#8962)
juliusmarminge Sep 12, 2026
ca6416e
perf(client): reduce repeated sorting and date formatting (#11019)
Bil0000 Sep 12, 2026
4fed6cf
feat: add inline file previews and attachment chips across surfaces (…
chrisdeeming Sep 12, 2026
57b23a0
fix(desktop): preserve long offscreen text in SnapShots (#11250)
Bil0000 Sep 12, 2026
b1e223e
perf(server): avoid workspace scans when loading pull requests (#11299)
Bil0000 Sep 12, 2026
d1d15c6
feat(sidebar): fold the project scope into the search row (#11315)
maria-rcks Sep 12, 2026
18d8cbf
fix(mobile): pin expo-audio so the release smoke patch stays in use (…
ipanasenko Sep 12, 2026
5349522
Delete .pnpm-store/v11 directory
juliusmarminge Sep 12, 2026
a43f9b4
fix(web): preserve snapshot preview size in sent messages (#11429)
Bil0000 Sep 12, 2026
bbedad0
fix(mobile): render photo library picks to a bounded JPEG off the JS …
Nelglor Sep 12, 2026
c542b78
fix(desktop): keep the native preview User-Agent so Turnstile passes …
akriaueno Sep 12, 2026
3486451
fix(chat): keep user input outside collapsed work (#11363)
maria-rcks Sep 12, 2026
cfeaca4
fix(web): preserve preview focus on window return (#11444)
Lucenx9 Sep 12, 2026
03e1355
fix(web): complete thread status icons and keep input threads promine…
maria-rcks Sep 12, 2026
75d8b13
feat(web): tint image chips with their average color (#11468)
maria-rcks Sep 12, 2026
c1ff6ab
fix(web): move viewer controls outside media and restore arrow naviga…
maria-rcks Sep 12, 2026
b0c6c3b
fix(web): tighten sidebar search and footer spacing (#11466)
maria-rcks Sep 12, 2026
c0ddfb3
feat(web): subagent spawns render as an expandable work row (#11433)
maria-rcks Sep 12, 2026
af2bacc
fix(web): keep subagent rows visible under folded turns (#11474)
maria-rcks Sep 12, 2026
fcbe457
fix(usage): make unavailable account limits more visible (#10601)
dominic-r Sep 12, 2026
8ddd9f7
fix(desktop): bound backend shutdown wait during quit (#7599)
ishaanko Sep 12, 2026
36caf20
feat(web): choose the default diff file state (#11484)
maria-rcks Sep 13, 2026
68c2277
feat(composer): fold large pastes into text attachments (#11442)
chrisdeeming Sep 13, 2026
6cdbf76
feat(web): expose each chat message as a heading for screen readers (…
Leos-Khai Sep 13, 2026
2db675a
fix(usage): respect provider account homes (#11485)
maria-rcks Sep 13, 2026
2587c80
feat(web): switch saved environments off instead of removing them (#1…
t3dotgg Sep 13, 2026
5781e2b
fix(mobile): stop crashing on launch when a thread has a PR stack (#1…
juliusmarminge Sep 13, 2026
af0657e
fix(mobile): stop alerting that shared content vanished after sending…
juliusmarminge Sep 13, 2026
0e0ddae
feat(web): add opt-in thread notifications and sounds (#11481)
maria-rcks Sep 13, 2026
c299764
fix(server): open Cursor links in classic IDE mode (#11498)
Yash-Singh1 Sep 13, 2026
6fd68f5
feat(source-control): support Forgejo and Gitea with fj and tea (#11436)
maria-rcks Sep 13, 2026
0c5771d
fix(web): match draft row heights to thread rows (#11512)
Yash-Singh1 Sep 13, 2026
3138f57
fix(grok): emit task lifecycle for monitors and background shells (#9…
Svyk Sep 13, 2026
46140c9
fix(web): unify panel resizing and retain final drag width (#11529)
maria-rcks Sep 13, 2026
2ec59ca
fix(web): hide back button for single linked pull requests (#11520)
maria-rcks Sep 13, 2026
21d53ca
fix(files): browse ignored files and load folders on demand (#11527)
maria-rcks Sep 13, 2026
d7c71f9
feat(web): float the pull request comment composer (#11531)
maria-rcks Sep 13, 2026
8b3ddf5
fix(mobile): stop crashing on launch before the shell snapshot arrive…
juliusmarminge Sep 13, 2026
db6e053
feat(github): route pull request operations across matching accounts …
maria-rcks Sep 13, 2026
20a8f1d
chore(mobile): enable noUncheckedIndexedAccess and noImplicitOverride…
juliusmarminge Sep 13, 2026
0a91b9a
feat(mobile): show startup crashes in Settings → Diagnostics (#11540)
juliusmarminge Sep 13, 2026
17f8e2a
feat(mobile): add pooled subscription usage widgets (#11506)
MatthewFeroz Sep 13, 2026
20363c3
feat(web): add provider selector to pull request toolbar (#11524)
maria-rcks Sep 13, 2026
6e22847
feat(web): show completion toasts for inactive threads
Bil0000 Sep 13, 2026
658e025
feat(web): make in-app thread notifications opt-in
Bil0000 Sep 13, 2026
fdfe51f
feat(web): share all thread alerts with in-app toasts
Bil0000 Sep 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
31 changes: 15 additions & 16 deletions .agents/skills/test-t3-app/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,25 @@ Use this skill for the web client. For iOS Simulator, Android Emulator, or physi
2. Choose a base directory that belongs only to the current worktree or test:
- Use the repository's ignored `.t3` directory for reusable worktree-local state.
- Use `mktemp -d /tmp/t3code-test.XXXXXX` for disposable state and retain the printed absolute path.
3. Start the full web stack with `vp run dev`. In a linked worktree it defaults to that worktree's gitignored `.t3`; pass `--home-dir <base-dir>` only when the test needs a different isolated directory.
3. Start the full web stack with `vp run dev`. Add `--share` when the user needs to open it from another tailnet device. In a linked worktree it defaults to that worktree's gitignored `.t3`; pass `--home-dir <base-dir>` only when the test needs a different isolated directory.
4. Keep the terminal session alive and read the selected server port, web port, base directory, and pairing URL from its output.

Treat a base directory as disposable only when it was created or deliberately selected for the current test. Never delete or directly seed the shared `~/.t3` directory. Prefer starting with a new temporary base directory over clearing state of uncertain ownership.

The worktree-local default deliberately outranks an ambient `T3CODE_HOME`; do not pass the shared home through to a worktree dev server.

Ports are derived from the worktree path but can shift when occupied. Always read the actual values from the `[dev-runner]` line.

Shared browser dev is single-origin: Vite proxies the backend paths, so never set `VITE_HTTP_URL` or `VITE_WS_URL` for `dev`/`dev:web`.

The dev runner disables browser auto-open by default. Do not pass `--browser` during automated testing: an automatically opened page can consume the one-time bootstrap token before the controlled browser uses it.

### Verify a shared environment before human handoff

When another person will use the printed pairing URL, first open the shared origin without the pairing path or fragment in the controlled browser and confirm the T3 Code app loads. This browser navigation is required even when curl succeeds because browsers block some otherwise reachable ports before making a network request.

Do not open the other person's complete pairing URL during this reachability check; doing so consumes its one-time token. If the agent also needs an authenticated browser, create and consume a separate pairing token, then leave a fresh token for the other person.

## Preserve the environment while iterating

Treat the overall testing or implementation loop—not an assistant turn or one verification pass—as the environment lifecycle boundary.
Expand All @@ -30,7 +40,7 @@ Treat the overall testing or implementation loop—not an assistant turn or one
- Do not stop the server merely because one verification pass completed or because you are yielding a response to the user.
- Before starting another environment, check whether the existing process and browser tab still serve the task. Reuse them when healthy instead of discarding useful state.
- On a later turn, verify that the existing process is alive and reuse its printed ports and base directory. If it exited, restart with the same base directory; create a new pairing token only when the browser session is no longer valid.
- Tell the user when a test environment remains available, including its non-secret web URL when useful. Never include a pairing token.
- Tell the user when a test environment remains available, including its non-secret web URL when useful. Include a pairing token only when the user still needs to pair (see below).

## Authenticate the browser on the first navigation

Expand All @@ -40,24 +50,13 @@ Treat the overall testing or implementation loop—not an assistant turn or one
4. Wait for the pairing exchange and redirect to finish before navigating elsewhere.
5. Continue in the same browser context so its stored bearer session remains available.

Treat pairing URLs as secrets. Do not copy them into final responses, screenshots, committed files, or durable logs. A pairing token is short-lived and single-use; opening the URL in another browser or opening it twice can consume it.
Keep pairing URLs out of screenshots, committed files, and durable logs. When the user asked for a shared environment, the deliverable IS the full pairing URL — paste it in your reply, token and all; a bare origin is useless to them. A pairing token is short-lived and single-use; opening the URL in another browser or opening it twice can consume it, so never open a URL you handed to the user.

## Recover a consumed or expired pairing token

Create another token against the same database and web URL as the running dev server:

```bash
T3CODE_PORT=<server-port> node apps/server/src/bin.ts auth pairing create \
--base-dir <base-dir> \
--dev-url <web-url> \
--base-url <web-url> \
--ttl 15m \
--label agent-ui-test
```

Use the `Pair URL` from this command once. Derive `<server-port>` and `<web-url>` from the current dev-runner output, including any automatically selected port offset. Setting `T3CODE_PORT` keeps the administrative CLI from probing for an unrelated free port.
Run `node apps/server/src/bin.ts pair` from the repository root. It discovers the running dev server (worktree `.t3` first, same precedence as the dev runner) and prints a fresh `Pair URL` against the server's current web origin, including a `--share` tailnet origin. Pass `--base-dir <base-dir>` only when the server was started with `--home-dir`, using the identical path.

Always pass `--dev-url` for a dev-runner environment so the generated pairing URL uses the current web origin. An explicit base directory stores runtime state in `<base-dir>/userdata`; the `<base-dir>/dev` fallback is only used by an implicit dev home. A worktree-local `.t3` counts as explicit, so its state lives in `<worktree>/.t3/userdata`. Use `auth pairing list` to inspect active token metadata; it intentionally cannot reveal token secrets.
Tokens from `pair` carry standard client scopes. The startup pairing URL carries admin scopes; if the user needs Settings → Connections management (`access:write`), restart the server and hand over the new startup URL instead.

## Inspect or seed SQLite state

Expand Down
36 changes: 18 additions & 18 deletions .agents/skills/test-t3-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Use these client origins:
- Android Emulator: `http://10.0.2.2:<server-port>`
- Physical device: bind the backend to `0.0.0.0` and use the host's reachable LAN origin

Always enter the complete `http://` origin; the mobile host field otherwise assumes HTTPS. When testing web and mobile together, run `vp run dev --home-dir <base-dir> --host 127.0.0.1` instead and do not launch a second backend over the same base directory.
Enter the complete `http://` origin to make the test transport explicit. Bare IP addresses default to HTTP, while bare hostnames default to HTTPS. When testing web and mobile together, run `vp run dev --home-dir <base-dir> --host 127.0.0.1` instead and do not launch a second backend over the same base directory.

## Start or reuse Metro safely

Expand All @@ -80,7 +80,6 @@ Run Metro from `apps/mobile`.
APP_VARIANT=development vp exec expo start \
--dev-client \
--scheme t3code-dev \
--clear \
--lan \
--port <metro-port>
```
Expand Down Expand Up @@ -125,31 +124,29 @@ Do not start, stop, erase, or reconfigure an emulator owned by another task. Tra

## Pair each client once

Issue a fresh credential against the running backend's exact base directory:
Use the bundled helper from the repository root. It issues a fresh credential against the running backend's exact base directory, opens the existing Add Environment route with the credential in an encoded query parameter, and asks that route to connect once:

```bash
T3CODE_PORT=<server-port> node apps/server/src/bin.ts auth pairing create \
--base-dir <base-dir> \
--base-url <mobile-origin> \
--ttl 15m \
--label agent-mobile-<short-device-id>
.agents/skills/test-t3-mobile/scripts/pair-client.sh \
ios <simulator-udid> <server-port> <base-dir>

.agents/skills/test-t3-mobile/scripts/pair-client.sh \
android <emulator-serial> <server-port> <base-dir>
```

In PowerShell, set `$env:T3CODE_PORT = "<server-port>"` first and run the `node ... auth pairing create` command without the leading assignment.
Run only the command for the selected platform. The helper uses `http://127.0.0.1:<server-port>` for iOS and `http://10.0.2.2:<server-port>` for Android. Pass a fifth argument only when testing a non-development URL scheme.

If the visible Add Environment action is not exposed as a semantic target, open the app's registered route instead of guessing coordinates:
The helper opens this registered route:

```bash
xcrun simctl openurl <simulator-udid> 't3code-dev://connections/new'
adb -s <emulator-serial> shell am start -W \
-a android.intent.action.VIEW \
-d 't3code-dev://connections/new' \
com.t3tools.t3code.dev
```text
t3code-dev://connections/new?pairingUrl=<encoded-pairing-url>&autoConnect=1
```

Run only the command for the selected platform.
The Add Environment route owns the behavior: `pairingUrl` prefills its normal host and token inputs, while `autoConnect=1` submits once in development builds and returns to Home after success. Without `autoConnect`, the same route only prefills the form for manual inspection.

Do not enter pairing hosts or tokens through simulator keyboard automation. Xcode's semantic typer sends HID-style key events through the simulator's active keyboard state, which can corrupt uppercase tokens and punctuation even when the host Mac uses a U.S. input source. The one-shot route is the deterministic pairing path. Use the visible form only as a fallback, and paste credentials rather than typing them character by character.

In T3 Code Dev, open Add Environment and enter the complete `<mobile-origin>` and newly printed `Token`. Verify the expected seeded projects appear before exercising the affected flow.
Verify the expected seeded projects appear before exercising the affected flow.

Pairing credentials are secret, short-lived, and single-use. Create a different credential for every simulator, emulator, physical device, or browser. If an attempt fails, issue a new credential rather than retrying the old one. Do not expose tokens in screenshots, commits, or final responses.

Expand Down Expand Up @@ -181,8 +178,11 @@ Keep local verification focused. Do not turn this workflow into a full repositor
## Troubleshoot predictable failures

- **Old UI or an old error appears:** verify Metro's worktree, variant, URL, and port before diagnosing the app.
- **Metro serves stale or invalid transforms after those checks:** stop the owned Metro process and run `vp run dev:client:reset` once on the standard port. For a custom port, add `--clear` to the complete explicit `expo start` command above.
- **The environment remains empty:** verify the platform-specific HTTP origin, use a fresh token, and confirm project seeding used the identical base directory.
- **A second client cannot pair:** pairing tokens are single-use; issue another token.
- **The pairing form opens but does not connect:** confirm the deep link uses the existing `connections/new` route, includes `autoConnect=1`, and carries a freshly minted encoded `pairingUrl`.
- **Pairing text changes case or punctuation:** do not retry semantic typing. Use `scripts/pair-client.sh`; the simulator keyboard layout and HID input path are not reliable for credentials.
- **iOS semantic actions fail:** set explicit XcodeBuildMCP defaults and refresh with `snapshot_ui`.
- **Android cannot reach Metro:** verify `adb reverse` for the exact Metro port and relaunch the development-client URL.
- **Android cannot reach the backend:** use `10.0.2.2`, not `127.0.0.1`, for the Android Emulator.
72 changes: 72 additions & 0 deletions .agents/skills/test-t3-mobile/scripts/pair-client.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#!/usr/bin/env bash

set -euo pipefail

usage() {
echo "Usage: $0 <ios|android> <device-id> <server-port> <base-dir> [url-scheme]" >&2
exit 2
}

[[ $# -ge 4 && $# -le 5 ]] || usage

platform="$1"
device_id="$2"
server_port="$3"
base_dir="$4"
url_scheme="${5:-t3code-dev}"

case "$platform" in
ios)
mobile_origin="http://127.0.0.1:${server_port}"
;;
android)
mobile_origin="http://10.0.2.2:${server_port}"
;;
*)
usage
;;
esac

repo_root="$(git rev-parse --show-toplevel)"
cd "$repo_root"

if ! pairing_output="$({
T3CODE_PORT="$server_port" node apps/server/src/bin.ts auth pairing create \
--base-dir "$base_dir" \
--base-url "$mobile_origin" \
--ttl 15m \
--label "agent-mobile-${device_id:0:8}"
} 2>&1)"; then
echo "Could not mint a mobile pairing credential." >&2
exit 1
fi

pairing_url="$(printf '%s\n' "$pairing_output" | sed -n 's/^Pair URL: //p' | tail -n 1)"
if [[ -z "$pairing_url" ]]; then
echo "Could not parse the mobile pairing URL." >&2
exit 1
fi

deep_link="$(PAIRING_URL="$pairing_url" URL_SCHEME="$url_scheme" node - <<'NODE'
const query = new URLSearchParams({
pairingUrl: process.env.PAIRING_URL,
autoConnect: "1",
});
process.stdout.write(`${process.env.URL_SCHEME}://connections/new?${query}`);
NODE
)"

case "$platform" in
ios)
xcrun simctl openurl "$device_id" "$deep_link"
;;
android)
# adb shell re-joins its arguments and evaluates them through the device
# shell, so the deep link's `?`/`&` must be quoted once more for that shell.
adb -s "$device_id" shell \
"am start -W -a android.intent.action.VIEW -d '$deep_link' com.t3tools.t3code.dev" \
>/dev/null
;;
esac

echo "Opened the existing Add Environment route with a fresh pairing credential."
4 changes: 4 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
reviews:
review_status: false
auto_review:
enabled: true
82 changes: 63 additions & 19 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,29 +1,73 @@
// Dev container for T3 Code. Mirrors CI (ubuntu-24.04, Node 24, Rust stable)
// and the canonical setup in docs/operations/development.md: global `vp`, `vp i`.
// Contributor doc: docs/internals/devcontainer.md
{
"name": "T3 Code Dev",
"image": "debian:bookworm",
"name": "T3 Code",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04",
"features": {
"ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers-extra/features/bun:1": {
"version": "1.3.11"
// nodeGypDependencies (default true) brings python3/make/g++, which Linux
// needs for node-pty's node-gyp fallback (its prebuilds are mac/win only).
"ghcr.io/devcontainers/features/node:2": {
"version": "24"
},
"ghcr.io/devcontainers/features/node:1": {
"version": "24.13.1"
},
"ghcr.io/devcontainers/features/python:1": {
"version": "3.10",
"installTools": false
}
// native/resource-monitor (edition 2024, needs stable >= 1.85). The server
// degrades gracefully without the binary, but CI checks cargo fmt + test.
"ghcr.io/devcontainers/features/rust:1": {},
"ghcr.io/devcontainers/features/github-cli:1": {}
},
"hostRequirements": {
"cpus": 4,
"memory": "8gb",
"storage": "32gb"
},
"containerEnv": {
// Keep all runtime state inside the (gitignored) workspace .t3, matching
// the worktree default. An explicit --home-dir still wins.
"T3CODE_HOME": "${containerWorkspaceFolder}/.t3"
},
"overrideFeatureInstallOrder": [
"ghcr.io/devcontainers/features/git",
"ghcr.io/devcontainers-extra/features/bun"
"mounts": [
// vp keeps the pnpm content-addressable store and metadata cache under
// ~/.cache/pnpm (verified: the v11 store dir lives there); mounting a
// volume there lets installs survive container rebuilds.
"source=t3code-pnpm-store,target=/home/vscode/.cache/pnpm,type=volume",
// Root node_modules holds the whole pnpm virtual store (.pnpm), so one
// volume keeps the heavy tree off the slow macOS/Windows bind mount.
// Scoped by devcontainerId so parallel checkouts do not share it.
// Codespaces note: prebuild snapshots exclude volumes; drop these mounts
// if prebuilt codespaces become the primary workflow.
"source=t3code-node-modules-${devcontainerId},target=${containerWorkspaceFolder}/node_modules,type=volume"
],
"postCreateCommand": {
"bun-install": "bun install --backend=copyfile --frozen-lockfile"
"onCreateCommand": "bash .devcontainer/on-create.sh",
"updateContentCommand": "bash .devcontainer/update-content.sh",
"forwardPorts": [5733, 13773],
"portsAttributes": {
"5733": {
"label": "t3 web (open via the pairing URL, not the bare origin)",
"onAutoForward": "notify"
},
"13773": {
"label": "t3 server",
"onAutoForward": "silent"
}
},
"customizations": {
"codespaces": {
"openFiles": ["docs/internals/devcontainer.md"]
},
"vscode": {
"extensions": ["oxc.oxc-vscode"]
"extensions": ["oxc.oxc-vscode", "rust-lang.rust-analyzer"],
"settings": {
// .repos is a large vendored read-only reference tree; watching it
// burns CPU and file handles.
"files.watcherExclude": {
"**/.repos/**": true,
"**/.t3/**": true
},
"search.exclude": {
"**/.repos": true
}
}
}
}
},
"remoteUser": "vscode"
}
38 changes: 38 additions & 0 deletions .devcontainer/on-create.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/usr/bin/env bash
# One-time container setup, baked into prebuilds. Content-dependent work
# (dependency install, Chromium) lives in update-content.sh.
set -euo pipefail

# The Vite+ CLI is the repo task runner (vp i, vp run dev, vp test run).
# Download to a file first: a curl failure inside $( ) would yield an empty
# script and a false success. VP_NODE_MANAGER=no skips the installer's node
# shims; Node comes from the devcontainer feature. The VP_*_DIR group (set
# together, absolute) pins the install location instead of the installer's
# XDG platform defaults, which moved the binary from ~/.vite-plus/bin to
# ~/.local/share/vite-plus/bin between releases and would break the check
# below either way.
export VP_BIN_DIR="$HOME/.local/share/vite-plus/bin"
export VP_DATA_DIR="$HOME/.local/share/vite-plus"
export VP_CACHE_DIR="$HOME/.cache/vite-plus"
installer=$(mktemp)
curl -fsSL https://vite.plus -o "$installer"
VP_NODE_MANAGER=no bash "$installer"
rm -f "$installer"

# Non-login lifecycle shells never source the profile the installer edits,
# so expose vp on the default PATH. test -x keeps a bad install loud.
test -x "$VP_BIN_DIR/vp"
sudo ln -sf "$VP_BIN_DIR/vp" /usr/local/bin/vp

# First-run terminal notice, rendered by the devcontainers base image.
sudo mkdir -p /usr/local/etc/vscode-dev-containers
sudo tee /usr/local/etc/vscode-dev-containers/first-run-notice.txt >/dev/null <<'EOF'
T3 Code devcontainer

vp run dev start server + web, then open the pairing URL it
prints (the bare forwarded port will not authenticate)
cp .env.example .env optional: enable T3 Connect cloud features
(public identifiers, not secrets)

Details: docs/internals/devcontainer.md
EOF
19 changes: 19 additions & 0 deletions .devcontainer/update-content.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/usr/bin/env bash
# Runs at creation and on every prebuild content refresh, so codespaces start
# with deps installed and caches warm. Everything here is idempotent.
set -euo pipefail

# Volume mounts (pnpm store, node_modules) and the directories docker creates
# for them arrive root-owned; hand them to the dev user before installing.
for dir in "$HOME/.cache" "$HOME/.cache/pnpm" node_modules; do
if [ -d "$dir" ] && [ "$(stat -c %U "$dir")" != "$(id -un)" ]; then
sudo chown "$(id -un):$(id -gn)" "$dir"
fi
done

CI=true vp i
# Repairs electron's path.txt and exec bits after install, same as CI.
vp run --filter @t3tools/desktop ensure:electron
# Pre-warms Vite's dep optimizer (cache is keyed on the absolute path, which
# is stable inside the container).
node apps/web/scripts/warm-dep-cache.ts
Loading
Loading