Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
e0513d2
fix(web): server updates no longer look like warnings (#4992)
t3dotgg Jul 30, 2026
1877237
fix(connect): reboots no longer strand the relay link, 403s now say w…
t3dotgg Jul 30, 2026
abc409c
Add project file picker (⌘P) and project content search (⇧⌘F) (#4855)
jakeleventhal Jul 30, 2026
6154b46
Check for mobile app updates on launch (#4958)
juliusmarminge Jul 30, 2026
323dc32
fix(mobile): support pre-Liquid-Glass iOS bottom toolbar (#4984)
gabrielelpidio Jul 30, 2026
edc503a
fix(server): restore PR detection without HOME (#4985)
StiensWout Jul 30, 2026
4ba4871
fix(web): fill fast mode icon (#5004)
maria-rcks Jul 30, 2026
1d77cec
fix: cache project favicons across web and mobile (#4767)
gabrielelpidio Jul 30, 2026
e482960
perf(ci): cut stale runs and redundant setup (#4802)
t3dotgg Jul 30, 2026
bc142f8
chore(mobile): bump app version to 1.0.1
juliusmarminge Jul 30, 2026
5b2577f
style(web): make scroll-to-end pill translucent (#5036)
maria-rcks Jul 30, 2026
4029b85
fix(ci): drop sparse-checkout from EAS workflows
juliusmarminge Jul 30, 2026
fbecb73
fix(desktop): bump Clerk Electron SDK to 0.0.24 and register t3code:/…
juliusmarminge Jul 30, 2026
34b15a9
perf(server): cache default branch name and origin existence across s…
UtkarshUsername Jul 30, 2026
063ed71
feat(shared): support shorthand (major-only) versions in the semver h…
arhxam Jul 30, 2026
162e774
fix(mobile): remove unnecessary photo library permission (#4929)
skjiisa Jul 30, 2026
32407df
fix(shared): lenient JSON parser deletes commas inside string values …
arhxam Jul 30, 2026
1d694dc
fix(mobile): default bare IP pairing to HTTP (#4990)
Lucenx9 Jul 30, 2026
cb293fe
fix(mobile): restore iOS Threads branding (#4862)
PixPMusic Jul 30, 2026
b0b2752
chore: add mobile issue template area (#4895)
MaxAnderson95 Jul 30, 2026
41124c7
fix(desktop): link release notes from the update downloaded toast (#4…
Sy-D Jul 30, 2026
cb11a71
fix(mobile): accept Android clipboard images in composer (#4836)
adityavardhansharma Jul 30, 2026
605c2bb
fix(mobile): show the correct build channel in Android's Threads page…
PixPMusic Jul 30, 2026
df78cda
fix(contracts): decode growing config unions forward-compatibly (#5055)
juliusmarminge Jul 30, 2026
e259dd2
fix(mobile): server model, worktree, and origin preferences now apply…
t3dotgg Jul 31, 2026
50a3d6b
fix(ci): repair the mobile showcase screenshots workflow (#5057)
juliusmarminge Jul 31, 2026
fccec9f
fix(ci): capture iPad App Store screenshots in landscape (#5065)
PixPMusic Jul 31, 2026
894d6d6
fix(oxlint-plugin): Resolve the oxlint bin without assuming a pnpm la…
mwolson Jul 31, 2026
61514c1
feat(cli): `npx t3 pair` - generate QR code from a running server (#4…
t3dotgg Jul 31, 2026
ef4ec2a
fix(server): self-update no longer rolls itself back on restart (#5095)
t3dotgg Jul 31, 2026
ab8182c
fix(ci): rotate iPad showcase captures without Simulator UI scripting…
juliusmarminge Jul 31, 2026
acf761b
feat(web): render terminals with libghostty-vt (#4860)
StiensWout Jul 31, 2026
964cc27
refactor: move the canonical libghostty-vt vendor to the repository r…
StiensWout Jul 31, 2026
a041981
feat(mobile): add thread snoozing (#5053)
gabrielelpidio Jul 31, 2026
916cff7
feat(mobile): make settled threads collapsible (#5056)
PixPMusic Jul 31, 2026
03adf21
follow-up normalization after #4700. (#4498)
shivamhwp Jul 31, 2026
bfc3150
feat(web): search threads from the sidebar (#4769)
shivamhwp Jul 31, 2026
e5c7547
feat(web): add settings sidebar search (#4682)
shivamhwp Jul 31, 2026
491219b
fix: threads with open PRs no longer auto-settle (#5151)
t3dotgg Jul 31, 2026
ca72e38
fix(server): bound thread catch-up replay and stop full-DB snapshot h…
t3dotgg Jul 31, 2026
0ad91b6
fix(server): follow branch drift in dedicated worktrees so PRs link t…
t3dotgg Aug 1, 2026
d303706
fix(server): make remote updates rollback-safe (#5181)
t3dotgg Aug 1, 2026
78eb3ec
fix(web): stop settle controls overlapping the status label (#4574)
ipanasenko Aug 1, 2026
283c7ac
fix: normalize app icon glyph sizing (#5202)
t3-code[bot] Aug 1, 2026
5192f77
fix(server): surface cloudflared FTL/PNC relay logs as warnings, not …
arhxam Aug 1, 2026
64bf016
fix(server): stop npx service updates from silently leaving the old s…
t3dotgg Aug 2, 2026
e60821f
feat: fold legacy models into separate menus (#5190)
t3dotgg Aug 2, 2026
20910ed
Merge origin/main (upstream v0.0.32 line) into custom
NoahHendrickson Aug 2, 2026
92636b3
fix: address PR #44 review — surface tripwire, stack trim, keyless lo…
NoahHendrickson Aug 2, 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
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .agents/skills/test-t3-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Use these client origins:
- Android Emulator: `http://10.0.2.2:<server-port>`
- Physical device: bind the backend to `0.0.0.0` and use the host's reachable LAN origin

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

## Start or reuse Metro safely

Expand Down
32 changes: 22 additions & 10 deletions .fork/customizations.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -910,6 +910,15 @@
those imports to make a conflict go away, because nothing in the fork's
copy references them any more.

Same spirit, opposite direction: Sidebar.logic.ts keeps upstream's
searchSidebarThreadsByTitle (and its tests) even though nothing in the
fork's copy of SidebarV2 renders it. Upstream's inline sidebar thread
search (#4769) lives in the chrome this customization replaced, so the
2026-08-02 sync deliberately did not adopt its UI; the pure helper stays
so a future port into SidebarV2ChromeRows is a design decision, not an
archaeology dig. It is an orphan on purpose — do not "clean it up", and
do not count its tests as coverage of a rendered path.

The thread list pays for its own scroll gutter. scrollbar-gutter:stable
reserves the scrollbar inside the list's padding box, so the symmetric px-2
from Figma 113:3718 spends 8px of air on the left and 8 plus the scrollbar
Expand Down Expand Up @@ -1132,16 +1141,15 @@
index.css. Routing through --fork-font-* keeps the values scoped under the
fork marker while the fallbacks leave an unmarked build on DM Sans.
The terminal's font logic lives in custom/terminalFont.ts rather than in
the drawer: xterm takes its font from a constructor option instead of the
cascade, so --font-mono has to be resolved by hand and the cell grid
re-measured once the webfont lands — xterm sizes columns at open(), and a
webfont can land after that. The drawer keeps two one-line call sites, and
the font-load probe is derived from the resolved stack rather than
hardcoded, so it cannot go stale on a face swap and an unmarked build
names a local system face and fetches nothing. The re-fit must also
propagate to the PTY via resizeTerminal — nothing in the drawer subscribes
to onResize, and a re-fit that corrects only xterm's local grid leaves the
PTY wrapping to the stale, fallback-measured width.
the drawer: the ghostty surface takes its font as a creation option
instead of from the cascade, so --font-mono has to be resolved by hand at
the mount site. The drawer keeps one one-line call site passing
font.family. Unlike the xterm era there is no fork refit shim: the
surface itself waits on document.fonts before measuring the cell grid and
re-measures on loadingdone, so the webfont-landing-late case is upstream's
to handle now. In an unmarked build the cascade read returns upstream's
stack and no Geist byte is fetched; the module's fallback only engages
when the read comes back empty.
Geist Mono is listed AHEAD of SF Mono: upstream puts SF Mono first, which
means on macOS its bundled mono webfont never renders at all. body / pre,
code are re-declared under
Expand All @@ -1167,6 +1175,10 @@
watch:
- apps/web/src/index.css
- apps/web/src/components/ThreadTerminalDrawer.tsx
# The fork deleted its own refit shim because the surface waits on
# document.fonts before measuring and re-measures on loadingdone. If
# upstream stops, the terminal silently measures against fallback metrics.
- apps/web/src/terminal/ghostty/surface.ts
# No fence, but load-bearing: ships the resolved --font-sans / --font-mono
# into the previewed page — see FORK-CUSTOMIZATION-DECISIONS.md.
- apps/web/src/browser/annotationTheme.ts
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ body:
- apps/web
- apps/server
- apps/desktop
- apps/mobile
- packages/contracts or packages/shared
- Build, CI, or release tooling
- Docs
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ body:
- apps/web
- apps/server
- apps/desktop
- apps/mobile
- packages/contracts or packages/shared
- Build, CI, or release tooling
- Docs
Expand Down
32 changes: 30 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ on:
- custom
# fork:end ci-on-custom

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

jobs:
check:
name: Check
Expand All @@ -22,6 +26,11 @@ jobs:
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
Expand Down Expand Up @@ -75,6 +84,11 @@ jobs:
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
Expand Down Expand Up @@ -104,13 +118,20 @@ jobs:
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: true
run-install: |
args:
- --filter=@t3tools/scripts...

- name: Install mobile native static analysis tools
run: brew bundle install --file apps/mobile/Brewfile
Expand All @@ -127,13 +148,20 @@ jobs:
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: true
run-install: |
args:
- --filter=@t3tools/scripts...

- name: Exercise release-only workflow steps
run: node scripts/release-smoke.ts
Expand Down
9 changes: 8 additions & 1 deletion .github/workflows/deploy-relay.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,20 @@ jobs:
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: true
run-install: |
args:
- --filter=t3code-relay...

- name: Deploy production relay stage
id: deploy
Expand Down
17 changes: 14 additions & 3 deletions .github/workflows/mobile-eas-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,18 @@ name: Mobile EAS Preview

on:
pull_request:
types: [opened, reopened, synchronize, labeled, unlabeled]
types: [opened, reopened, synchronize, labeled]

jobs:
preview:
name: EAS Preview
if: contains(github.event.pull_request.labels.*.name, '🚀 Mobile Continuous Deployment')
if: |
contains(github.event.pull_request.labels.*.name, '🚀 Mobile Continuous Deployment') &&
(github.event.action != 'labeled' || github.event.label.name == '🚀 Mobile Continuous Deployment')
runs-on: blacksmith-8vcpu-ubuntu-2404
concurrency:
group: mobile-eas-preview-${{ github.event.pull_request.number }}
cancel-in-progress: true
permissions:
contents: read
pull-requests: write
Expand All @@ -34,14 +39,20 @@ jobs:
uses: actions/checkout@v6
with:
fetch-depth: 0
# No sparse-checkout here: it makes actions/checkout fetch with
# --filter=blob:none, and eas-cli archives the project via
# `git clone --depth 1 file://<workspace>`, which fails (exit 128)
# when the partial clone can't serve the unfetched blobs.

- name: Setup Vite+
if: steps.expo-token.outputs.present == 'true'
uses: voidzero-dev/setup-vp@v1
with:
node-version-file: package.json
cache: true
run-install: true
run-install: |
args:
- --filter=@t3tools/mobile...

- name: Expose pnpm
if: steps.expo-token.outputs.present == 'true'
Expand Down
8 changes: 7 additions & 1 deletion .github/workflows/mobile-eas-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,20 @@ jobs:
uses: actions/checkout@v6
with:
fetch-depth: 0
# No sparse-checkout here: it makes actions/checkout fetch with
# --filter=blob:none, and eas-cli archives the project via
# `git clone --depth 1 file://<workspace>`, which fails (exit 128)
# when the partial clone can't serve the unfetched blobs.

- name: Setup Vite+
if: steps.expo-token.outputs.present == 'true'
uses: voidzero-dev/setup-vp@v1
with:
node-version-file: package.json
cache: true
run-install: true
run-install: |
args:
- --filter=@t3tools/mobile...

- name: Expose pnpm
if: steps.expo-token.outputs.present == 'true'
Expand Down
22 changes: 20 additions & 2 deletions .github/workflows/mobile-showcase-screenshots.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,22 @@ jobs:
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: true
run-install: |
args:
- --filter=@t3tools/mobile...
- --filter=@t3tools/scripts...
- --filter=t3...

- name: Expose pnpm
run: |
Expand Down Expand Up @@ -77,13 +86,22 @@ jobs:
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: true
run-install: |
args:
- --filter=@t3tools/mobile...
- --filter=@t3tools/scripts...
- --filter=t3...

- name: Expose pnpm
run: |
Expand Down
Loading
Loading