Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
199 commits
Select commit Hold shift + click to select a range
94d13a2
Preserve live stream subscriptions across explicit reconnects (#1972)
juliusmarminge Apr 13, 2026
96c9306
Migrate chat scrolling and branch lists to LegendList (#1953)
juliusmarminge Apr 13, 2026
dff8784
window controls overlay (windows&linux) (#1969)
tarik02 Apr 13, 2026
850c912
fix(desktop): increase backend readiness timeout from 10s to 30s (#1979)
rowalth Apr 13, 2026
57d7746
fix(web): replace turn strip overlay gradients with mask-image fade (…
GuilhermeVieiraDev Apr 13, 2026
f7fa62a
Add shell snapshot queries for orchestration state (#1973)
juliusmarminge Apr 13, 2026
1bf048e
fix: avoid copy button overlapping long code blocks (#1985)
barrymichaeldoyle Apr 13, 2026
f2205bd
Pad composer model picker to prevent ring clipping (#1992)
juliusmarminge Apr 13, 2026
801b83e
Allow empty server threads to bootstrap new worktrees (#1936)
juliusmarminge Apr 13, 2026
77fcad3
Prevent live thread branches from regressing to temp worktree names (…
juliusmarminge Apr 13, 2026
047a0a6
fix: add pointer cursor to the permissions mode select trigger (#1997)
UtkarshUsername Apr 13, 2026
9b29be9
docs: Document environment prep before local development (#1975)
ashvinnihalani Apr 13, 2026
5f7becf
feat: Add Kiro editor support to open picker (#1974)
ashvinnihalani Apr 13, 2026
cadd708
feat: show full thread title in a tooltip when hovering sidebar threa…
UtkarshUsername Apr 13, 2026
f5ecca4
Clear tracked RPCs on reconnect (#2000)
juliusmarminge Apr 13, 2026
6f69934
Use latest user message time for thread timestamps (#1996)
juliusmarminge Apr 13, 2026
d18e43b
fix: lost provider session recovery (#1938)
ashvinnihalani Apr 13, 2026
33dadb5
Fix thread timeline autoscroll and simplify branch state (#2002)
juliusmarminge Apr 13, 2026
569fea8
Warm sidebar thread detail subscriptions (#2001)
juliusmarminge Apr 13, 2026
5f7ec73
Fix new-thread draft reuse for worktree defaults (#2003)
juliusmarminge Apr 13, 2026
9dcea68
Refresh git status after branch rename and worktree setup (#2005)
juliusmarminge Apr 13, 2026
008ac5c
Cache provider status and gate desktop startup (#1962)
juliusmarminge Apr 13, 2026
2e42f3f
Improve shell PATH hydration and fallback detection (#1799)
juliusmarminge Apr 13, 2026
c9b07d6
Backfill projected shell summaries and stale approval cleanup (#2004)
juliusmarminge Apr 14, 2026
0d28026
fix(claude): emit plan events for TodoWrite during input streaming (#…
TimCrooker Apr 14, 2026
409ff90
Nightly release channel (#2012)
juliusmarminge Apr 15, 2026
9ff31f8
Fix nightly desktop product name (#2025)
juliusmarminge Apr 15, 2026
44afe78
Add filesystem browse API and command palette project picker (#2024)
Noojuno Apr 15, 2026
7968f27
Fix terminal Cmd+Backspace on macOS (#2027)
SAKETH11111 Apr 15, 2026
28cb9db
feat(web): add tooltip to composer file mention pill (#1944)
GuilhermeVieiraDev Apr 15, 2026
68061af
Improve markdown file link UX (#1956)
justsomelegs Apr 15, 2026
5e1dd56
feat: add Launch Args setting for Claude provider (#1971)
akarabach Apr 15, 2026
f9580ff
Default nightly desktop builds to the nightly update channel (#2049)
juliusmarminge Apr 16, 2026
5e13f53
fix: remove trailing newline from CLAUDE.md symlink (#2052)
marcusgrando Apr 16, 2026
d22c6f5
fix: prevent user-input activities from leaking into pending approval…
marcusgrando Apr 16, 2026
3e07f5a
feat: add Claude Opus 4.7 to built-in models (#2072)
Marve10s Apr 16, 2026
19d4740
fix(web): prevent composer controls overlap on narrow windows (make p…
UtkarshUsername Apr 16, 2026
7a08fcf
fix(server): drop stale text generation options when resetting text-g…
UtkarshUsername Apr 16, 2026
188a40c
feat: configurable project grouping (#2055)
tlh38 Apr 16, 2026
e0117b2
Fix Claude Process leak[MEMORY INTENSIVE], archiving, and stale claud…
crafael23 Apr 16, 2026
d90e15d
fix(server): extend negative repository identity cache ttl (#2083)
m-mohamed Apr 16, 2026
6891c77
Build for Windows ARM (#2080)
Badbird5907 Apr 17, 2026
b7df3df
[codex] Fix Windows release manifest publishing (#2095)
juliusmarminge Apr 17, 2026
5490438
fix: guard against missing sidebarProjectGroupingOverrides in client …
juliusmarminge Apr 17, 2026
b2cca67
ci(release): install deps before finalize version bump (#2100)
juliusmarminge Apr 17, 2026
2d87574
chore(release): prepare v0.0.20
t3-code[bot] Apr 17, 2026
505db9f
try out blacksmith for releases (#2101)
juliusmarminge Apr 17, 2026
b991b9b
Revert to Github Runner for Windows (#2103)
juliusmarminge Apr 17, 2026
ed6b7fb
fix(server): honor gitignored files in workspace search (#2078)
nmharmon8 Apr 17, 2026
8dba2d6
Adopt Node-native TypeScript for desktop and server (#2098)
juliusmarminge Apr 17, 2026
54179c8
Update workflow to use ubuntu-24.04 runner (#2110)
juliusmarminge Apr 17, 2026
d8d3296
Show thread status in command palette (#2107)
Noojuno Apr 17, 2026
a7a44d0
Fix Windows PATH hydration and repair (#1729)
Badbird5907 Apr 17, 2026
f297e30
Clean up invalid pending approval projections (#2106)
juliusmarminge Apr 17, 2026
df9d340
Modernize release workflow runners (#2129)
juliusmarminge Apr 17, 2026
4000973
Extract backend startup readiness coordination (#2133)
juliusmarminge Apr 17, 2026
721b6b4
Preserve provider bindings when stopping sessions (#2125)
HaukeSchnau Apr 17, 2026
52a6067
Throttle nightly release workflow to every 3 hours (#2134)
juliusmarminge Apr 17, 2026
39ca3ee
fix(web): bypass xterm for global terminal shortcuts (#1580)
AriajSarkar Apr 17, 2026
ce94fee
feat: add opencode provider support (#1758)
nexxeln Apr 17, 2026
60387f6
fix: show restore defaults only on General settings (#1710)
UtkarshUsername Apr 17, 2026
4e0c003
fix(web): allow deleting non-empty projects from the warning toast (#…
maria-rcks Apr 17, 2026
a3b1df5
Add Claude Opus 4.5 to built-in Claude models (#2143)
juliusmarminge Apr 17, 2026
0f184c2
fix(web): use capture-phase keydown listener so CTRL+J toggles termin…
mvanhorn Apr 17, 2026
9c64f12
Add ACP support with Cursor provider (#1355)
juliusmarminge Apr 17, 2026
29cb917
Guard release workflow jobs from upstream failures (#2146)
juliusmarminge Apr 17, 2026
8ac57f7
Guard release workflow jobs on upstream success (#2147)
juliusmarminge Apr 17, 2026
9df3c64
Use GitHub App token for release uploads (#2149)
juliusmarminge Apr 17, 2026
c83bc5d
fix(release): use v<semver> tag format for nightly releases (#2186)
EfeDurmaz16 Apr 19, 2026
20f346d
Expand leading ~ in Codex home paths before exporting CODEX_HOME (#2210)
altjx Apr 20, 2026
57b59b5
Devcontainer / IDE updates (#2208)
Spitfire1900 Apr 20, 2026
37965da
fix(server): handle OpenCode text response format in commit message g…
imabdulazeez Apr 20, 2026
8dbcf92
fix(server): prevent probeClaudeCapabilities from wasting API request…
reasv Apr 20, 2026
66c326b
Redesign model picker with favorites and search (#2153)
Chrono-byte Apr 20, 2026
3b98fe3
`effect-codex-app-server` (#1942)
juliusmarminge Apr 20, 2026
306ec4b
Refactor OpenCode lifecycle and structured output handling (#2218)
juliusmarminge Apr 20, 2026
6d1505c
fix: Change right panel sheet to be below title bar / action bar (#2224)
CodeZeno Apr 20, 2026
de05b0c
fix(web): restore manual sort drag and keep per-group expand state (#…
mwolson Apr 20, 2026
f6978db
chore(turbo): pass through PATHEXT (#2184)
adammansfield Apr 20, 2026
40b3a80
fix(server): trim OpenCode provider model names (#2252)
adinschmidt Apr 21, 2026
055897f
fix: enforce opencode >= 1.14.19 and reveal window on Wayland (#2262)
mwolson Apr 21, 2026
3a1daa8
Add close buttons to toasts (#2023)
noxire-dev Apr 21, 2026
b7c89cf
Refresh Codex protocol bindings to `be75785504ff152fa6333e380a2d50642…
juliusmarminge Apr 21, 2026
b8305af
fix: increase Claude auth probe timeout to 10s (#2272)
Heinz-G Apr 22, 2026
e25db3a
Fix provider cache atomic write temp path collisions (#2291)
juliusmarminge Apr 23, 2026
aa2d385
fix(server): restore CODEX_HOME tilde expansion for Codex launches (#…
HaukeSchnau Apr 23, 2026
fd3b96b
Add IntelliJ project icon to the list of possible favicon paths (#1651)
basmilius Apr 23, 2026
b0b7b38
fix(server): detect localized Windows command errors (#2152)
raulpesilva Apr 23, 2026
8d1d699
Refactor provider model selections to option arrays (#2246)
juliusmarminge Apr 23, 2026
d5b7690
Exclude subscribe RPCs from latency tracking (#2313)
juliusmarminge Apr 23, 2026
0ee302e
fix(request-permission): add `dynamic_tool_call` to command request (…
th1m0 Apr 23, 2026
0d55a42
fix(web): ignore stale runtime projection snapshots (#2301)
Pedro-Revez-Silva Apr 23, 2026
188df6d
Fix Claude session cwd resume drift (#2292)
juliusmarminge Apr 23, 2026
00b5c3e
Add task sidebar auto-open setting (#2314)
justsomelegs Apr 23, 2026
ada410b
chore(release): prepare v0.0.21
t3-code[bot] Apr 23, 2026
5cf83ff
fix(release): use configured node for smoke manifest merge (#2364)
juliusmarminge Apr 27, 2026
dbebc38
Ignore stale WebSocket lifecycle events after reconnect (#2372)
juliusmarminge Apr 27, 2026
3582288
Stop OpenCode refresh from leaking serve processes
joshmeads Apr 27, 2026
08e6d4c
feat: Multi-Provider support (#2277)
juliusmarminge Apr 29, 2026
7da6522
fix: updated UI "add project" icon to match the command pallete icon …
zurielbm Apr 29, 2026
fe2fde5
Add OpenCode to README (#2154)
pompydev Apr 29, 2026
22b7d8c
[codex] Fix visited timestamp under clock skew (#2408)
juliusmarminge Apr 30, 2026
02903f2
[codex] fix terminal dimension validation (#2411)
juliusmarminge Apr 30, 2026
44b39fe
fix(server): key AskUserQuestion answers by question text (#2404)
basmilius Apr 30, 2026
9acf46a
fix(web): prevent iOS Safari auto-zoom on input focus (#1652)
bergholmm Apr 30, 2026
69d9a65
fix(git): hide stale merged/closed PRs on the default branch (#1966)
GuilhermeVieiraDev Apr 30, 2026
86c94b4
fix(web): allow closing diff panel in non-git projects (#2413)
pedrokpp Apr 30, 2026
a4298f1
fix(web): hide mobile sidebar after thread selection or creation (#1293)
murataslan1 Apr 30, 2026
9e2f712
fix(web): make new thread button always visible on mobile (#2419)
jappyjan Apr 30, 2026
532a1d8
fix(web): make thread archive button always visible on mobile (#2423)
jappyjan Apr 30, 2026
e25ce07
Add new GitHub users to VOUCHED.td (#2425)
juliusmarminge Apr 30, 2026
f54f438
Narrow the right sidebar and update task panel and diff panel (#2409)
shivamhwp Apr 30, 2026
d649ccf
fix(web): respect iOS safe areas across mobile chrome & other mobile …
jappyjan Apr 30, 2026
c07ac59
fix: bump `electron` version to v40.9.3 and add it to our trusted dep…
nmggithub May 1, 2026
4ef361d
fix(mobile): enable touch scrolling in file picker modal (#2420)
jappyjan May 1, 2026
1eb6fce
fix: opencode is not on PATH on Windows (#2183)
adammansfield May 1, 2026
a480f07
Add Discord release announcements (#2429)
juliusmarminge May 1, 2026
e5c7ac5
Optimize release workflow job execution (#2430)
juliusmarminge May 1, 2026
17b4396
Add structured Discord webhook logging for release notifications (#2431)
juliusmarminge May 1, 2026
7a3f21e
[codex] fix Discord release version flag (#2449)
juliusmarminge May 1, 2026
4ceabac
Fix dialog footer button clipping in Git actions dialog (#2458)
juliusmarminge May 2, 2026
8f50ca8
fix(web): show friendly error for invalid pairing token (#2222)
Saikrishna1876 May 2, 2026
cb8015a
fix(claude-agent): opt into claude_code system prompt preset (#2472)
D3OXY May 2, 2026
460d9c3
Refactor provider settings to declarative metadata (#2452)
juliusmarminge May 2, 2026
6d7fe2e
Introduce pluggable VCS driver foundation (#2435)
juliusmarminge May 2, 2026
350d76e
[codex] Align GitHub source control adapter errors (#2476)
juliusmarminge May 2, 2026
0ce7e56
feat(scm): Gitlab (#2462)
juliusmarminge May 3, 2026
f7748a0
feat: add "hide whitespace changes" option for diffs (#2389)
ipanasenko May 3, 2026
d796926
Add remote repository publish and discovery support (#2482)
juliusmarminge May 4, 2026
92e340d
feat(web): collapse mobile composer by default (#1263)
chirino May 4, 2026
3772fa1
feat: Hosted Frontend, Tailscale Integration & SSH Lancher (#2361)
juliusmarminge May 4, 2026
d501ebe
fix version test (#2490)
juliusmarminge May 4, 2026
91a03e0
feat(source-control): add Bitbucket & Azure Devops providers (#2473)
juliusmarminge May 4, 2026
623e471
Fix markdown highlight render stability (#2479)
cursor[bot] May 4, 2026
8269659
bitubicket base brnach (#2500)
juliusmarminge May 4, 2026
cb3211c
README: Add OpenCode to first mention of supported agents (#2436)
notrudyyy May 4, 2026
0576820
Prevent focus-ring clipping in AnimatedHeight (#2503)
juliusmarminge May 4, 2026
aca0fa4
reduce startup time by ~47% and memory usage by up to 150-300MB (#2204)
justsomelegs May 4, 2026
02dd47e
Fix repeated effect-language-service prepare hooks during bun install…
peterjarian May 4, 2026
f4c9418
Add collapsible file diffs + @pierre/diffs version update. (#2502)
shivamhwp May 5, 2026
35721d9
chore(release): prepare v0.0.22
t3-code[bot] May 5, 2026
9b604bc
provider update advisories (#2312)
justsomelegs May 5, 2026
0e38870
Add keybindings settings editor (#2533)
juliusmarminge May 6, 2026
536dcad
Reduce timeline row rerenders (#2498)
cursor[bot] May 6, 2026
25c9d26
Stabilize git workspace and terminal tests (#2540)
juliusmarminge May 6, 2026
1498335
Optimize MessagesTimeline work row stability (#2527)
cursor[bot] May 6, 2026
166bce0
Feature/intellij editors (#2475)
Minigamer42 May 6, 2026
a2ff50d
Add process and trace diagnostics views (#2532)
juliusmarminge May 6, 2026
499f146
Split server CLI into focused submodules (#2545)
juliusmarminge May 6, 2026
22384ae
Adopt Effect JSON and DateTime idioms (#2559)
cursor[bot] May 6, 2026
449e1aa
Make changed-files header sticky in chat timeline (#2565)
juliusmarminge May 6, 2026
6c79039
Cache desktop build assets in CI and release workflows (#2543)
juliusmarminge May 6, 2026
a74ed8e
Revert "Cache desktop build assets in CI and release workflows" (#2568)
juliusmarminge May 6, 2026
c27109c
feat(web): mention skills in composer placeholder (#2570)
maria-rcks May 7, 2026
2ba5807
Avoid timeline timer rerender commits (#2580)
cursor[bot] May 7, 2026
1bcfc88
Adopt idiomatic Effect APIs in generator and decider (#2581)
cursor[bot] May 7, 2026
11f4055
feat(web): render skill calls as inline chips (#2572)
maria-rcks May 7, 2026
466d8ee
feat(web): add configurable sidebar thread preview count (#1856)
Marve10s May 8, 2026
31b52ac
[codex] Fix sidebar preview settings reset (#2587)
juliusmarminge May 8, 2026
dd32f52
Refresh Codex protocol bindings and adapter mappings (#2590)
juliusmarminge May 8, 2026
aa219be
port desktop app to Effect (#2546)
juliusmarminge May 8, 2026
9d919d0
Move desktop server exposure logic into backend (#2591)
juliusmarminge May 8, 2026
7455472
Reduce sidebar selection rerenders (#2560)
cursor[bot] May 8, 2026
131234b
Match sticky changed-files header tint to card background (#2592)
juliusmarminge May 8, 2026
25b02f4
Enable stricter Effect LSP rules (#2596)
juliusmarminge May 8, 2026
825263b
Scaffold oxlint plugin with initial rule (#2603)
juliusmarminge May 8, 2026
073eb38
[codex] Fix Windows release signing setup (#2606)
juliusmarminge May 8, 2026
aa8b9f2
Deploy hosted web app from release workflow (#2507)
juliusmarminge May 8, 2026
271d65e
Fix OpenCode raw text delta assembly (#2526)
Kiri110K May 8, 2026
7bfacd5
[codex] Handle NuGet provider bootstrap failures (#2608)
juliusmarminge May 8, 2026
63859aa
perf: Add archived shell snapshot support (#2593)
juliusmarminge May 8, 2026
932df4e
fix(ssh): fix reconnect issues and node binary path resolution (#2504)
juliusmarminge May 8, 2026
34ec8a8
[codex] add configurable automatic git fetch interval (#2605)
juliusmarminge May 8, 2026
e0f3abd
Fix remote pairing CORS responses (#2594)
ben-vargas May 8, 2026
6b9feb1
Update deployment command in release workflow (#2610)
juliusmarminge May 9, 2026
99efaa0
Collapse long user messages by default (#2180)
notkainoa May 9, 2026
39371c6
[codex] Fix Vercel release web deploy scope (#2611)
juliusmarminge May 9, 2026
6efdf67
[codex] Fix Vercel Turbo env forwarding (#2612)
juliusmarminge May 9, 2026
3c32bc8
[codex] Fix hosted channel bootstrap (#2613)
juliusmarminge May 9, 2026
b793401
chore(release): prepare v0.0.23
t3-code[bot] May 9, 2026
6ab8f93
fix(codex): use longer and shared auth probe timeout for provider sta…
UtkarshUsername May 11, 2026
e64c19f
Alias stable releases to the router domain (#2636)
juliusmarminge May 11, 2026
16c69ba
Remove outline styling from git success toast action (#2639)
juliusmarminge May 11, 2026
8fc3179
Preserve Codex probe results across scoped teardown (#2638)
juliusmarminge May 11, 2026
5165b8c
Optimize VCS diff loading to be up to 98% faster (#2586)
justsomelegs May 11, 2026
447236d
Stabilize project grouping settings selector (#2629)
cursor[bot] May 11, 2026
d15909a
Use Effect child process for editor launches (#2659)
cursor[bot] May 12, 2026
a41f489
Reduce chat timeline activity rerenders (#2660)
cursor[bot] May 12, 2026
b83e9c9
Refactor composer refs and context providers (#2664)
juliusmarminge May 12, 2026
7e20b23
Constrain provider update popover overflow (#2669)
juliusmarminge May 13, 2026
556c424
Harden GitHub workflow permissions
juliusmarminge May 13, 2026
f92e1e1
Simplify workspace package builds and deps (#2676)
juliusmarminge May 13, 2026
90eea04
Skip healthy env reconnects after browser resume (#2677)
juliusmarminge May 13, 2026
34bb18c
feat(marketing): Made marketing site less cringe (#2681)
t3dotgg May 14, 2026
4120e94
Back off VCS remote refresh failures (#2686)
juliusmarminge May 14, 2026
9e632f5
[codex] add diagnostics resource history (#2685)
juliusmarminge May 14, 2026
ea20e80
Exclude workspace packages from desktop runtime deps (#2688)
juliusmarminge May 14, 2026
d1e85c4
chore(release): prepare v0.0.24
t3-code[bot] May 15, 2026
8dc80e8
feat(server): drive native claude CLI directly instead of the Agent SDK
akarabach May 16, 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
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .cursor/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
plans/
15 changes: 11 additions & 4 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,22 @@
"name": "T3 Code Dev",
"image": "debian:bookworm",
"features": {
"ghcr.io/devcontainers-extra/features/bun:1": {},
"ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers-extra/features/bun:1": {
"version": "1.3.11"
},
"ghcr.io/devcontainers/features/node:1": {
"version": "24",
"nodeGypDependencies": true
"version": "24.13.1"
},
"ghcr.io/devcontainers/features/python:1": {
"version": "3.12"
"version": "3.10",
"installTools": false
}
},
"overrideFeatureInstallOrder": [
"ghcr.io/devcontainers/features/git",
"ghcr.io/devcontainers-extra/features/bun"
],
"postCreateCommand": {
"bun-install": "bun install --backend=copyfile --frozen-lockfile"
},
Expand Down
80 changes: 80 additions & 0 deletions .docs/remote-architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ Examples:

A known environment may or may not know the target `environmentId` before first successful connect.

In the hosted web app, known environments are browser-local. A hosted pairing URL can create the saved entry, but it does not give the hosted app a server-side control plane or a copy of the session state.

### AccessEndpoint

An `AccessEndpoint` is one concrete way to reach a known environment.
Expand All @@ -108,6 +110,67 @@ A single environment may have many endpoints:

The environment stays the same. Only the access path changes.

### AdvertisedEndpoint

An `AdvertisedEndpoint` is a server or desktop-authored candidate endpoint for an environment. It is how the backend tells the client which URLs may be useful for pairing and reconnecting.

`AdvertisedEndpoint` is deliberately narrower than the full access model:

- it describes a concrete HTTP and WebSocket base URL pair
- it can mark the endpoint as default, available, or unavailable
- it includes reachability hints such as loopback, LAN, private, public, or tunnel
- it includes compatibility hints such as whether the endpoint can be used from the hosted HTTPS app

Clients should treat advertised endpoints as hints, not as proof that a route works from the current device. The final connection attempt still decides whether the endpoint is reachable.

The UI presents one default advertised endpoint in the network-access summary and keeps the rest behind an expandable advanced list. The default controls pairing QR codes and primary copy actions. Users can override it, but that override is a UI preference, not backend configuration.

Persist the override by stable endpoint kind rather than raw URL whenever possible. For example, a LAN endpoint should be stored as the desktop LAN endpoint preference, not as `192.168.x.y`, because the address can change when the user switches networks. Provider endpoints should use provider-specific stable keys such as Tailscale IP or Tailscale MagicDNS HTTPS. Custom endpoints may fall back to their concrete identity.

When no user default is saved, endpoint selection should prefer:

1. endpoints compatible with the hosted HTTPS app
2. explicitly default endpoints
3. non-loopback endpoints
4. loopback endpoints only for same-machine clients

This keeps endpoint discovery centralized without making any one provider, such as Tailscale or a future tunnel service, part of the core environment model.

### Endpoint providers

Endpoint providers are add-ons that contribute advertised endpoints for the current environment.

The provider boundary is intentionally outside the core environment model:

- core owns `ExecutionEnvironment`, saved environments, pairing, and connection lifecycle
- providers discover or synthesize endpoints
- providers return normalized `AdvertisedEndpoint` records
- the UI and pairing logic select from those records without knowing provider-specific commands

The first provider is Tailscale. It can discover Tailnet IP and MagicDNS addresses from the local machine and publish them as additional endpoint candidates. Future providers, such as a hosted tunnel service, should plug into the same shape rather than adding a separate remote environment path.

Provider-specific confidence should remain a hint. A Tailscale endpoint still needs a successful browser or desktop connection before the client treats it as connected.

### Hosted pairing request

A hosted pairing request is a bootstrap URL for the static web app, not a transport.

Example:

```text
https://app.t3.codes/pair?host=https://backend.example.com:3773#token=PAIRCODE
```

The hosted app reads the `host` parameter and pairing token, exchanges the token directly with that backend, then saves the resulting environment record in browser local storage.

Important constraints:

- the hosted app does not proxy HTTP or WebSocket traffic
- the backend must still be reachable directly from the browser
- HTTPS pages can only connect to HTTPS/WSS backends
- HTTP LAN endpoints should keep using direct desktop or CLI pairing URLs
- the token belongs in the URL hash so it is not sent to the hosted app origin

### RepositoryIdentity

`RepositoryIdentity` remains a best-effort logical repo grouping mechanism across environments.
Expand Down Expand Up @@ -151,6 +214,8 @@ Benefits:
- no client-specific process management required
- best fit for hosted or self-managed remote T3 deployments

Browser security rules are part of this access method. A hosted HTTPS web client can connect to `wss://` backends, but it cannot connect to plain `ws://` or `http://` LAN backends because that would be mixed content.

### 2. Tunneled WebSocket access

Examples:
Expand All @@ -170,6 +235,8 @@ This is especially useful when:
- mobile must reach a desktop-hosted environment
- a machine should be reachable without exposing raw LAN or public ports

Tailscale-backed access sits here architecturally even though the current implementation is endpoint discovery rather than a T3-managed tunnel. It contributes private-network endpoints and lets the existing HTTP/WebSocket client path do the actual connection.

### 3. Desktop-managed SSH access

SSH is an access and launch helper, not a separate environment type.
Expand All @@ -185,6 +252,8 @@ After that, the renderer should still connect using an ordinary WebSocket URL ag

This keeps the renderer transport model consistent with every other access method.

The desktop main process owns the SSH bridge because it can spawn local SSH processes, manage askpass prompts, write temporary launch scripts, and clean up forwards. The renderer receives a saved environment record and connects through the forwarded URL; it should not need SSH-specific RPC paths for normal environment traffic.

## Launch methods

Launch methods answer a different question:
Expand Down Expand Up @@ -227,6 +296,15 @@ The recommended T3 flow is:
4. Desktop establishes local port forwarding.
5. Renderer connects to the forwarded WebSocket endpoint as a normal environment.

The saved environment should remember that it was created by desktop SSH launch only for reconnect and lifecycle UX. That metadata should not change the server protocol or the environment identity model.

Failure handling should be explicit:

- SSH authentication failure should surface before any environment is saved
- remote launch failure should include remote logs or the launcher command output when available
- forwarded-port failure should leave the saved environment disconnected rather than falling back to an unrelated endpoint
- reconnect should attempt to restore the SSH bridge before reconnecting the normal WebSocket client

### 3. Client-managed local publish

This is the inverse of remote launch: a local T3 server is already running, and the client publishes it through a tunnel.
Expand Down Expand Up @@ -267,6 +345,8 @@ T3 already supports a WebSocket auth token on the server. That should become a f

For publicly reachable environments, authenticated access should be treated as required.

Hosted pairing should be treated as a client-side convenience only. The hosted app must not receive pairing tokens through query parameters, must not store pairing state server-side, and must not imply that an HTTP backend is safe or reachable from an HTTPS browser context.

## Relationship to Zed

Zed is a useful reference implementation for managed remote launch and reconnect behavior.
Expand Down
3 changes: 3 additions & 0 deletions .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,6 @@ github:Yash-Singh1
github:eggfriedrice24
github:Ymit24
github:shivamhwp
github:jappyjan
github:justsomelegs
github:UtkarshUsername
11 changes: 7 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:
jobs:
quality:
name: Format, Lint, Typecheck, Test, Browser Test, Build
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: blacksmith-8vcpu-ubuntu-2404
timeout-minutes: 10
steps:
- name: Checkout
Expand Down Expand Up @@ -71,12 +71,12 @@ jobs:

- name: Verify preload bundle output
run: |
test -f apps/desktop/dist-electron/preload.js
grep -nE "desktopBridge|getLocalEnvironmentBootstrap|PICK_FOLDER_CHANNEL|wsUrl" apps/desktop/dist-electron/preload.js
test -f apps/desktop/dist-electron/preload.cjs
grep -nE "desktopBridge|getLocalEnvironmentBootstrap|PICK_FOLDER_CHANNEL|wsUrl" apps/desktop/dist-electron/preload.cjs

release_smoke:
name: Release Smoke
runs-on: ubuntu-24.04
runs-on: blacksmith-8vcpu-ubuntu-2404
timeout-minutes: 10
steps:
- name: Checkout
Expand All @@ -92,5 +92,8 @@ jobs:
with:
node-version-file: package.json

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Exercise release-only workflow steps
run: node scripts/release-smoke.ts
3 changes: 3 additions & 0 deletions .github/workflows/pr-size.yml
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ jobs:
group: pr-size-${{ github.event.pull_request.number }}
cancel-in-progress: true
steps:
# This pull_request_target job may fetch untrusted PR commits only as passive
# git data. Do not add dependency installs, build/test scripts, or cache
# actions here; use pull_request plus workflow_run for that pattern instead.
- name: Checkout base repository
uses: actions/checkout@v4
with:
Expand Down
Loading
Loading