Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
288 commits
Select commit Hold shift + click to select a range
557d686
feat(ios): show harness icons on home
t3dotgg Aug 1, 2026
e685770
feat(ios): simplify mobile prompt controls
t3dotgg Aug 1, 2026
b51bf4a
fix(ios): keep threads anchored above keyboard
t3dotgg Aug 1, 2026
a8a84ce
fix(ios): dismiss the keyboard immediately
t3dotgg Aug 1, 2026
4899468
feat(ios): persist thread drafts
t3dotgg Aug 1, 2026
8fc7474
feat(ios): add new task workspace controls
t3dotgg Aug 1, 2026
08e935b
feat(ios): add project browse and clone flows
t3dotgg Aug 1, 2026
53d0bfd
feat(ios): complete native task composition
t3dotgg Aug 1, 2026
5ec0863
fix(ios): preserve composer state during loading
t3dotgg Aug 1, 2026
9495003
fix(ios): harden native task creation
t3dotgg Aug 1, 2026
bf64ea7
fix(swift-ios): honor environment task preferences
t3dotgg Aug 1, 2026
cd21afb
fix(swift-ios): stabilize model and composer controls
t3dotgg Aug 1, 2026
20a8fd6
feat(swift-ios): simplify the mobile composer
t3dotgg Aug 1, 2026
e91e7d7
feat(swift-ios): add rich workspace previews
t3dotgg Aug 1, 2026
cc193fe
fix(swift-ios): make mobile delivery resilient
t3dotgg Aug 1, 2026
4d3c638
feat(swift-ios): add native platform integrations
t3dotgg Aug 1, 2026
f1e51c7
feat(swift-ios): add secure T3 Connect foundations
t3dotgg Aug 1, 2026
2f5bd57
chore(swift-ios): harden native release workflow
t3dotgg Aug 1, 2026
9225e52
docs(swift-ios): keep native CI guidance accurate
t3dotgg Aug 1, 2026
8bdb276
feat(swift-ios): finish secure T3 Connect runtime
t3dotgg Aug 1, 2026
8e53502
fix(swift-ios): preserve dependent queued messages
t3dotgg Aug 1, 2026
eec501d
feat(swift-ios): add native task extensions
t3dotgg Aug 1, 2026
8c82403
docs(swift-ios): format native build guide
t3dotgg Aug 1, 2026
d62d437
fix(swift-ios): harden transport and persistence
t3dotgg Aug 1, 2026
cc85ec5
fix(swift-ios): make composer state durable
t3dotgg Aug 1, 2026
6de8733
fix(swift-ios): harden platform integrations
t3dotgg Aug 1, 2026
397a2a3
fix(swift-ios): close connection lifecycle races
t3dotgg Aug 1, 2026
b6fff56
fix(swift-ios): clear stale platform state
t3dotgg Aug 1, 2026
6f7db91
fix(swift-ios): tolerate locked install targets
t3dotgg Aug 1, 2026
213879e
fix(swift-ios): preserve durable outbox state
t3dotgg Aug 1, 2026
2800300
fix(swift-ios): keep aggregate refresh alive
t3dotgg Aug 1, 2026
ccd86f8
fix(swift-ios): open the photo library picker
t3dotgg Aug 4, 2026
28e0acd
feat(swift-ios): render markdown tables
t3dotgg Aug 4, 2026
6e294cb
fix(swift-ios): keep markdown tables scrollable
t3dotgg Aug 4, 2026
a3cd5ad
fix(swift-ios): size markdown table rows to content
t3dotgg Aug 4, 2026
005c4aa
fix(swift-ios): show active work and image previews
t3dotgg Aug 4, 2026
5c370dd
fix(swift-ios): settle threads from swipe actions
t3dotgg Aug 4, 2026
3933649
feat(swift-ios): add server-backed thread pinning
t3dotgg Aug 5, 2026
43c4377
fix(swift-ios): tolerate evolving provider catalogs
t3dotgg Aug 5, 2026
7d930d4
feat(swift-ios): hydrate full review diffs
t3dotgg Aug 5, 2026
dc94077
fix(swift-ios): preserve pin and legacy picker state
t3dotgg Aug 5, 2026
eff5018
feat(swift-ios): wrap plaintext code blocks
t3dotgg Aug 5, 2026
05586ba
fix(swift-ios): keep thread pin controls available
t3dotgg Aug 5, 2026
9c4c69a
fix(swift-ios): stabilize new task environment defaults
t3dotgg Aug 5, 2026
0241185
fix(swift-ios): isolate development installs
t3dotgg Aug 6, 2026
50db536
fix(swift-ios): restore TestFlight sign-in
t3dotgg Aug 6, 2026
edb31e7
fix(swift-ios): preserve SwiftUI home label
t3dotgg Aug 6, 2026
ccbd210
perf(swift-ios): cut hot-path waste in networking, state, and caches
t3dotgg Aug 6, 2026
6732b0e
perf(swift-ios): lighten streaming UI and close lifecycle gaps
t3dotgg Aug 6, 2026
e15bcd0
fix(swift-ios): address review findings on streaming and caps
t3dotgg Aug 6, 2026
ced61c8
fix(swift-ios): guard streaming renderer against stale drain unwinds
t3dotgg Aug 6, 2026
7838234
fix(swift-ios): reject recycled-cell documents in streaming fallback
t3dotgg Aug 6, 2026
8030585
fix(swift-ios): release idle websocket clients
t3dotgg Aug 6, 2026
b70ad75
feat(swift-ios): distinguish development builds
t3dotgg Aug 6, 2026
88386d2
fix(swift-ios): restore active thread context
t3dotgg Aug 6, 2026
629d4ca
chore(swift-ios): bump TestFlight build to 4
t3dotgg Aug 6, 2026
4990f4c
chore(swift-ios): bump TestFlight build to 5
t3dotgg Aug 6, 2026
04ac8df
feat(swift-ios): paginate long thread history
t3dotgg Aug 7, 2026
aaa8546
chore(swift-ios): bump TestFlight build to 6
t3dotgg Aug 7, 2026
11e96da
feat(swift-ios): add T3 Connect to onboarding
t3dotgg Aug 7, 2026
3e891c3
chore(swift-ios): bump TestFlight build to 7
t3dotgg Aug 7, 2026
121becd
fix(swift-ios): address native client reliability feedback
t3dotgg Aug 7, 2026
9ae7940
fix(swift-ios): harden cloud and platform lifecycle
t3dotgg Aug 7, 2026
1c27157
fix(swift-ios): reject pre-cancelled rpc requests
t3dotgg Aug 7, 2026
bca94b0
chore(swift-ios): bump TestFlight build to 8
t3dotgg Aug 7, 2026
c037cce
feat(swift-ios): use Clerk authentication components
t3dotgg Aug 7, 2026
7b83983
feat(swift-ios): bring Ghostty to the terminal (#5602)
t3dotgg Aug 7, 2026
570e479
chore(swift-ios): bump TestFlight build to 9
t3dotgg Aug 7, 2026
9100a27
fix(swift-ios): polish T3 Connect sign in
t3dotgg Aug 7, 2026
93160ff
fix(swift-ios): unify T3 Connect provider buttons
t3dotgg Aug 7, 2026
42a56c2
fix(swift-ios): keep code views readable
t3dotgg Aug 7, 2026
4b8e5b3
feat(swift-ios): add light mode
t3dotgg Aug 7, 2026
5f78310
style(swift-ios): preserve native formatting
t3dotgg Aug 7, 2026
dbae2ee
fix(swift-ios): simplify settings
t3dotgg Aug 7, 2026
4fe936b
fix(swift-ios): stabilize image attachments
t3dotgg Aug 7, 2026
aef78f6
chore(swift-ios): prepare TestFlight build 12
t3dotgg Aug 7, 2026
a4954e3
fix(swift-ios): stabilize thread opening and photo selection
t3dotgg Aug 7, 2026
1101ad1
chore(swift-ios): prepare TestFlight build 13
t3dotgg Aug 7, 2026
c717113
ci(swift-ios): add native client checks
t3dotgg Aug 7, 2026
4005010
fix(swift-ios): harden native client architecture
t3dotgg Aug 7, 2026
aa472c6
chore(swift-ios): prepare TestFlight build 14
t3dotgg Aug 7, 2026
3dea11e
fix(swift-ios): apply theme changes immediately
t3dotgg Aug 7, 2026
ea94879
fix(swift-ios): stabilize photo attachments
t3dotgg Aug 7, 2026
52fe57f
fix(swift-ios): attach photos after picker dismissal
t3dotgg Aug 8, 2026
01edb76
fix(swift-ios): own photo picker dismissal
t3dotgg Aug 8, 2026
94e7f73
fix(swift-ios): keep photo picker presentation alive
t3dotgg Aug 8, 2026
9956765
chore(swift-ios): prepare TestFlight build 19
t3dotgg Aug 8, 2026
6bd60f8
feat(swift-ios): show cached project favicons
t3dotgg Aug 8, 2026
db019db
fix(swift-ios): keep new tasks on the selected project
t3dotgg Aug 8, 2026
fb57a5e
feat(swift-ios): show active subagent work
t3dotgg Aug 8, 2026
7f1eb79
fix(swift-ios): simplify background work status
t3dotgg Aug 8, 2026
00fd731
fix(ci): repair SwiftUI fixture verification (#5674)
saphid Aug 9, 2026
bf715b5
fix(ios): add compact header menu clearance (#5663)
saphid Aug 9, 2026
bf3a3b4
fix(ios): preserve project picker scroll during refresh (#5660)
saphid Aug 9, 2026
eb14db3
fix(swift-ios): distinguish monitoring from working
t3dotgg Aug 9, 2026
2ab7579
fix(swift-ios): address review findings
t3dotgg Aug 9, 2026
1b24cf8
fix(swift-ios): close auth reentrancy gaps
t3dotgg Aug 9, 2026
79474cf
fix(swift-ios): serialize connect sign-out
t3dotgg Aug 9, 2026
c65576a
test(swift-ios): make native CI fast and deterministic
t3dotgg Aug 9, 2026
3238c84
fix(swift-ios): close remaining review gaps
t3dotgg Aug 9, 2026
dd3700e
fix(swift-ios): keep activation state consistent
t3dotgg Aug 9, 2026
20e35fb
fix(swift-ios): complete activation recovery
t3dotgg Aug 9, 2026
127d74d
fix(swift-ios): stop notification launch crashes
t3dotgg Aug 10, 2026
d88756c
feat(swift-ios): add usage analytics (#5933)
t3dotgg Aug 10, 2026
b70b2ba
chore(ci): upload SwiftUI build 24 to TestFlight
t3dotgg Aug 10, 2026
7fea1b4
Revert "chore(ci): upload SwiftUI build 24 to TestFlight"
t3dotgg Aug 10, 2026
967f10d
fix(swift-ios): load T3 Connect devices from relay
t3dotgg Aug 10, 2026
dd51cbe
chore(ci): upload SwiftUI build 25 to TestFlight
t3dotgg Aug 10, 2026
56a5ae4
fix(ci): use distribution signing for SwiftUI archive
t3dotgg Aug 10, 2026
ad912ae
chore(ci): inspect iOS signing certificates
t3dotgg Aug 10, 2026
4197b10
fix(ci): clean up orphaned iOS certificates
t3dotgg Aug 10, 2026
1910fe2
revert: remove one-use SwiftUI TestFlight job
t3dotgg Aug 10, 2026
95734a7
refactor(swift-ios): scope state to each connection
t3dotgg Aug 10, 2026
f03c3c6
feat(swift-ios): add unified connections hub
t3dotgg Aug 10, 2026
29d2b2f
chore(swift-ios): bump build number to 26
t3dotgg Aug 10, 2026
4ac3ae3
test(swift-ios): use environment-scoped provider catalogs (#6130)
saphid Aug 14, 2026
3d1f388
fix(swift-ios): improve live duration accessibility (#5993)
saphid Aug 14, 2026
2afc261
fix(swift-ios): keep skills popup clear of the keyboard (#5971)
saphid Aug 14, 2026
79a28b3
fix(swift-ios): keep usage refresh truthful (#5992)
saphid Aug 14, 2026
2298414
fix(swift-ios): enable granular text selection (#6110)
saphid Aug 15, 2026
c4b825a
feat(swift-ios): default new tasks to recent project (#5802)
saphid Aug 15, 2026
496d07d
fix(swift-ios): restore thread scrolling and back swipe (#6090)
saphid Aug 15, 2026
5a13153
chore(swift-ios): bump build number to 27
t3dotgg Aug 15, 2026
120aaeb
fix(swift-ios): remove done badges from thread rows
t3dotgg Aug 15, 2026
c12b1c9
feat(swift-ios): unify environment management
t3dotgg Aug 15, 2026
a20ffd3
chore(swift-ios): bump build number to 28
t3dotgg Aug 15, 2026
53902a4
fix(swift-ios): remove done status from thread headers
t3dotgg Aug 15, 2026
b0f663b
chore(swift-ios): bump build number to 29
t3dotgg Aug 15, 2026
00487b6
fix(swift-ios): restore environment screen layout
t3dotgg Aug 18, 2026
671c3ad
fix(swift-ios): tolerate mixed usage servers
t3dotgg Aug 18, 2026
a46bd11
chore(swift-ios): bump build number to 30
t3dotgg Aug 18, 2026
97c79d2
feat(swift-ios): add recent mobile parity features
t3dotgg Aug 18, 2026
efe74de
feat(swift-ios): add pull request hub
t3dotgg Aug 18, 2026
89c002a
fix(swift-ios): show reactions on review threads
t3dotgg Aug 18, 2026
95f9145
chore(swift-ios): bump build number to 31
t3dotgg Aug 19, 2026
01c2af1
ci(swift-ios): right-size native test runner to 12 vCPU macOS (#7285)
t3dotgg Aug 19, 2026
713d904
feat(swift-ios): show build identity in settings (#7355)
saphid Aug 19, 2026
60a6343
fix(swift-ios): open thread links inside the app (#7343)
saphid Aug 19, 2026
f38214f
fix(swift-ios): grow composer within available viewport (#7299)
saphid Aug 19, 2026
d42ac4b
feat(swift-ios): surface recent projects in the project picker (#7370)
saphid Aug 19, 2026
9961e61
feat(swift-ios): settle thread rows with a full swipe (#7342)
saphid Aug 19, 2026
3662b54
chore(swift-ios): bump build number to 32
t3dotgg Aug 19, 2026
9309cbc
fix(swift-ios): keep new tasks in the open project
t3dotgg Aug 19, 2026
ce650fc
Revert "fix(swift-ios): keep new tasks in the open project"
t3dotgg Aug 19, 2026
b0199c9
fix(swift-ios): use project group names on home rows
t3dotgg Aug 19, 2026
4969cd6
feat(swift-ios): paste images from the composer's native menu (#7607)
mackinleysmith Aug 20, 2026
dd9ea0c
feat(swift-ios): attach images dragged onto the composer (#7701)
mackinleysmith Aug 20, 2026
6e53885
fix(swift-ios): keep the command menu above the composer (#7695)
mackinleysmith Aug 20, 2026
81ab4e8
chore(swift-ios): bump build number to 33
t3dotgg Aug 20, 2026
9412deb
fix(swift-ios): preserve live updates during thread loading (#7206)
saphid Aug 21, 2026
7612cbb
fix(swift-ios): clean up settings, environments, and thread actions (…
t3dotgg Aug 22, 2026
2952cbc
chore(swift-ios): bump build number to 34
t3dotgg Aug 22, 2026
c1233aa
fix(swift-ios): prevent lost messages and stale account access (#7974)
t3dotgg Aug 23, 2026
f1aaf63
fix(swift-ios): make thread settling immediate and smooth
t3dotgg Aug 24, 2026
ad8da2e
fix(swift-ios): restore live updates and paginate pull requests
t3dotgg Aug 24, 2026
70ed24b
chore(swift-ios): bump build number to 36
t3dotgg Aug 24, 2026
7949a3a
feat(swift-ios): show pull request status in the inbox
t3dotgg Aug 24, 2026
e023d05
feat(swift-ios): match recent server and mobile improvements
t3dotgg Aug 24, 2026
0c33d94
chore(swift-ios): bump build number to 37
t3dotgg Aug 24, 2026
7570c81
fix(swift-ios): keep long composer drafts above the controls
t3dotgg Aug 25, 2026
e960f46
feat(swift-ios): add linked pull requests and native file links
t3dotgg Aug 25, 2026
c1d1583
chore(swift-ios): bump build number to 38
t3dotgg Aug 25, 2026
9fc3c44
feat(swift-ios): open pull requests from the thread menu
t3dotgg Aug 25, 2026
0bbf81d
fix(swift-ios): show legacy models in favorites
t3dotgg Aug 27, 2026
c955902
fix(swift-ios): show cached thread recovery and update server parity
t3dotgg Aug 27, 2026
5ef94ac
chore(swift-ios): bump build number to 39
t3dotgg Aug 27, 2026
ddb0317
fix(swift-ios): open thread pull requests in browser
t3dotgg Aug 28, 2026
a625eaa
fix(swift-ios): stabilize thread navigation and scrolling
t3dotgg Aug 28, 2026
f76b988
fix(swift-ios): restore self-sizing transcript rows
t3dotgg Aug 28, 2026
f225a98
revert(swift-ios): restore original transcript scrolling
t3dotgg Aug 28, 2026
d66fcfc
fix(swift-ios): match thread settlement behavior
t3dotgg Aug 28, 2026
3ff80d9
feat(swift-ios): restore permissions and improve model options
t3dotgg Sep 1, 2026
52e9441
fix(swift-ios): prevent new task composer clipping
t3dotgg Sep 1, 2026
abc1df9
fix(swift-ios): keep thread model choices available
t3dotgg Sep 1, 2026
8ba1a8b
feat(ios): add attachments, voice, and server parity
t3dotgg Sep 2, 2026
8883138
docs(swiftui): document native mobile behavior
t3dotgg Sep 2, 2026
b20eb99
chore(ios): prepare build 40 for TestFlight
t3dotgg Sep 2, 2026
9d36b87
fix(swift-ios): keep caret after command completion (#8428)
mackinleysmith Sep 2, 2026
93f5178
fix(ios): keep native build tooling compatible with main
t3dotgg Sep 3, 2026
6f45762
fix(ios): resume cached threads after backgrounding
t3dotgg Sep 3, 2026
53abfad
chore(ios): prepare TestFlight build 41
t3dotgg Sep 3, 2026
6f3a6d2
fix(ios): scope composer skills to the current workspace
t3dotgg Sep 3, 2026
02bff56
feat(ios): add environment-scoped provider setup
t3dotgg Sep 3, 2026
2e6c752
feat(ios): sync icons and improve previews and recovery
t3dotgg Sep 3, 2026
2416f23
feat(ios): sync shared preferences and show tool app icons
t3dotgg Sep 3, 2026
8cd2359
chore(ios): prepare beta build 42
t3dotgg Sep 3, 2026
614ed15
fix(ios): preserve unknown image support for saved models
t3dotgg Sep 3, 2026
5bdd947
perf(swift-ios): parse long responses with fewer scans (#9675)
t3dotgg Sep 4, 2026
e7dc14f
perf(swift-ios): speed up large snapshot timestamp parsing (#9683)
t3dotgg Sep 4, 2026
fb2515d
fix(swift-ios): make swipe-to-settle removal smooth (#9680)
t3dotgg Sep 4, 2026
cee76fc
fix(swift-ios): keep thread catch-up complete and visible (#9678)
t3dotgg Sep 4, 2026
3eb1ba3
fix(swift-ios): use the provisioned development app group
t3dotgg Sep 4, 2026
4cfde8c
fix(swift-ios): keep snapshots on their source environment
t3dotgg Sep 4, 2026
e08a2ef
fix(swift-ios): save new attachments before uploading
t3dotgg Sep 4, 2026
82d9cd6
fix(swift-ios): keep the keyboard open during voice input
t3dotgg Sep 4, 2026
d9dbfe3
chore(swift-ios): prepare TestFlight build 46
t3dotgg Sep 4, 2026
5c1b3bb
build(swift-ios): add API-key TestFlight commands
t3dotgg Sep 4, 2026
f216f28
build(swift-ios): read TestFlight credentials from a private env file
t3dotgg Sep 4, 2026
91d266b
feat(swift-ios): add limits and catch up with mobile changes
t3dotgg Sep 5, 2026
a912f02
fix(swift-ios): retain drafts across computers and show remaining quota
t3dotgg Sep 6, 2026
8b36712
perf(swift-ios): reuse inbox rows and defer image work
t3dotgg Sep 6, 2026
786963d
feat(swift-ios): let readers dismiss the keyboard over a long draft (…
saphid Sep 6, 2026
6e3ef84
feat(swift-ios): show how long completed threads have been done (#7399)
saphid Sep 6, 2026
c03f573
feat(swift-ios): copy thread metadata from row menus (#8622)
saphid Sep 6, 2026
88f32cf
feat(swift-ios): keep failed source control output visible with acces…
saphid Sep 6, 2026
4659352
fix(swift-ios): show cached source control status (#7330)
saphid Sep 6, 2026
5450532
fix(swift-ios): refresh passive threads sooner (#8644)
saphid Sep 6, 2026
cb4d0e6
feat(swift-ios): show skill invocations as pills (#9071)
mackinleysmith Sep 6, 2026
e5091c4
feat(swift-ios): choose the reasoning level from the composer (#7344)
saphid Sep 6, 2026
d4e5864
fix(swift-ios): explain unreachable environments in the new-thread pi…
saphid Sep 6, 2026
b323793
feat(swift-ios): add reliable text and code sizing (#7612)
saphid Sep 6, 2026
4a5f44a
fix(swift-ios): align server metadata and merged composer changes
t3dotgg Sep 6, 2026
8a85b62
refactor(swift-ios): simplify settings and save preferences immediately
t3dotgg Sep 6, 2026
337a238
docs(swift-ios): explain cloud signing for TestFlight uploads
t3dotgg Sep 6, 2026
79e4bd7
perf(swift-ios): apply inbox stream updates in batches
t3dotgg Sep 8, 2026
ae4e9e5
feat(swift-ios): support async questions and hub reset credits
t3dotgg Sep 8, 2026
6842317
feat(swift-ios): show provider accounts and select existing branches
t3dotgg Sep 8, 2026
25358c4
feat(swift-ios): attach files to question answers
t3dotgg Sep 8, 2026
60e10f8
fix(swift-ios): disable performance diagnostics in unit tests
t3dotgg Sep 8, 2026
9765ef0
test(swift-ios): keep question fixture formatting stable
t3dotgg Sep 8, 2026
ec7afc5
chore(swift-ios): prepare TestFlight build 48
t3dotgg Sep 8, 2026
cef9e58
feat(swift-ios): show when a thread title is being regenerated (#10721)
t3dotgg Sep 8, 2026
e6c247a
fix(swift-ios): apply audit and review fixes
t3dotgg Sep 14, 2026
3fe0ba5
chore(swift-ios): prepare TestFlight build 49
t3dotgg Sep 14, 2026
e576245
test(swift-ios): refresh wire fixtures from latest main
t3dotgg Sep 14, 2026
28ef3b6
perf(swift-ios): apply thread catch-up in bounded batches (#11687)
t3dotgg Sep 14, 2026
762cc85
fix(swift-ios): load file folders on demand (#11688)
t3dotgg Sep 14, 2026
6b15a3b
feat(swift-ios): arrange threads with drag handles (#11379)
saphid Sep 14, 2026
7e718f0
feat(swift-ios): show native crash reports in settings (#11689)
t3dotgg Sep 14, 2026
4a1bfa0
feat(swift-ios): add project settings and response streaming controls…
t3dotgg Sep 14, 2026
2c8951c
feat(swift-ios): show bundled open source licenses (#11695)
t3dotgg Sep 14, 2026
006bb4b
feat(swift-ios): support linked pull requests and GitHub sharing (#11…
t3dotgg Sep 14, 2026
d811a87
feat(swift-ios): show pooled subscription limits in widgets (#11692)
t3dotgg Sep 14, 2026
d0ef786
feat(swift-ios): preserve message context and fold large pastes (#11694)
t3dotgg Sep 14, 2026
459fb27
fix(swift-ios): keep widget refresh work on the main actor
t3dotgg Sep 14, 2026
5bca48c
chore(swift-ios): prepare build 50
t3dotgg Sep 14, 2026
85eecea
feat(swift-ios): rewind conversations without restoring files (#11690)
t3dotgg Sep 14, 2026
91d393a
fix(swift-ios): let worktree setup finish before retrying (#11704)
t3dotgg Sep 14, 2026
57b6128
fix(swift-ios): align short source files to the top
t3dotgg Sep 14, 2026
11e4574
feat(swift-ios): preserve context when copying between messages (#11701)
t3dotgg Sep 14, 2026
0eb8b32
fix(swift-ios): use native content swipe-back on iOS 26
t3dotgg Sep 14, 2026
79c6bb7
fix(swift-ios): drain terminal output before closing its renderer
t3dotgg Sep 15, 2026
8419b36
fix(swift-ios): render terminal updates from native wakeups
t3dotgg Sep 15, 2026
91a4268
fix(swift-ios): open threads at the bottom and add a jump button
t3dotgg Sep 17, 2026
3a1f166
test(swift-ios): wait for applied replay batches
t3dotgg Sep 17, 2026
bdc4ecb
fix(swift-ios): keep jump-to-bottom ahead of pending history layouts
t3dotgg Sep 17, 2026
7d4104b
fix(swift-ios): recover T3 Connect after moving to a new phone
t3dotgg Sep 22, 2026
2ad910d
fix(swift-ios): allow HTTP connections to NetBird and Tailscale IPs (…
DominicVonk Sep 23, 2026
285d2ab
feat(swift-ios): catch up with current server and mobile features
t3dotgg Oct 1, 2026
d545489
fix(swift-ios): add copy and timestamp footers to chat messages
mackinleysmith Oct 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions .agents/skills/test-t3-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ description: Test T3 Code's native iOS and Android app through its Device panel

# Test T3 Mobile

Select the client before building. `apps/mobile` is React Native for iOS and Android. `apps/swift-ios` is the separate native SwiftUI iOS app. They have separate builds, identities, and pairing routes.

## Open the device

Call `device_list`, then `device_open` with the selected host and device IDs.
Expand All @@ -26,7 +28,11 @@ Test with meaningful project and thread data. Read the shared
[SQLite fixture reference](../test-t3-app/references/sqlite-fixtures.md) only
when inspecting or seeding SQLite. Stop the test server before fixture writes.

## Launch T3 Code Dev
## Launch the selected client

For SwiftUI, build `apps/swift-ios/T3Code.xcodeproj`, scheme `T3Code`, configuration `Debug`, for the selected iOS simulator. Install and launch `com.t3tools.t3code.swiftui.dev` with the returned AgentDevice command and target arguments. Pair through its native connection screen with a credential from the isolated backend. Do not start Metro or run the Expo helper for SwiftUI.

### React Native T3 Code Dev

From the checkout being tested on the selected device host, run:

Expand All @@ -44,7 +50,7 @@ The device must be able to reach both Metro and the isolated backend.

## Pair and verify

Use the helper from the repository root, with the returned executable and target
For React Native, use the helper from the repository root, with the returned executable and target
arguments stored in `agent_device_command` and the Bash array
`agent_device_target_args`:

Expand Down
58 changes: 58 additions & 0 deletions .github/workflows/swift-ios.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: SwiftUI iOS

on:
pull_request:
paths:
- "apps/swift-ios/**"
- "packages/contracts/**"
- "scripts/generate-swift-wire-fixtures.ts"
- "scripts/package.json"
- ".github/workflows/swift-ios.yml"
- "package.json"
- "pnpm-lock.yaml"
- "pnpm-workspace.yaml"
push:
branches:
- main
paths:
- "apps/swift-ios/**"
- "packages/contracts/**"
- "scripts/generate-swift-wire-fixtures.ts"
- "scripts/package.json"
- ".github/workflows/swift-ios.yml"
- "package.json"
- "pnpm-lock.yaml"
- "pnpm-workspace.yaml"

concurrency:
group: swift-ios-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
test:
name: Contract fixtures and native tests
runs-on: blacksmith-12vcpu-macos-26
timeout-minutes: 25
steps:
- name: Checkout
uses: actions/checkout@v6
with:
sparse-checkout: |
/*
!/.repos/
sparse-checkout-cone-mode: false

- name: Setup Vite+
uses: voidzero-dev/setup-vp@v1
with:
node-version-file: package.json
cache: true
run-install: |
args:
- --filter=@t3tools/scripts...

- name: Verify generated wire fixtures
run: node scripts/generate-swift-wire-fixtures.ts --check

- name: Test SwiftUI client
run: apps/swift-ios/Scripts/ci-test.sh
9 changes: 7 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,12 @@ T3 Code has 3 key app surfaces: **web**, **desktop**, and **mobile**.

**Desktop** is the main surface most users install first. It's a full Electron app that bundles the server runner as well. The desktop app can also be used as the host server, allowing remote connections from app.t3.codes or the mobile app.

**Mobile** is a React Native app for both iOS and Android, available on the App Store and Google Play. The mobile app allows for connecting to any T3 Code server to control work remotely.
**Mobile** has two separate clients that connect to the same servers:

- `apps/mobile` is the React Native app for iOS and Android.
- `apps/swift-ios` is the native SwiftUI app for iOS, with its own Xcode project and app identities.

UI, persistence, and build changes in one do not automatically reach the other. Say **React Native mobile** or **SwiftUI mobile** when implementation details matter.

## A note from Theo

Expand Down Expand Up @@ -149,7 +154,7 @@ Full glossary with file links: `docs/internals/glossary.md`
## Where code lives

- `apps/server` - WebSocket, orchestration, providers, checkpointing. Effect-heavy: read `.repos/effect-smol/LLMS.md` before writing Effect code.
- `apps/web` - React/Vite UI. `apps/desktop` wraps it, `apps/mobile` is React Native, `apps/marketing` is the site.
- `apps/web` - React/Vite UI. `apps/desktop` wraps it, `apps/mobile` is React Native, `apps/swift-ios` is the separate native SwiftUI client, `apps/marketing` is the site.
- `packages/contracts` - Effect/Schema contracts plus small derived helpers. No heavy runtime logic.
- `packages/shared` - shared runtime utils, subpath exports, no barrel.
- `packages/client-runtime` - client code shared by web and mobile.
Expand Down
4 changes: 4 additions & 0 deletions apps/swift-ios/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.derivedData/
DerivedData/
*.xcuserstate
xcuserdata/
74 changes: 74 additions & 0 deletions apps/swift-ios/App/Cloud/T3ConnectAuth.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import ClerkKit
import Foundation

public struct T3ConnectAccount: Equatable, Sendable {
public let id: String
public let email: String?
public let imageURL: URL?
}

public enum T3ConnectAuthError: LocalizedError, Sendable {
case noSession

public var errorDescription: String? {
switch self {
case .noSession:
"Sign in to your T3 account to use T3 Connect."
}
}
}

enum T3ConnectAuthCallback {
static let scheme = PlatformRoute.nativeScheme
static let redirectURL = "\(scheme)://clerk-callback"
}

/// Small ClerkKit boundary. Clerk owns encrypted session persistence and the
/// ASWebAuthenticationSession callback; the app only asks for the relay JWT.
@MainActor
public final class T3ConnectClerkSession {
private let clerk: Clerk
private let jwtTemplate: String

public init(configuration: T3ConnectConfiguration) {
jwtTemplate = configuration.clerkJWTTemplate
clerk = Clerk.configure(
publishableKey: configuration.clerkPublishableKey,
options: .init(
redirectConfig: .init(
redirectUrl: T3ConnectAuthCallback.redirectURL,
callbackUrlScheme: T3ConnectAuthCallback.scheme
)
)
)
}

var client: Clerk { clerk }

public var account: T3ConnectAccount? {
guard let user = clerk.user else { return nil }
return T3ConnectAccount(
id: user.id,
email: user.primaryEmailAddress?.emailAddress,
imageURL: URL(string: user.imageUrl)
)
}

public var isLoaded: Bool { clerk.isLoaded }

public func refresh() async throws {
_ = try await clerk.refreshClient()
}

public func signOut() async throws {
try await clerk.auth.signOut()
}

public func relayToken() async throws -> String {
let token = try await clerk.auth.getToken(
.init(template: jwtTemplate, expirationBuffer: 20)
)
guard let token, !token.isEmpty else { throw T3ConnectAuthError.noSession }
return token
}
}
Loading
Loading