Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
762 commits
Select commit Hold shift + click to select a range
bd2346e
fix(server): refuse editor paths with line breaks or quotes when the …
juliusmarminge Oct 10, 2026
c77a7b7
fix(web): align compact button touch targets (#17748)
Yash-Singh1 Oct 10, 2026
6266af3
fix(server): t3_thread_launch refuses a new worktree whose base ref h…
tris203 Oct 10, 2026
d6f3af7
fix(web): omit underlines on markdown image links (#17728)
Saikrishna1876 Oct 10, 2026
4606f9d
fix(server): restore auto resume for wrapped Claude gateway rate limi…
tzachbon Oct 10, 2026
e1ad595
fix(opencode): name OpenCode 2 sessions after their thread (#17414)
nkoynov Oct 10, 2026
472ea7e
fix(web): find update settings from the command palette (#17396)
sergical Oct 10, 2026
7b09ac7
fix(provider-opencode): tell OpenCode Zen and Go models apart (#17424)
mr-karan Oct 10, 2026
adbecda
fix(server): a pull that fast-forwards no longer fails on large Git o…
ScottN-PV Oct 10, 2026
91474e5
fix(web): cancel question auto-advance after navigation (#17364)
maxwellyoung Oct 10, 2026
33c1e36
fix(server): a bare repository name resolves to the signed-in account…
ScottN-PV Oct 10, 2026
71f6f1d
fix(web): a maximized right panel stays maximized when you return to …
jamesvillarrubia Oct 10, 2026
02612c2
fix(mobile): allow starting a task with only an image (#17409)
Claudesaul Oct 10, 2026
a418075
fix(server): PR watch no longer reports passed while a second run of …
ScottN-PV Oct 10, 2026
a5b4824
fix(server): say why a thread can't be settled (#17258)
DylanTX Oct 10, 2026
03b2105
fix(server): prevent busy terminals from starving history persistence…
StiensWout Oct 10, 2026
de49d63
feat(server): use macOS .icns app icons as project icons (#17149)
psv2522 Oct 10, 2026
a1dee8b
fix(mobile): usage reset icon lines up with its row (#17175)
Aforno Oct 10, 2026
ee7924f
fix(web): paths pasted after @ keep their underscores (#16619)
derektrimm Oct 10, 2026
dd4549e
fix(server): settle every OpenCode subagent call one report answers (…
nkoynov Oct 10, 2026
8bf0a38
perf(web): switching project keeps Diagnostics and Providers mounted …
flamboh Oct 10, 2026
f7664fd
perf(web): Open Source Licenses downloads its manifest once per sessi…
flamboh Oct 10, 2026
94d1a8e
fix(server): restore OpenCode adapter test typecheck (#17810)
Yash-Singh1 Oct 10, 2026
98beed1
fix(server): Claude subagents show the reasoning effort they run at (…
RakshithBhat03 Oct 10, 2026
8c777fb
feat(server): stop Claude subagents without stopping their owner (#17…
Yash-Singh1 Oct 10, 2026
afd98d7
fix(server): stopped native subagents no longer read as Running (#17223)
im-kvijay Oct 10, 2026
a11f464
perf(server): t3_thread_list reads only the listed project's threads …
only21mil Oct 10, 2026
cfbd145
fix(server): show diffs for projects outside the server cwd (#17724)
maria-rcks Oct 10, 2026
50647de
fix(server): check the specific scope for scripts, preview input, and…
juliusmarminge Oct 10, 2026
dacd2cb
fix(source-control): stop Forgejo status refresh from scanning every …
loispostula Oct 10, 2026
fd3549c
refactor(contracts): source control provider kind is an open branded …
juliusmarminge Oct 10, 2026
7bc7328
feat(source-control): each host package ships a client definition (#1…
juliusmarminge Oct 10, 2026
c8a6033
refactor(client-runtime): add project clone sources come from host de…
juliusmarminge Oct 10, 2026
579159d
refactor(web): host presentation and behavior come from client defini…
juliusmarminge Oct 10, 2026
b0249ac
refactor(source-control): reference parsing and project matching are …
juliusmarminge Oct 10, 2026
9b40d37
feat(pull-requests): quick actions follow each host's capabilities, n…
juliusmarminge Oct 10, 2026
a4c8745
feat(projects): new projects can be published to any ready host (#17860)
juliusmarminge Oct 10, 2026
f82796a
fix(server): send Claude MCP servers over the control channel (#17898)
juliusmarminge Oct 10, 2026
ec43786
fix(web): a finished reply replaced by a steer is no longer labeled p…
juliusmarminge Oct 10, 2026
61eb4af
fix(client-runtime): queued runs that start after a steer show up in …
juliusmarminge Oct 10, 2026
2a4ee33
feat(mobile): choose the microphone order for voice input (#17896)
juliusmarminge Oct 10, 2026
4f63275
feat(source-control): host settings live on each host's definition, w…
juliusmarminge Oct 10, 2026
38c187b
fix(pi): preserve tool images and structured results (#17851)
StiensWout Oct 10, 2026
a8bdfdb
fix(server): Claude 5 task lists reach the tasks drawer (#14964)
Mnigos Oct 10, 2026
f92afe7
fix(web): find bar and thread details panel stop covering each other …
MatthewFeroz Oct 10, 2026
0442f5b
fix(web): use server metadata for file chip icons (#17923)
Yash-Singh1 Oct 10, 2026
c8b89a0
fix(desktop): copy images from HTML previews (#17555)
Bil0000 Oct 10, 2026
e408cac
docs(pi): update installation and remote login guidance (#17836)
StiensWout Oct 10, 2026
7e8071f
fix(pi): preserve native abort outcomes (#17853)
StiensWout Oct 10, 2026
160b18c
fix(pi): keep thinking defaults specific to each model (#17835)
StiensWout Oct 10, 2026
62da1cd
fix(pi): preserve shell command exit codes (#17834)
StiensWout Oct 10, 2026
6e9c5a8
fix(pi): expire and cancel extension approvals (#17840)
StiensWout Oct 10, 2026
9afde1c
feat(pi): include native sessions in usage reports (#17848)
StiensWout Oct 10, 2026
818e2be
fix(server): route Copilot ACP subagent output into subagent threads …
maria-rcks Oct 10, 2026
74dfbb6
fix(web): composer banner titles truncate beside their icon instead o…
maria-rcks Oct 10, 2026
953edee
fix(server): Muse turns no longer fail on Windows (#17163)
ntindle Oct 10, 2026
5f7294d
fix(pi): allow known read-only T3 tools without approval (#17852)
StiensWout Oct 10, 2026
4772822
fix: worktree threads keep their worktree when the agent starts, and …
maria-rcks Oct 11, 2026
e4ef8d3
fix(server): keep Claude workflows alive while they report progress (…
maria-rcks Oct 11, 2026
0ecb25a
fix(web): media preview centers its content and pins the close button…
maria-rcks Oct 11, 2026
c73b454
fix(server): threads without a project no longer need Git installed (…
t3dotgg Oct 11, 2026
1cfd1c1
fix(web): toggling tools and thinking at the bottom keeps you at the …
t3dotgg Oct 11, 2026
c727d12
fix(web): Compact chip follows Claude's real prompt cache TTL (#17945)
t3dotgg Oct 11, 2026
75c439f
fix(usage): bound OpenCode history reads to prevent backend OOM (#17961)
Yash-Singh1 Oct 11, 2026
0f36a11
refactor: format diff line counts through one shared helper (#17948)
maria-rcks Oct 11, 2026
72fbad7
fix: new projects start their first thread in the project folder, not…
t3dotgg Oct 11, 2026
cf8479e
perf(server): drive shell last-error lookup from thread bindings (#17…
only21mil Oct 11, 2026
7f0b789
perf(server): skip parsing plain terminal history output (#17179)
StiensWout Oct 11, 2026
1c7b267
perf(server): batch terminal history writes every 250 ms (#17183)
StiensWout Oct 11, 2026
4258c8f
perf(server): storage cleanup no longer runs a full status or size wa…
tris203 Oct 11, 2026
febe1b2
perf(usage): usage scans skip OpenCode legacy messages older than the…
tris203 Oct 11, 2026
9ec472c
perf(usage): OpenCode legacy walk stats entries before checking for s…
tris203 Oct 11, 2026
29e09df
fix(web): MCP app permission prompts no longer overflow the screen (#…
juliusmarminge Oct 11, 2026
716357c
feat(provider-antigravity): support subscription quota and usage limi…
Maseeek Oct 11, 2026
43888b5
fix(desktop): keep generated annotation styles in sync (#17838)
t3-code[bot] Oct 11, 2026
a70ee2a
fix(web): Resume continues on the model picked in the composer (#17867)
akbarakma Oct 11, 2026
3410e43
fix(devices): bump agent-device to 0.21.24 for native Windows hosts (…
TanJeeSchuan Oct 11, 2026
c448e63
fix(web): keybinding group headings no longer touch the group above (…
fixfon Oct 11, 2026
e7db61f
feat(web): configure OpenTelemetry exports in diagnostics (#12538)
MatthewFeroz Oct 11, 2026
08f9b56
docs: update user count to 500k (#17783)
Kamkmgamer Oct 11, 2026
a2f4c7f
fix(mobile): working pill no longer bulges on its right end (#16143)
id0Sch Oct 11, 2026
b467be4
perf(opencode): stop retaining every message of a loaded OpenCode thr…
tris203 Oct 11, 2026
e61eba4
fix(web): switch thumbs stay in their track while scrolling (#15240)
raphaelpra Oct 11, 2026
77c8747
fix(keybindings): thread jumps no longer overlap model picker jumps (…
Fluffy-Bunny-23 Oct 11, 2026
d404a30
fix(mobile): restore QR scanning in iPad pairing sheet (#16019)
arhammahajan Oct 11, 2026
a4a1a80
fix(server): delegated Muse tasks no longer ask approval for every co…
t3dotgg Oct 11, 2026
0eef5d0
fix(codex): prevent unsupported agent history in ChatGPT sharing (#17…
connwalk Oct 11, 2026
4baba3b
fix(server): disabled providers stop checking for CLI updates (#16772)
yordis Oct 11, 2026
758d54a
fix(mobile): round Android queued message sheet corners (#14934)
PixPMusic Oct 11, 2026
584af5a
fix(ssh): record the archive lock owner's real PID (#14598)
Gigioxx Oct 11, 2026
bfbdfed
fix(desktop): keep annotation comment direction independent of host p…
abdelrhmanehab10 Oct 11, 2026
5ce5a8f
fix(ssh): qualify runner script builders in tunnel test (#18078)
juliusmarminge Oct 11, 2026
6c13016
fix(web): keep thread links open until the shell is live (#14697)
saphid Oct 11, 2026
75fca7d
fix(web): scope PR title collapse to tab scrollers (#14644)
Adamulek123 Oct 11, 2026
6cf0526
fix(server): detect fork PRs for branches without upstreams (#13894)
Adamulek123 Oct 11, 2026
a908a7a
fix(search): find threads by their branch PR number (#14658)
tris203 Oct 11, 2026
b9afba5
feat(web): show Claude workflow phases and members in Lineage (#12598)
Bil0000 Oct 11, 2026
2e194f8
fix(mobile): round Android Agents sheet corners (#14925)
PixPMusic Oct 11, 2026
b4542c5
fix(web): the Usage page sends a signed-out browser to pairing (#17938)
AdEx-Partners-DE Oct 11, 2026
cb7d073
fix(server): OpenCode 2 continuations end after a reconnect took a St…
juliusmarminge Oct 11, 2026
ae5fd18
fix(server): OpenCode 2 continuations replay only their own backgroun…
juliusmarminge Oct 11, 2026
f0a47b3
fix(server): ACP reapplies a model after a switch away from it failed…
juliusmarminge Oct 11, 2026
f769e01
fix(web): focus settings search with command-f (#17859)
extoci Oct 11, 2026
5047ee7
fix(mobile): keep Android project paths on one line (#14178)
wellorbetter Oct 11, 2026
0cb3840
fix(web): unpin preview dragging on narrow chat canvases (#15556)
MatthewFeroz Oct 11, 2026
8f43ced
fix(web): thread details toggle no longer covers the thread title on …
freddy-d Oct 11, 2026
8dfee38
fix(server): a directory no longer resolves as the resource monitor b…
Furox-Art Oct 11, 2026
119e61b
fix(server): a Claude usage limit no longer resets the context meter …
Vantrongs Oct 11, 2026
bf725cb
fix(server): GitLab merge requests can expand unchanged lines (#17528)
ScottN-PV Oct 11, 2026
6fa0dd8
fix(provider-cursor): a skill tree deeper than the scan limit no long…
ScottN-PV Oct 11, 2026
5310a4a
fix(web): pass hex theme colors to HTML renders (#16325)
RustedAperture Oct 11, 2026
7808950
fix(web): align the API estimate info icon (#15655)
RakshithBhat03 Oct 11, 2026
cf82199
test(server): ACP teardown tests pass on Windows hosts (#17080)
sheehanmunim Oct 11, 2026
bb9b9aa
fix(server): sync device tool license versions with installer pins (#…
Yash-Singh1 Oct 11, 2026
f845895
fix: sync model favorites and visibility across clients (#16816)
jakeleventhal Oct 11, 2026
4b6d9a0
chore(deps-dev): bump compression from 1.8.1 to 1.8.2 in the npm_and_…
dependabot[bot] Oct 11, 2026
5584d21
fix(server): update fff to stop runaway watcher rescans (#14543)
realhasanshoaib Oct 11, 2026
2025430
fix(mobile): license generation works with filtered installs (#18127)
Yash-Singh1 Oct 11, 2026
8d199b4
fix(mobile): image-only messages ask the agent to respond, like deskt…
whoisaldo Oct 11, 2026
1f6df6b
feat(pull-requests): guided reviews, a beta tour of a pull request (#…
juliusmarminge Oct 11, 2026
18656a3
feat(mcp): agents can write and read pull request review guides (#18143)
juliusmarminge Oct 11, 2026
ed0f7b9
fix(server): Sol Ultrafast stops vanishing from the Codex model picke…
t3dotgg Oct 11, 2026
2625327
fix(usage): say resets momentarily in the final minute (#17869)
extoci Oct 11, 2026
c09c235
fix(server): preserve ambient Cursor MCP servers (#15875)
aravhawk Oct 11, 2026
243c999
fix(server): skip Windows cleanup for exited child processes (#16007)
Alb11747 Oct 11, 2026
8ac6846
feat(settings): providers can be turned on or off per project (#17879)
yordis Oct 11, 2026
f23d008
perf(github): resolve credentials once per GraphQL request (#18289)
juliusmarminge Oct 11, 2026
4946602
fix(server): refresh linked PRs without a checkout (#17167)
PixPMusic Oct 11, 2026
328dc27
fix(mobile): add compose to the single-column iPad list (#18157)
PixPMusic Oct 11, 2026
4bd0ecc
fix(mobile): let sheet lists scroll before dismissal (#17177)
PixPMusic Oct 11, 2026
b4af602
fix(mobile): restore compact iPad trackpad scrolling (#13665)
PixPMusic Oct 11, 2026
b9bf609
fix(mobile): preserve filters across layout changes (#13085)
PixPMusic Oct 11, 2026
80cd575
fix(mobile): separate unfolded thread list from header (#13088)
PixPMusic Oct 11, 2026
a1f81a4
fix(android): Match thread fallback layouts to the loaded pane (#14669)
PixPMusic Oct 11, 2026
74f9df3
fix(mobile): size inline MCP apps to their content (#17040)
PixPMusic Oct 11, 2026
b147dc9
fix(mobile): preserve iPad search chrome across layout changes (#13667)
PixPMusic Oct 11, 2026
2e19207
fix(client): apply host color scheme to saved MCP apps (#17026)
PixPMusic Oct 11, 2026
8863990
fix(android): Use MD3 loading spinners (#14282)
PixPMusic Oct 11, 2026
8de61d4
fix(client): merge No project filters across environments (#17050)
PixPMusic Oct 11, 2026
ac2cc78
fix(client): tolerate blocked cookies in MCP app sandboxes (#17027)
PixPMusic Oct 11, 2026
5495cc4
feat(mobile): browse and review pull requests natively (#18126)
juliusmarminge Oct 11, 2026
bed9239
feat(mobile): guided reviews for pull requests (#18267)
juliusmarminge Oct 11, 2026
5cbe82a
fix(devices): refresh backlogged iOS video and require input admissio…
juliusmarminge Oct 11, 2026
d07a07f
feat(mobile): keep pull requests available offline (#18351)
juliusmarminge Oct 11, 2026
81dbc87
fix(mobile): keep bot badges out of PR attachments (#18347)
juliusmarminge Oct 11, 2026
cafe620
fix(desktop): tooltips no longer open under the Windows and Linux win…
flamboh Oct 11, 2026
1d270be
fix(web): revert trailing toast icons (#18356)
t3-code[bot] Oct 11, 2026
f43f6dd
fix(web): even 4px inset around rows in the PR badge tooltip (#18352)
SunkenInTime Oct 11, 2026
c0c495e
ci(mobile): publish nightly Android APKs to a GitHub prerelease (#16271)
SunkenInTime Oct 11, 2026
3f70c83
fix(server): Claude 5.1+ text before a tool call shows as assistant t…
Gigioxx Oct 11, 2026
c1d528a
feat(provider-muse): native subagents open in their own child threads…
bmdavis419 Oct 11, 2026
662148d
fix(desktop): tooltips no longer open under the macOS traffic lights …
flamboh Oct 11, 2026
55fc13f
fix(web): Cite button stays anchored to the selected text (#17650)
flamboh Oct 11, 2026
9e8c720
fix(web): terminal selection drags scroll at the window edge (#17653)
flamboh Oct 11, 2026
c9181d8
fix(web): scrolling over the thread minimap scrolls the chat (#17652)
flamboh Oct 11, 2026
f6fa477
perf(web): panel toggles no longer re-render the timeline and compose…
flamboh Oct 11, 2026
ca728ec
fix(web): composer keeps its border while resting and expanding (#18333)
flamboh Oct 11, 2026
aaf83ee
fix(web): center the empty-thread placeholder above the composer (#18…
flamboh Oct 11, 2026
2c8e85e
fix(web): PR badge tooltip opens after a thread gains a second PR (#1…
flamboh Oct 11, 2026
83fbbc1
fix(web): timeline keeps live-following after returning from Settings…
flamboh Oct 11, 2026
1d58b82
fix(web): update toast download badge no longer hides behind the prov…
t3dotgg Oct 11, 2026
2783962
fix(shared): preserve generated branch namespaces (#15615)
maria-rcks Oct 11, 2026
6ba6a0d
fix(provider-muse): run on Muse 1.4.6, with linked web search hits an…
t3dotgg Oct 12, 2026
c5d7309
feat(mobile): replace custom Markdown rendering with Enriched (#16979)
juliusmarminge Oct 12, 2026
07993f3
chore(mobile): sync Screens fork with upstream v5 fixes (#18396)
juliusmarminge Oct 12, 2026
6ec6376
docs(mobile): point fork links to pingdotgg (#18433)
juliusmarminge Oct 12, 2026
7ab28a3
perf(web): reuse the collator when sorting diff files (#18420)
saphid Oct 12, 2026
8569ce9
perf(web): avoid quadratic markdown link scans (#18387)
saphid Oct 12, 2026
499a53c
perf(server): expired PR diffs no longer stay in memory until restart…
tris203 Oct 12, 2026
7f02b84
perf(usage): the first usage scan skips decoding transcript lines tha…
tris203 Oct 12, 2026
aa2bfc6
fix(mobile): preserve browser prompt replies across control updates (…
saphid Oct 12, 2026
f570294
fix(web): closed popovers no longer stay on screen and click-through …
akbarakma Oct 12, 2026
821a6d7
fix(web): keybinding settings label Focus URL with a capitalized acro…
RakshithBhat03 Oct 12, 2026
0fd7d2d
fix(web): long commands no longer overflow the Add Action dialog (#18…
fixfon Oct 12, 2026
fded2ca
fix(web): provider Runtime controls follow the settings row layout (#…
ScottN-PV Oct 12, 2026
6bbb72c
perf(web): Thinking shimmer steps instead of drawing every frame (#18…
realhasanshoaib Oct 12, 2026
808bee7
chore(typecheck): typecheck with tsc-rs (#16704)
t3dotgg Oct 12, 2026
9b9792e
test(server): finish workflow reads before changing transcripts (#18192)
lastobelus Oct 12, 2026
6a99eb3
test(server): Claude sign-in message test passes on Windows hosts (#1…
AdEx-Partners-DE Oct 12, 2026
63eaa79
fix(web): context menus no longer scroll when they fit the window (#1…
kacigaya Oct 12, 2026
a5331e4
fix(server): checkpoint restore keeps a nested workspace on Windows (…
JonasFocus Oct 12, 2026
ee2763e
Reject unknown params in t3_thread_read (#17823)
mfazekas Oct 12, 2026
d45d1a1
fix(desktop): Option-click on a chat link opens the system browser (#…
whoisaldo Oct 12, 2026
b8d03ba
fix(mobile): new thread draft names its repo and says it is a new thr…
kaovilai Oct 12, 2026
4a90c1c
fix(web): keep queued threads subscribed (#15293)
ANSHSINGH050404 Oct 12, 2026
4ff8b07
test(server): Claude reset tests are skipped on Windows hosts, where …
AdEx-Partners-DE Oct 12, 2026
fd6d9dd
fix(web): hide stash menu behind maximized panel (#18115)
Saikrishna1876 Oct 12, 2026
df78114
fix(web): sidebar toggle no longer sits under the macOS window button…
realhasanshoaib Oct 12, 2026
f79f37a
fix(server): missing agent binaries report launch failure
Moinax Oct 12, 2026
397a461
feat(android): add Pull Requests tab (#18372)
PixPMusic Oct 12, 2026
12b34e8
fix(mobile): Forgejo change requests ask for the summary they require…
flamboh Oct 12, 2026
b9ad3da
fix(server): cap automatic thread continuations and turn them on by d…
t3dotgg Oct 12, 2026
c32ade4
feat(mobile): stock tab bar, glass filter pills, and saved list filte…
juliusmarminge Oct 12, 2026
52f9046
fix(mobile): keep PR surfaces and Android tab selection visible acros…
PixPMusic Oct 12, 2026
4ab4cdf
fix(mobile): keep preview count badges inside the working pill (#18449)
RVZO6 Oct 12, 2026
2e24ec4
fix(mobile): show rounded pull request selection in the sidebar (#18480)
PixPMusic Oct 12, 2026
e688034
feat(web): model options for source control writer and review guide m…
juliusmarminge Oct 12, 2026
19bef8c
ci(mobile): cut a store build when the native fingerprint has no buil…
juliusmarminge Oct 12, 2026
37e2acd
fix(web): terminal colors no longer look washed out (#17168)
psv2522 Oct 12, 2026
d514a8c
refactor(settings): centralize schema-declared secrets and inputs (#1…
juliusmarminge Oct 12, 2026
6f6197c
fix(mobile): restore native scroll-edge effects on forms and PRs (#18…
juliusmarminge Oct 12, 2026
462e7f4
feat(mobile): native-sized pull request action bar (#18527)
juliusmarminge Oct 12, 2026
679b03e
fix(mobile): preserve theme contrast across surfaces and actions (#18…
juliusmarminge Oct 12, 2026
a39fd7b
refactor(mobile): share themed list rows and sections (#18510)
juliusmarminge Oct 12, 2026
9a2b9a2
refactor(mobile): share themed toggle rows in settings (#18511)
juliusmarminge Oct 12, 2026
abc80c8
refactor(mobile): share themed choice rows in settings (#18516)
juliusmarminge Oct 12, 2026
48595c7
fix(server): consolidate browser credential handling (#18509)
juliusmarminge Oct 12, 2026
5fe7568
feat: open T3 Code from a link with a prompt ready to send (#18454)
t3dotgg Oct 12, 2026
8f25cf9
fix(release): drop placeholder allowBuilds entry that broke nightly b…
t3dotgg Oct 12, 2026
eac6ba5
ci: fail PRs on invalid allowBuilds entries in pnpm-workspace.yaml (#…
t3dotgg Oct 12, 2026
f498b35
fix(mobile): menu dismiss taps no longer press the view underneath (#…
juliusmarminge Oct 12, 2026
d83929a
feat(web): one sidebar click updates every machine and provider (#18053)
t3dotgg Oct 12, 2026
5d59e71
fix(release): avoid PowerShell crashes on Windows ARM (#18573)
t3dotgg Oct 12, 2026
b3871d5
fix(server): Forgejo pull requests report their head commit (#18463)
flamboh Oct 12, 2026
a27cf8a
test(provider-acp): terminal kill test passes on Windows hosts (#18450)
AdEx-Partners-DE Oct 12, 2026
58d2532
fix(web): context meter no longer reads 1000k just under a million to…
luke2x Oct 12, 2026
5753207
fix(desktop): avoid Hyprland 0.48–0.50 Wayland color-manager startup …
krankos Oct 12, 2026
7b6d907
fix(mobile): iPhones on iOS 27.2 beta no longer open to a black scree…
shivamhwp Oct 12, 2026
701fc83
fix(mobile): installs skip the Enriched math download again (#18679)
juliusmarminge Oct 12, 2026
9e55228
fix(web): setup wizards follow custom themes (#18725)
SunkenInTime Oct 12, 2026
b821fa0
fix(server): resolve configured PR bases to branch names (#18754)
Yash-Singh1 Oct 12, 2026
0e7346c
fix: expose running terminals and prevent setup install stalls (#18740)
Yash-Singh1 Oct 12, 2026
511d20c
fix(mobile): hide Claude Read image placeholders when previews exist …
Yash-Singh1 Oct 12, 2026
a3c4e9e
fix(gitlab): merge request details report their head commit (#18608)
ScottN-PV Oct 12, 2026
ffb4af8
feat(server): rename built-in models from settings (#18840)
t3dotgg Oct 12, 2026
b03534f
fix(web): Git actions follow the selected thread (#18862)
Yash-Singh1 Oct 13, 2026
979589d
fix(desktop): preserve updater failure causes in diagnostics (#18864)
Yash-Singh1 Oct 13, 2026
34f8458
fix(web): attach dropped threads to pending answers (#18789)
Yash-Singh1 Oct 13, 2026
0179552
fix(web): keep button text stable during press scaling (#18866)
Yash-Singh1 Oct 13, 2026
8110edf
fix(bitbucket): preserve PR head commits for review guides (#18402)
ahilles107 Oct 13, 2026
e2e95a3
fix(server): return null for unresolved optional commands (#18871)
Yash-Singh1 Oct 13, 2026
5d6e419
fix: show computer-use action titles and align app icons (#18865)
Yash-Singh1 Oct 13, 2026
265fb70
fix(server): apply confirmed Claude subagent outcomes (#18778)
Yash-Singh1 Oct 13, 2026
41d86c1
fix(mobile): Browser page no longer logs a duplicate key warning (#18…
tris203 Oct 13, 2026
df26ef9
fix(web): a numeric q in the pull requests URL no longer crashes the …
ScottN-PV Oct 13, 2026
a143fa3
fix(client): T3 Connect clients reconnect once a new tunnel is ready …
shivamhwp Oct 13, 2026
346247b
fix(web): leaving the home page while the app loads no longer bounces…
shivamhwp Oct 13, 2026
1af1386
fix(mobile): attachment images no longer re-download on every reconne…
shivamhwp Oct 13, 2026
e24ea1d
fix(server): a migration id clash stops startup with a clear error in…
shivamhwp Oct 13, 2026
5a65169
fix(server): a thread with an event type from a newer build can still…
shivamhwp Oct 13, 2026
dc19285
fix(server): Codex titles and branch names no longer start the user's…
brycedbjork Oct 13, 2026
06620fa
fix(server): Claude thinking before a tool call stays a collapsed Tho…
maria-rcks Oct 13, 2026
ae7bed6
perf(server): cached branch PR lookups no longer start git processes …
SunkenInTime Oct 13, 2026
80664d5
fix(web): compact merge buttons show when they need a second click (#…
TonybynMp4 Oct 13, 2026
5070a83
fix(mobile): pull requests load from another environment when theirs …
juliusmarminge Oct 13, 2026
540a3e8
perf(web): collect active tool calls without array shifts (#18853)
saphid Oct 13, 2026
e9221e4
fix(web): center the pace icon on the limit card's "left" label (#18580)
akash3444 Oct 13, 2026
6abccc1
fix(web): update everything includes npm-installed servers again (#18…
ScottN-PV Oct 13, 2026
bbd98a5
fix(server): review guides find Bitbucket heads reported by short has…
ahilles107 Oct 13, 2026
574e2c0
fix(server): report a root preview browser as root, not AppArmor
macodev00 Oct 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.
45 changes: 45 additions & 0 deletions .coderabbit.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { defineConfig, type CodeRabbitContext } from "@coderabbitai/config";

// Org members and collaborators merge their own pull requests. On anyone else's, CodeRabbit
// requests changes until its comments are resolved, then approves.
const UNGATED_AUTHORS = new Set(["OWNER", "MEMBER", "COLLABORATOR"]);
const isGated = ({ pr }: CodeRabbitContext) => !UNGATED_AUTHORS.has(pr?.authorAssociation ?? "");

export default defineConfig((ctx) => ({
reviews: {
high_level_summary: false,
review_status: false,
request_changes_workflow: isGated(ctx),
allow_author_approval: !isGated(ctx),
auto_review: {
enabled: true,
},
pre_merge_checks: {
docstrings: { mode: "off" },
override_requested_reviewers_only: isGated(ctx),
},
path_filters: [
// Vendored read-only reference checkouts of upstream Effect and Alchemy
// (see scripts/lib/reference-repos.ts). Nothing imports from them.
"!.repos/**",
],
path_instructions: [
{
path: "{apps,packages,infra}/**/*.ts",
instructions: "Hold changed code to the rules in docs/internals/effect-services.md.",
},
{
path: "apps/web/src/**/*.{tsx,css}",
instructions: "Hold changed code to the rules in docs/internals/web-ui.md.",
},
],
},
knowledge_base: {
code_guidelines: {
filePatterns: [
{ files: "docs/internals/effect-services.md", applyTo: "{apps,packages,infra}/**/*.ts" },
{ files: "docs/internals/web-ui.md", applyTo: "apps/web/src/**/*.{tsx,css}" },
],
},
},
}));
9 changes: 0 additions & 9 deletions .coderabbit.yaml

This file was deleted.

2 changes: 1 addition & 1 deletion .cursor/rules/cursor-cloud.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,4 @@ Gradle auto-downloads any additional pinned SDK packages on demand.
## Known flaky tests (unrelated to setup)

- `apps/server/src/git/GitManager.test.ts` (cross-repo PR metadata, can time out at 12s).
- `apps/server/src/provider/Layers/ProviderRegistry.test.ts` (codex binaryPath re-probe ordering).
- `apps/server/src/provider/ProviderRegistry.test.ts` (codex binaryPath re-probe ordering).
1 change: 1 addition & 0 deletions .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ github:cursoragent
github:D3OXY
github:dbalders
github:eggfriedrice24
github:esthor
github:extoci
github:f-trycua
github:flamboh
Expand Down
189 changes: 189 additions & 0 deletions .github/scripts/mirror-play-apk.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
// Mirrors the newest build on a Google Play track to a rolling GitHub
// prerelease as a universal APK. Play generates and signs that APK from the
// uploaded bundle with the app signing key, so it carries the same signature
// as the Play Store install. Run by .github/workflows/mobile-android-apk.yml.
const { execFileSync } = require("node:child_process");
const crypto = require("node:crypto");
const fs = require("node:fs");
const os = require("node:os");
const path = require("node:path");
const { Readable } = require("node:stream");
const { pipeline } = require("node:stream/promises");

const PLAY_API = "https://androidpublisher.googleapis.com/androidpublisher/v3/applications";

function requireEnv(name) {
const value = process.env[name];
if (!value) throw new Error(`${name} is required.`);
return value;
}

// Service account key -> OAuth access token via a self-signed JWT grant.
async function playAccessToken(key) {
const now = Math.floor(Date.now() / 1000);
const encode = (value) => Buffer.from(JSON.stringify(value)).toString("base64url");
const unsigned = `${encode({ alg: "RS256", typ: "JWT" })}.${encode({
iss: key.client_email,
scope: "https://www.googleapis.com/auth/androidpublisher",
aud: key.token_uri,
iat: now,
exp: now + 600,
})}`;
const signature = crypto.sign("RSA-SHA256", Buffer.from(unsigned), key.private_key);
const response = await fetch(key.token_uri, {
method: "POST",
body: new URLSearchParams({
grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
assertion: `${unsigned}.${signature.toString("base64url")}`,
}),
});
if (!response.ok) {
throw new Error(`Google token exchange failed: ${response.status} ${await response.text()}`);
}
return (await response.json()).access_token;
}

async function play(token, method, url) {
const response = await fetch(url, { method, headers: { authorization: `Bearer ${token}` } });
if (!response.ok) {
throw new Error(`${method} ${url} failed: ${response.status} ${await response.text()}`);
}
return response;
}

// Highest version code the track serves, with its release name. Play names a
// release after the bundle's versionName unless the uploader sets one. This
// endpoint reads without opening an edit; an edit would invalidate any open
// EAS Submit edit made with the same service account.
async function newestTrackBuild(token, appUrl, trackName) {
const { releases = [] } = await (
await play(token, "GET", `${appUrl}/tracks/${trackName}/releases`)
).json();
let newest;
for (const release of releases) {
if (release.releaseLifecycleState !== "RELEASE_LIFECYCLE_STATE_PUBLISHED") continue;
for (const { versionCode } of release.activeArtifacts ?? []) {
if (!newest || versionCode > newest.versionCode) {
newest = { versionCode, versionName: release.releaseName || String(versionCode) };
}
}
}
return newest;
}

function gh(...args) {
return execFileSync("gh", args, { encoding: "utf8", stdio: ["ignore", "pipe", "inherit"] });
}

function readRelease(tag) {
try {
return JSON.parse(gh("release", "view", tag, "--json", "assets,body"));
} catch {
return undefined;
}
}

// Downloads the build's universal APK and uploads it, creating the release on
// first use. Returns false when Play lists no universal APK, which happens
// while it is still processing a fresh upload.
async function uploadApk({ token, appUrl, build, tag, apkName, notes, release }) {
const generated = await (
await play(token, "GET", `${appUrl}/generatedApks/${build.versionCode}`)
).json();
// One entry per app signing key. More than one means a key rotation, so
// fail rather than guess which signature testers should get.
const universal = (generated.generatedApks ?? []).filter((entry) => entry.generatedUniversalApk);
if (universal.length === 0) return false;
if (universal.length > 1) {
throw new Error(`Play returned ${universal.length} universal APKs, one per signing key.`);
}
const { downloadId } = universal[0].generatedUniversalApk;

const apkPath = path.join(fs.mkdtempSync(path.join(os.tmpdir(), "apk-")), apkName);
const download = await play(
token,
"GET",
`${appUrl}/generatedApks/${build.versionCode}/downloads/${encodeURIComponent(downloadId)}:download?alt=media`,
);
await pipeline(Readable.fromWeb(download.body), fs.createWriteStream(apkPath));

if (!release) {
// Prerelease with a non-v tag: release.yml, the desktop updater, the CLI,
// and the marketing site's latest-release lookup all ignore it.
gh(
"release",
"create",
tag,
"--prerelease",
"--latest=false",
"--title",
"T3 Code for Android (nightly)",
"--notes",
notes,
);
}
// --clobber replaces an asset a failed upload left behind.
gh("release", "upload", tag, apkPath, "--clobber");
return true;
}

async function main() {
const packageName = requireEnv("PACKAGE_NAME");
const trackName = requireEnv("PLAY_TRACK");
const tag = requireEnv("RELEASE_TAG");
const key = JSON.parse(requireEnv("GOOGLE_PLAY_SERVICE_ACCOUNT_JSON"));
const summary = (line) =>
process.env.GITHUB_STEP_SUMMARY &&
fs.appendFileSync(process.env.GITHUB_STEP_SUMMARY, `${line}\n`);

const token = await playAccessToken(key);
const appUrl = `${PLAY_API}/${packageName}`;
const build = await newestTrackBuild(token, appUrl, trackName);
if (!build) {
console.log(`The ${trackName} track has no live release.`);
return;
}

const safeName = build.versionName.replace(/[^0-9A-Za-z.]+/g, "-").replace(/^-|-$/g, "");
const apkName = `t3code-android-${safeName}-${build.versionCode}.apk`;
const notes = [
`T3 Code for Android that works with nightly servers, mirrored from the Google Play ${trackName} track. Current build: ${build.versionName} (${build.versionCode}).`,
"",
"The Play Store release can't connect to a nightly server yet. Install this APK if you can't join the Play testing group. Only the newest build is kept here.",
].join("\n");

const release = readRelease(tag);
const assets = release?.assets ?? [];
// A failed upload can leave an empty asset under the final name.
const published = assets.some(
(asset) => asset.name === apkName && asset.state === "uploaded" && asset.size > 0,
);
if (published) {
console.log(`${apkName} is already published.`);
} else if (await uploadApk({ token, appUrl, build, tag, apkName, notes, release })) {
console.log(`Published ${apkName}.`);
summary(`:white_check_mark: Published \`${apkName}\` to the \`${tag}\` release.`);
} else {
// The next run retries.
console.log(`Play lists no universal APK for ${build.versionCode}.`);
summary(
`:hourglass: Play lists no universal APK for ${build.versionName} (${build.versionCode}).`,
);
return;
}

// Reconciled on every run so an interrupted cleanup finishes on the next one.
for (const stale of assets) {
if (stale.name.endsWith(".apk") && stale.name !== apkName) {
gh("release", "delete-asset", tag, stale.name, "--yes");
}
}
if (release && release.body.replace(/\r\n/g, "\n").trim() !== notes) {
gh("release", "edit", tag, "--notes", notes);
}
}

main().catch((error) => {
console.error(error);
process.exit(1);
});
9 changes: 8 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,9 @@ jobs:
# No Electron setup here: `t3` (apps/server) has no Electron dependency
# and none of its tests touch the runtime. Only the non-server `test`
# job, which covers @t3tools/desktop, needs the download.
- name: Install Chromium for server browser integration tests
run: node apps/server/node_modules/playwright-core/cli.js install --with-deps --only-shell chromium

- name: Test
env:
T3CODE_TRANSFER_BUDGET_REPORT_PATH: ${{ runner.temp }}/t3code-transfer-budget.md
Expand Down Expand Up @@ -296,7 +299,11 @@ jobs:
transfer-report:
name: Transfer report artifact
needs: test_server
runs-on: ubuntu-24.04
# On Blacksmith like every other job here: the GitHub-hosted queue is shared
# with the PR bots and can leave this job waiting until it is abandoned,
# which fails `Check` on an otherwise green run.
runs-on: blacksmith-2vcpu-ubuntu-2404
timeout-minutes: 5
steps:
- name: Require transfer measurements
uses: actions/download-artifact@v8
Expand Down
11 changes: 6 additions & 5 deletions .github/workflows/deploy-relay.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ on:
push:
branches:
- main
# Alchemy does not redeploy the Worker when only a Config value read in its
# Init changes (alchemy-run/alchemy#1831), so a changed repository variable
# needs a forced deploy to reach production.
# Redeploys main after a variable or secret change. Alchemy redeploys the
# Worker when a value it reads changes, so force is rarely needed, and it
# replaces the Postgres runtime role (alchemy-run/alchemy#1832).
workflow_dispatch:
inputs:
force:
description: Redeploy every resource, including ones with no detected changes
description: Redeploy every resource, including ones with no detected changes. Replaces the Postgres runtime role.
type: boolean
default: true
default: false

permissions:
contents: read
Expand Down Expand Up @@ -40,6 +40,7 @@ jobs:
RELAY_API_ZONE_NAME: ${{ vars.RELAY_API_ZONE_NAME }}
RELAY_TUNNEL_ZONE_NAME: ${{ vars.RELAY_TUNNEL_ZONE_NAME }}
RELAY_TUNNEL_CLEANUP_MODE: ${{ vars.RELAY_TUNNEL_CLEANUP_MODE }}
RELAY_LEGACY_TUNNEL_CLEANUP_MODE: ${{ vars.RELAY_LEGACY_TUNNEL_CLEANUP_MODE }}
CLERK_PUBLISHABLE_KEY: ${{ vars.CLERK_PUBLISHABLE_KEY }}
CLERK_JWT_AUDIENCE: ${{ vars.CLERK_JWT_AUDIENCE }}
APNS_ENVIRONMENT: ${{ vars.APNS_ENVIRONMENT }}
Expand Down
59 changes: 59 additions & 0 deletions .github/workflows/mobile-android-apk.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Mobile Android APK

# Publishes the newest nightly-compatible Android build as a sideloadable APK
# on the rolling "android-nightly" prerelease, for nightly users who can't join
# the Play testing group. Play re-signs uploaded bundles with the app signing
# key, so its universal APK matches the Play Store install and needs no signing
# secrets here. EAS submits asynchronously (--no-wait), so this polls Play
# instead of chaining off mobile-eas-production.yml; runs with nothing new exit
# early.
on:
schedule:
# Avoid minute zero, when GitHub scheduled jobs are busiest.
- cron: "23 * * * *"
workflow_dispatch:

concurrency:
group: mobile-android-apk
cancel-in-progress: false

jobs:
mirror:
name: Mirror Play APK
runs-on: blacksmith-2vcpu-ubuntu-2404
timeout-minutes: 10
permissions:
contents: write
env:
PACKAGE_NAME: com.t3tools.t3code
# eas.json submits v2-preview builds to this closed testing track; they
# speak the orchestration protocol nightly servers use, which the Play
# Store release can't.
PLAY_TRACK: v2
RELEASE_TAG: android-nightly
steps:
- id: credentials
name: Check for Play credentials
env:
GOOGLE_PLAY_SERVICE_ACCOUNT_JSON: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
run: |
if [ -n "$GOOGLE_PLAY_SERVICE_ACCOUNT_JSON" ]; then
echo "present=true" >> "$GITHUB_OUTPUT"
else
echo "present=false" >> "$GITHUB_OUTPUT"
echo "GOOGLE_PLAY_SERVICE_ACCOUNT_JSON is not available; skipping APK mirror."
fi
- name: Checkout
if: steps.credentials.outputs.present == 'true'
uses: actions/checkout@v6
with:
sparse-checkout: .github/scripts

- name: Mirror the newest APK
if: steps.credentials.outputs.present == 'true'
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
GOOGLE_PLAY_SERVICE_ACCOUNT_JSON: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
run: node .github/scripts/mirror-play-apk.cjs
2 changes: 2 additions & 0 deletions .github/workflows/mobile-eas-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ jobs:
uses: expo/expo-github-action/continuous-deploy-fingerprint@main
env:
EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
# The Expo action otherwise suppresses the EAS command's failure output.
RUNNER_DEBUG: "1"
with:
profile: preview:dev
branch: pr-${{ github.event.pull_request.number }}
Expand Down
Loading
Loading