Skip to content

perf(build): stop unpacking node_modules wholesale from the Windows asar - #5877

Merged
shivamhwp merged 13 commits into
pingdotgg:mainfrom
tsouth89:perf/windows-installer-file-count
Aug 14, 2026
Merged

perf(build): stop unpacking node_modules wholesale from the Windows asar#5877
shivamhwp merged 13 commits into
pingdotgg:mainfrom
tsouth89:perf/windows-installer-file-count

Conversation

@tsouth89

@tsouth89 tsouth89 commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Fixes the install-time and cold-start half of #5876.

What Changed

WINDOWS_ASAR_UNPACK was ["apps/server/dist/**", "**/node_modules/**"]. This inverts the CLI bundler's dependency rule — bundle everything except the packages that genuinely cannot be inlined — and narrows asarUnpack to exactly that set.

A package earns an exemption for one of two reasons:

  • Native addons. A .node binary cannot be inlined into JS and must sit on disk for both the Windows primary and the Linux Node inside WSL. The JS wrappers that dlopen them count too (ffi-rs, @ff-labs/fff-node, msgpackr-extract, node-gyp-build), since they resolve their binary by real filesystem path at runtime.
  • Bun-only entry points. @effect/platform-bun and @effect/sql-sqlite-bun are reached through a runtime-conditional dynamic import and resolve bun:sqlite, which does not exist when bundling for Node.

Both consumers now derive from one list in scripts/lib/cli-external-packages.ts, so they cannot drift.

Why

The Windows installer writes 14,687 files, 13,875 of them loose node_modules files, to support 20 native binaries. The entire Electron runtime is 22 files because it stays inside the archive.

That count costs twice: NSIS install time tracks file count, not bytes; and each file is a separate open/stat/scan the first time the server runs after an install, when the file cache is cold and the on-access scanner is not.

Measured on this repo, win/nsis x64:

before after
files written at install 14,687 1,192 (−92%)
loose node_modules files 13,875 370
native .node binaries 20 20
installer size 145.0 MiB 138.9 MiB

Cold start, extracting each build's payload to a fresh directory so the files had never been read, alternating run order between builds:

before after
server boot to Listening on 9,044ms / 10,160ms 3,667ms / 3,779ms
module load only (--version) 6,521 / 6,238 / 6,208ms 761 / 659 / 654ms

The main window is not created until the backend answers HTTP, so that ~6s comes off a cold launch.

Why one shared list

A package that is external but not unpacked still resolves on the Windows primary, which runs under ELECTRON_RUN_AS_NODE and reads app.asar transparently. It fails only under WSL. That asymmetry makes the drift invisible on the platform you are most likely to test on.

node-gyp-build-optional-packages hit exactly this while I was writing the patch — matched as external by the node-gyp-build prefix, missed by a glob without a trailing wildcard. There are tests for the invariant.

Verification

Extracted app.asar.unpacked into a directory with no node_modules ancestor — what plain node sees under WSL — and booted the server there. Migrations ran, it listened on 127.0.0.1, and no module failed to resolve. node-pty, ffi-rs, msgpackr-extract and @ff-labs/fff-node all load from that isolated tree.

scripts/build-desktop-artifact.test.ts (30) and the new scripts/lib/cli-external-packages.test.ts (7) pass. vp lint and @t3tools/server typecheck are clean.

One caveat on my verification: the build warned No WSL node-pty prebuild provided, so I exercised the WSL module resolution path with Linux-shaped constraints rather than a real WSL launch. Happy to rerun with a Linux pty.node prebuild if you want that closed before merging.

UI Changes

None.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes (n/a — no UI change)
  • I included a video for animation/interaction changes (n/a — no motion change)

Note

Medium Risk
Windows/WSL packaging behavior changes—missing external or unpack coverage surfaces as runtime MODULE_NOT_FOUND under WSL while Windows may still work; mitigated by shared lists, closure tests, and the packaged self-containment probe.

Overview
Narrows Windows asarUnpack from all of node_modules to the server dist plus globs derived from a shared external-package list, cutting install file count sharply while keeping what plain Node under WSL can load on disk.

Inverts server CLI bundling in apps/server/vite.config.ts: inline almost all JS deps via alwaysBundle + neverBundle, with rules centralized in scripts/lib/cli-external-packages.ts so the bundler and unpack globs stay aligned (native addons, loaders like node-gyp-build / detect-libc, bun-only entry points).

Adds desktop build guards: scan emitted chunks for wrongly inlined externals and missing inlined effect; detect inlined native loaders from the pnpm store; on Windows, copy app.asar.unpacked into an isolated tree (junction-safe symlinks, no ancestor node_modules) and run bin.mjs --version with hardened Node resolution.

Updates WSL preflight to require.resolve("node-pty/package.json") instead of effect, since JS deps are no longer on the unpacked filesystem.

Reviewed by Cursor Bugbot for commit 2103eb6. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Stop unpacking all node_modules from the Windows asar by inlining JS deps into the server bundle

  • The server bundle in vite.config.ts now inlines all JS dependencies by default and keeps native/build-only packages external via a neverBundle rule, so only those external packages need to be unpacked from the asar.
  • A shared cli-external-packages.ts module defines the authoritative list of external package prefixes, derives asar unpack globs, and provides findInlinedExternalPackages to scan bundle chunks for violations.
  • build-desktop-artifact.ts now runs preflight checks that fail the build if external packages are inlined, native packages are accidentally bundled, or the sentinel package (effect) is not inlined (confirming self-containment).
  • On Windows, the build verifies the packaged server bundle loads in isolation by running node bin.mjs --version against the unpacked asar in a temp directory, catching missing imports or escaping symlinks before artifact copy.
  • The WSL preflight probe in DesktopWslEnvironment.ts now checks for node-pty availability instead of effect, since effect is no longer unpacked.
  • Risk: build will hard-fail if any runtime dependency of an external package is accidentally bundled (e.g., detect-libc), requiring explicit additions to the external list.

Macroscope summarized 2103eb6.

A Windows installer built from main writes 14,687 files, of which 13,875 are
loose node_modules files under app.asar.unpacked. Only 20 of them are native
.node binaries. For contrast, the entire Electron runtime -- several hundred MB
-- is 22 files, because it stays inside the archive.

That file count costs twice. NSIS install time tracks file count, not bytes.
And every one of those files is a separate open/stat/scan the first time the
server starts after an install, which is exactly when the OS file cache is cold
and the on-access virus scanner is not.

The blanket `**/node_modules/**` unpack exists because the CLI bundle
externalizes its runtime dependencies, and the WSL backend launches plain
`wsl.exe -- node`, which cannot read inside an asar. So every external dep has
to be a real file on disk.

Invert the bundler's rule: bundle everything except the packages that genuinely
cannot be inlined -- native addons, the JS wrappers that dlopen them, and the
Bun-only entry points that resolve `bun:*` specifiers -- then narrow asarUnpack
to exactly that set.

Measured on this tree, win/nsis x64:

  files written at install   14,687 -> 1,192   (-92%)
  loose node_modules files   13,875 ->   370
  native .node binaries          20 ->    20
  installer size            145.0 MiB -> 138.9 MiB

Cold start improves by the same mechanism. Extracting each build's payload to a
fresh directory (so the files have never been read) and booting the server:

  server boot to "Listening on"   9044ms / 10160ms  ->  3667ms / 3779ms
  module load only (--version)    6521 / 6238 / 6208ms -> 761 / 659 / 654ms

Run order was alternated between builds to keep cache and scanner state from
favouring either one. The desktop main window is not created until the backend
answers HTTP, so that ~6s comes straight off a cold launch.

Both consumers now derive from one list in scripts/lib/cli-external-packages.ts.
They cannot drift, and the drift is worth guarding: a package that is external
but not unpacked still resolves on the Windows primary, which runs under
ELECTRON_RUN_AS_NODE and reads app.asar transparently. It fails only under WSL.
`node-gyp-build-optional-packages` hit exactly this while writing the patch --
matched as external by the `node-gyp-build` prefix, missed by a glob without a
trailing wildcard, and invisible on the platform being tested on.

Verified the way this can actually fail: extracted app.asar.unpacked into a
directory with no node_modules ancestor -- what plain node sees under WSL -- and
booted the server there. Migrations ran, it listened on 127.0.0.1, and no
module failed to resolve. node-pty, ffi-rs, msgpackr-extract and
@ff-labs/fff-node all load from that isolated tree.
@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f64d68f4-cfe1-4e3c-949a-2d2df8a347cf

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 9, 2026
@macroscopeapp

macroscopeapp Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR substantially changes the Windows packaging strategy from unpacking all node_modules to selectively unpacking only native packages. The complexity of the new bundling logic, self-containment verification, and potential runtime impact on WSL if external packages are miscategorized warrants human review.

You can customize Macroscope's approvability policy. Learn more.

Real WSL testing on this branch found a case the hand-maintained list could not
catch by inspection.

node-gyp-build-optional-packages is external, so it is loaded from the real
filesystem, so its own `require` resolves from the real filesystem too. It
requires detect-libc, which was not on the list and therefore got bundled into
the CLI bundle -- present only inside app.asar. The Windows primary reads that
transparently under ELECTRON_RUN_AS_NODE and resolves it; plain node under WSL
cannot. msgpackr-extract failed through the same chain.

Measured under Ubuntu 24.04 with Linux node v24.18.0 against the packaged tree:

  before: MISSING (cjs) msgpackr-extract [MODULE_NOT_FOUND] detect-libc
          MISSING (cjs) node-gyp-build-optional-packages [MODULE_NOT_FOUND]
  after : no resolution failures

The general rule is that an external package's entire runtime dependency
closure must be external. That is not something to maintain by staring at a
list, so it is now a test: it walks each runtime-external package's declared
dependencies transitively and fails if any would be bundled away.

Writing that test surfaced a distinction the single list had flattened. The
Bun-only entries are external for a build-time reason -- they resolve `bun:*`
specifiers that do not exist when bundling for Node -- and Node never loads
them, so their closure genuinely does not need to be external. The native
packages are external for a runtime reason and theirs does. The list is split
along that line, and the closure test applies only to the runtime set.

Adds 6 files to the installer (1,192 -> 1,198). Native binaries and installer
size are unchanged.
@github-actions github-actions Bot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 9, 2026
@tsouth89

tsouth89 commented Aug 9, 2026

Copy link
Copy Markdown
Contributor Author

Fair verdict, and the concern was the right one — so I went and tested it under real WSL. It found a bug. Pushed a fix in 0aacacd.

What broke. node-gyp-build-optional-packages is external, so it loads from the real filesystem, so its own require resolves from the real filesystem too. It requires detect-libc, which was not on my list and therefore got bundled — present only inside app.asar. The Windows primary reads that transparently under ELECTRON_RUN_AS_NODE and resolves it fine. Plain node under WSL cannot. msgpackr-extract failed through the same chain.

Measured on Ubuntu 24.04 with Linux node v24.18.0, against the packaged tree copied out of the NSIS payload:

before:
  MISSING (cjs) msgpackr-extract [MODULE_NOT_FOUND] Cannot find module 'detect-libc'
  MISSING (cjs) node-gyp-build-optional-packages [MODULE_NOT_FOUND] Cannot find module 'detect-libc'
  PROBE-RESULT: 2 unresolved

after:
  OK   (cjs) msgpackr-extract
  OK   (cjs) ffi-rs
  OK   (cjs) node-gyp-build-optional-packages
  OK   (esm) @ff-labs/fff-node
  PROBE-RESULT: no resolution failures

t3 --version runs from that tree under Linux node in both cases.

Why the list alone was never going to be enough. The real invariant is that an external package's entire runtime dependency closure must be external. detect-libc isn't native and doesn't look special; no amount of reading the list surfaces it. So it's now a test, not a convention: it walks each runtime-external package's declared dependencies transitively and fails if any would be bundled away. It reproduces this exact failure on the old list.

Writing that test surfaced a distinction the single list had flattened, which I've now made explicit:

  • Runtime-external (native addons, their dlopen wrappers, and their closure) — Node loads these from disk, so the closure must be external.
  • Build-only external (@effect/platform-bun, @effect/sql-sqlite-bun) — external purely so the bundler never resolves bun:*. Node never loads them, so their closure genuinely doesn't need to be external. The closure test skips them deliberately.

On node-pty. It still fails to load under WSL, but that is pre-existing and unrelated: this build was produced without --wsl-prebuild, which the build itself warns about, and node_modules/node-pty/prebuilds/ contains only darwin-arm64, darwin-x64, win32-arm64, win32-x64 in both the baseline and the patched build. Identical either way, so nothing here changes it. Resolution succeeds; it's the native binary for the platform that's absent.

Cost of the fix: 6 files (1,192 → 1,198). Native binaries and installer size unchanged.

Happy to squash the two commits if you'd prefer a single one.

Comment thread scripts/lib/cli-external-packages.test.ts
The guard added in the previous commit could pass without checking anything.
It resolved manifests with `require("<name>/package.json")` from scripts/lib,
and swallowed resolution failures as "not installed on this platform".

Under pnpm isolation that catch swallowed nearly everything. Probed from
scripts/lib, every seed failed with MODULE_NOT_FOUND -- node-pty,
msgpackr-extract, ffi-rs, node-gyp-build, detect-libc, node-addon-api. Probed
from apps/server, only its direct dependencies resolved; the transitive
packages that actually caused the WSL breakage still did not. `exports` maps
are a second hole: @ff-labs/fff-node refuses the /package.json subpath with
ERR_PACKAGE_PATH_NOT_EXPORTED, which the same catch treated as absent.

Seeding the queue from the prefix strings was wrong for a second reason: the
filter dropped every prefix ending in "/", so "@yuuang/", "@ff-labs/" and
"@msgpackr-extract/" were never visited even where resolution worked.

Read the manifests off disk from the pnpm store instead. That is the same tree
asarUnpack globs target, it reaches transitive packages, and it is not subject
to resolution or exports semantics. Seeds now come from what is installed and
matches a prefix, so scoped prefixes are covered.

Added a guard test that fails unless node-pty, node-gyp-build-optional-packages
and detect-libc are actually found, because a closure check that reads nothing
is worse than no check -- it reports success.

Verified by mutation: removing detect-libc from the list fails with
"node-gyp-build-optional-packages -> detect-libc", the real bug. The previous
version of this test passed with detect-libc removed.
@tsouth89

tsouth89 commented Aug 9, 2026

Copy link
Copy Markdown
Contributor Author

Confirmed, both points. Good catch — the guard was worse than useless, because it reported success. Fixed in 45b4517.

Point 1 is worse than "can pass". I probed it rather than reasoning about it. From scripts/lib, every seed failed:

FAILS  node-pty MODULE_NOT_FOUND
FAILS  msgpackr-extract MODULE_NOT_FOUND
FAILS  ffi-rs MODULE_NOT_FOUND
FAILS  node-gyp-build MODULE_NOT_FOUND
FAILS  detect-libc MODULE_NOT_FOUND
FAILS  node-addon-api MODULE_NOT_FOUND
FAILS  @ff-labs/fff-node ERR_PACKAGE_PATH_NOT_EXPORTED

From apps/server only its direct dependencies resolve; the transitive packages that actually caused the WSL breakage still don't. And ERR_PACKAGE_PATH_NOT_EXPORTED is a second hole the same catch swallowed — an exports map can refuse the /package.json subpath even when the package is right there.

The tell I missed at the time: when the guard first ran it reported violations only from the @effect/platform-bun chain, and never node-gyp-build-optional-packages -> detect-libc — the bug it was written for. It never read that package.

Point 2 confirmed. !prefix.endsWith("/") dropped @yuuang/, @ff-labs/ and @msgpackr-extract/ entirely. Seeding a queue with prefix strings was wrong anyway — a prefix isn't a package name.

Fix. Manifests are now read off disk from the pnpm store, which is the same tree asarUnpack globs target: it reaches transitive packages and isn't subject to resolution or exports semantics. Seeds come from what's actually installed and matches a prefix, so scoped prefixes are covered.

Plus a guard test that fails unless node-pty, node-gyp-build-optional-packages and detect-libc are actually found, so a check that reads nothing can't report success again.

Verified by mutation, not assertion. Removing detect-libc from the list now fails with exactly the real bug:

these dependencies of external packages would be bundled away and fail to
resolve under WSL: node-gyp-build-optional-packages -> detect-libc

The previous version of the test passed with detect-libc removed. That's the difference.

39 tests pass across this file and build-desktop-artifact.test.ts; vp lint clean; @t3tools/server typecheck exits 0.

The closure guard walked node_modules/.pnpm and built a node_modules path under
each entry. The store also contains a regular file, lock.yaml, so that path is
rooted in a file rather than a directory.

Linux raises ENOTDIR from the access call; Windows quietly reports false. The
test therefore passed locally and failed on CI -- itself an instance of the
platform asymmetry this file exists to catch.

Existence checks now treat any failure as absence.
@ikifar2012

Copy link
Copy Markdown
Contributor

Hey @tsouth89,

Was having trouble launching this in WSL only mode ran it though an agent and found this

line 243 in apps/desktop/src/wsl/DesktopWslEnvironment.ts

needs to be updated from:

try { require.resolve("effect"); } catch (_e) { process.exit(3); }

to this

try { require.resolve("node-pty/package.json"); } catch (_e) { process.exit(3); }

Seems like the rest of the file is fine and after modification of that one line everything seems to be working as expected

The WSL health probe resolved "effect" to confirm the server's dependencies
were unpacked on the real filesystem. That premise held while the bundle
externalized its runtime deps and the whole node_modules tree was unpacked.

This branch inlines those dependencies, so "effect" no longer exists on disk.
The probe therefore exits 3 and wsl-only mode refuses to launch, reporting a
packaging regression that isn't one.

Resolve node-pty instead: it is external precisely because it cannot be
inlined, so it is a valid sentinel for the unpacked tree both before and after
this change. Verified against the packaged tree, where require.resolve("effect")
fails with MODULE_NOT_FOUND and require.resolve("node-pty/package.json")
succeeds.

Reported by @ikifar2012, who hit it running wsl-only mode from this branch.
@tsouth89

Copy link
Copy Markdown
Contributor Author

Nice find, thanks. You're right about the cause: this branch inlines the server's JS deps into the bundle, so effect isn't on disk anymore and that probe was checking for something that no longer exists. Verified against the packaged tree, require.resolve("effect") fails while require.resolve("node-pty/package.json") resolves.

Pushed your fix in 2134d96. Used node-pty since it's external precisely because it can't be inlined, so it stays a valid sentinel either way. Also updated the two comments that still described the old behaviour, and the exit-3 message downstream.

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2134d96. Configure here.

Comment thread apps/desktop/src/wsl/DesktopWslEnvironment.ts
The probe now resolves node-pty rather than "effect", but the user-facing
reason still named "effect" and described an unreadable bundled node_modules.
That points anyone hitting a packaging failure at a package this branch
deliberately inlines.

Reworded to name the native packages that actually have to be unpacked.
@tsouth89

Copy link
Copy Markdown
Contributor Author

Good catch, fixed in the latest push. Reworded it to name node-pty and the native packages that actually have to be unpacked, rather than effect.

Checked the rest of the file and the tests for other references to the old sentinel while I was in there. The only remaining mentions of effect are in the comment explaining why the sentinel changed.

@t3-code

t3-code Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

🔴 blocker: alwaysBundle: shouldBundleCliDependency in apps/server/vite.config.ts does not force dependencies for which the predicate returns false to remain external.

As a result, transitive packages including msgpackr-extract, node-gyp-build-optional-packages, and detect-libc are still inlined in the generated bundle. Their native loader then resolves from the bundle directory and silently loses native acceleration.

I suggest using neverBundle for the external dependency list and adding a test against the emitted bundle, rather than only testing the dependency list.

Verified locally at bfd60896ebc4d9e8581153f72ee42b28bb815ea5:

  • the exact head built successfully
  • 39 targeted tests passed
  • the packages above are present in dist/bin.mjs

I could not run the packaged Windows + WSL workflow on this Linux host, so this is not end-to-end WSL verification.

…artifact

`alwaysBundle` only forces packages IN. Returning false from the predicate
means "no opinion", after which the default applies: a declared dependency
stays external, a transitive one gets bundled. node-pty and @ff-labs/fff-node
are declared dependencies of apps/server, so they stayed external and the
packaging looked correct. msgpackr-extract, node-gyp-build-optional-packages
and detect-libc are transitive, and were silently inlined.

An inlined native loader resolves its prebuilds relative to the bundle, finds
nothing, and falls back to a slower pure-JS path. No crash, no error, just a
quiet loss of native acceleration.

Wire the same list to `neverBundle`, which actually marks packages external.

Every test to this point checked the dependency list rather than the bundle, so
none of them saw it. Added findInlinedExternalPackages, which scans the emitted
chunks for inlined externals, and wired it into the desktop build so a
regression fails the build. It reports the module-region count as well, so
"nothing inlined" is distinguishable from "the marker format changed and this
scan is now blind" -- the failure mode the earlier closure guard had.

Verified against the emitted bundle: msgpackr-extract is external again, and
detect-libc and node-gyp-build-optional-packages are absent from it entirely.

Reported by cursor bot.
@tsouth89

Copy link
Copy Markdown
Contributor Author

You're right on all counts. Confirmed it against the emitted bundle before changing anything: detect-libc, msgpackr-extract and node-gyp-build-optional-packages were present as full inlined //#region ../../node_modules/.pnpm/... blocks in bin.mjs.

The mechanism is that alwaysBundle is a NoExternalFn, so returning false from it means "no opinion" rather than "keep external". The default then applies, and it differs by dependency kind: node-pty and @ff-labs/fff-node are declared dependencies of apps/server so they stayed external and the packaging looked fine, while the three above are transitive and got bundled. Wired the same list to neverBundle as you suggested. Rebuilt and checked: msgpackr-extract is external again, and detect-libc and node-gyp-build-optional-packages are gone from the bundle entirely.

Also added the artifact check. findInlinedExternalPackages scans the emitted chunks for inlined externals and the desktop build now fails on one. It returns the module region count too, so "nothing inlined" is distinguishable from "the marker format changed and the scan is blind", which is the failure mode my earlier list-based test had.

Worth correcting something I said earlier in this PR: the detect-libc fix I pushed was chasing a symptom my own probe created. My probe required msgpackr-extract from disk, but the server was loading the inlined copy, so that MODULE_NOT_FOUND was never a real runtime failure. Unpacking it is correct now that msgpackr-extract is genuinely external, but the reasoning I gave for it was wrong.

On end to end: I built a Linux pty.node from source in Ubuntu 24.04, packaged an installer with --wsl-prebuild, and ran the real paths under Linux node against the extracted tree.

preflight probe:   node-pty loaded from .../prebuilds/linux-x64
msgpackr-extract:  native LOADED, resolved from
                   ~/e2e/app.asar.unpacked/node_modules/msgpackr-extract/index.js
pty spawn:         "pty-works"
server boot:       Migrations ran successfully
                   Listening on http://127.0.0.1:39225
                   0 module resolution errors

So the accelerator loads from disk rather than falling back, and the WSL backend comes up on the platform this actually matters for.

Comment thread scripts/lib/cli-external-packages.ts
…ernals

The bundle scan only asserted that external packages were absent. A build that
externalized everything would pass it: source-file regions still exist, so the
region count is non-zero and no external is inlined. That is the exact failure
this change exists to prevent, because those packages are not covered by the
unpack globs either and the WSL backend dies on ERR_MODULE_NOT_FOUND.

The scan now reports every package it saw in a region, and the build asserts
"effect" is among them. Every server module imports it, so it is inlined in any
correctly bundled build -- 209 regions in the current one -- and its absence
means the dependencies went external again.

Verified against the emitted bundle: 788 regions, no external violations,
effect inlined, 25 third-party packages inlined in total.

Reported by macroscope.
@tsouth89

Copy link
Copy Markdown
Contributor Author

Right, the check was one-directional. Fixed in 1bac125.

The scan now reports every package it found in a region, and the build asserts effect is among them. Every server module imports it, so it is inlined in any correctly bundled build, and its absence means the dependencies went external again. That is the case you described, and the old check would have passed it.

I went looking for a general "every non-external dependency from package.json is inlined" assertion first, but a few declared deps legitimately never appear as regions once tree-shaken, so it would fail on correct builds. The sentinel avoids that without weakening the guarantee much.

Verified against the emitted bundle:

regions:              788
external violations:  none
effect inlined:       yes (209 regions)
inlined packages:     25

One thing worth mentioning from checking this: ajv's codegen emits require("ajv/dist/runtime/validation_error") and require("ajv-formats/dist/formats") as generated source strings. ajv itself is inlined, so those strings would only resolve if ajv were also on disk. I could not find a path that reaches them at runtime here, and the WSL server boots clean, but if you know that ajv standalone codegen is used anywhere I would rather add it to the external list than guess.

@t3-code

t3-code Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

the neverBundle fix works at current head, and the emitted bundle is correct now.

🔴 remaining blocker: scripts/build-desktop-artifact.ts:1895-1897

using only effect as the self-contained sentinel leaves a false negative for partial externalization. i reproduced this by changing alwaysBundle to inline only effect: the validator still passes because regions exist, no native external is inlined, and effect is present, while the emitted chunks retain bare imports including yaml and @effect/platform-node/*. those packages are not covered by the unpack globs, so that artifact is not self-contained for plain node under WSL.

check emitted bare imports instead: every non-builtin bare import should match the intentional external list. a bundler metafile would also work.

verified at 1bac1254:

  • current server build passes
  • 45 targeted tests pass
  • server and scripts typechecks pass
  • current emitted bundle has 664 module regions, 25 inlined packages, effect present, and no configured external package inlined
  • all github checks are green

this is a guard/test blocker, not evidence that the current emitted bundle is broken. i still did not run the packaged windows + WSL flow.

@t3-code

t3-code Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

remaining validation problem

what is the problem?

The emitted-bundle guard at scripts/build-desktop-artifact.ts:1895-1897 treats effect as the only proof that ordinary dependencies were bundled. A partially externalized build can still inline effect while leaving other dependencies, such as yaml or @effect/platform-node/*, as bare imports. That artifact passes the current guard.

why is it a problem?

Those ordinary dependencies are not included by the narrowed asarUnpack globs. Electron on Windows may still resolve them through asar handling, but plain Node under WSL cannot read them from app.asar. The WSL backend can therefore fail with ERR_MODULE_NOT_FOUND, even though the build-time validation reported success.

I reproduced the false negative by changing alwaysBundle to inline only effect. The guard passed while the emitted chunks retained bare imports for yaml and @effect/platform-node/*.

suggested fix

Validate all bare imports in every emitted server chunk. Allow only:

  • Node built-ins, including node:*;
  • packages in the intentional external-package list.

Fail the build for every other bare import. Using the bundler metafile to inspect external modules would be even more robust if it is available. Add a regression test where effect is inlined but another ordinary dependency remains external.

Current head 1bac1254fd86e7f9bcb40a5dbf2cd90405b72a50 emits a correct bundle. This blocker is that the guard does not reliably prevent a future partial-externalization regression.

Static analysis of the emitted source kept getting this wrong. Scanning for
bare imports matched specifiers inside effect's JSDoc examples and inside ajv's
runtime codegen template; asserting that one sentinel package was inlined
passed a build that inlined `effect` and left `yaml` and @effect/platform-node
external. Both were reported as clean while the artifact was broken.

After electron-builder runs, copy the packaged app.asar.unpacked into a scratch
directory and run `node apps/server/dist/bin.mjs --version` there. Node either
resolves every eagerly imported module or it does not, which is exactly the
question, and the failure it prints is the one a WSL user would have hit. The
copy matters: the stage has a node_modules of its own further up that would
satisfy imports missing from the package. The probe refuses to run at all if a
node_modules is visible above it, and if no unpacked directory is found, rather
than reporting success it did not earn.

Verified by breaking the build on purpose: inlining only `effect` fails with
ERR_MODULE_NOT_FOUND for @effect/platform-node, and dropping neverBundle fails
listing the four inlined externals. A correct build passes.

Also adds a check for inlined packages that load native binaries, found by
asking the pnpm store what each one is rather than consulting a list. bufferutil
and utf-8-validate were being inlined from the dev store: both carry
binding.gyp and prebuilds and load through node-gyp-build, and a loader inlined
into a chunk searches for prebuilds that cannot be beside it. Neither is
declared in this repo, so neither reaches the staged install and ws falls back
to its JS paths regardless -- listing them keeps that from becoming real if
either is ever declared.

The dependency-closure test now reads optionalDependencies and peerDependencies
as well. Every native family here declares its actual platform bindings there,
so reading only `dependencies` checked nothing for exactly those packages.
@github-actions github-actions Bot removed the size:L 100-499 changed lines (additions + deletions). label Aug 12, 2026
@github-actions github-actions Bot added the size:XL 500-999 changed lines (additions + deletions). label Aug 12, 2026
@tsouth89

Copy link
Copy Markdown
Contributor Author

Replaced the static bundle checks with one that runs the artifact. After packaging, the unpacked tree is copied somewhere isolated and node apps/server/dist/bin.mjs --version runs there, so Node's resolver answers the question instead of a regex over minified source. Proved it both directions: inlining only effect fails on @effect/platform-node, dropping neverBundle fails listing the four externals, correct builds pass.

Also added a check that asks the pnpm store whether any inlined package carries a native loader, rather than trusting the list to be complete. That turned up bufferutil and utf-8-validate being inlined from the dev store. Neither is declared in this repo so neither reaches the staged install, and ws falls back to its JS paths either way, but they're listed now so it can't quietly become real.

Ran the packaged build end to end under WSL on Ubuntu 24.04 with a Linux pty.node: preflight passes, every external resolves, a pty spawns, and the server boots with no module errors.

I'm confident the packaging side is solid now.

Comment thread scripts/build-desktop-artifact.ts Outdated
// NODE_PATH would let a createRequire call inside the bundle resolve a
// missing external from outside the packaged tree, which is the whole
// thing this is trying to rule out.
env: { ...process.env, NODE_PATH: "" },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Medium — the self-check still has a global-module false negative.

NODE_PATH: "" does not disable Node's built-in global CommonJS search paths. Node still searches %USERPROFILE%\.node_modules, %USERPROFILE%\.node_libraries, and the Node installation prefix, none of which are covered by ancestorNodeModulesPaths(probeApp, ...).

I reproduced this with an otherwise isolated fixture: with NODE_PATH empty, require.resolve("t3code-selfcheck-fixture") resolved from a fake %USERPROFILE%\.node_modules; the same command with node --no-global-search-paths returned MODULE_NOT_FOUND.

Because bundled code can still reach CommonJS resolution through require/createRequire, a missing packaged dependency that happens to be installed globally can make this probe report success. Please pass --no-global-search-paths before the entry point (and keep clearing NODE_PATH) so the stated “only its unpacked dependencies present” invariant is actually enforced.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified at 6a1b459: the probe now passes --no-global-search-paths before the packaged entry point and still clears NODE_PATH. Re-running the original fake-USERPROFILE fixture now returns MODULE_NOT_FOUND, and a fresh Windows x64/NSIS artifact build completes successfully with the hardened probe. This addresses the finding.

@SunkenInTime SunkenInTime left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed current head 22731fda26c239259f29985bb4590408c17831cc, including the changes made after the previous T3 Code review.

The three existing inline threads are all genuinely addressed in the current source:

  • the pnpm-store closure test now reads real transitive manifests and covers scoped prefixes;
  • the WSL preflight/error text now uses the external node-pty sentinel;
  • neverBundle is wired for externals, and the new packaged-tree execution probe replaces the weak one-package self-containment sentinel as the decisive runtime check.

Local verification on Windows 11 x64:

  • 77/77 focused tests passed (cli-external-packages, desktop artifact, and WSL environment);
  • scripts, server, and desktop targeted typechecks exited 0;
  • release-equivalent x64/NSIS packaging with the Linux node-pty sidecar passed, including the new post-builder self-containment check;
  • installer: 145,957,915 bytes (139.196 MiB), approximately 327.152 s from stage creation to installer output;
  • unpacked packaged tree: 1,178 files / 117,575,719 bytes;
  • under Ubuntu's plain Node v24.19.0, bin.mjs --version, msgpackr-extract, ffi-rs, node-gyp-build-optional-packages, detect-libc, node-pty, and @ff-labs/fff-node all loaded from the packaged tree;
  • an isolated real server start completed migrations and listened on 127.0.0.1:43877; no MODULE_NOT_FOUND or ERR_DLOPEN_FAILED appeared.

The current emitted artifact therefore looks correct. I found one remaining guard hole and posted it inline: clearing NODE_PATH does not disable Node's %USERPROFILE%\.node_modules, .node_libraries, or install-prefix search paths, so a globally installed CommonJS dependency can still make the supposedly isolated self-check pass. Reproduced locally; --no-global-search-paths closes it: #5877 (comment)

My verdict is small fix requested, otherwise ready. This is a false-negative in the new regression check, not a failure of the current packaged runtime.

Clearing NODE_PATH does not isolate CommonJS resolution. Node still falls back
to $HOME/.node_modules, $HOME/.node_libraries and the install prefix, so a
globally installed copy of a dependency missing from the package would satisfy
the probe and the check would report success on a broken artifact.

Reproduced by putting a package in %USERPROFILE%\.node_modules: with NODE_PATH
cleared it still resolved; with --no-global-search-paths it does not.

Reported by @SunkenInTime.
@tsouth89

Copy link
Copy Markdown
Contributor Author

Confirmed and fixed in 6a1b459. Reproduced it by dropping a package into %USERPROFILE%\.node_modules:

NODE_PATH=                    -> resolved from the global folder
--no-global-search-paths      -> MODULE_NOT_FOUND

So clearing NODE_PATH was doing less than I assumed. The probe now runs with --no-global-search-paths, and the comment says why rather than just naming the flag.

Thanks for the independent packaging run as well, your unpacked file count and installer size line up with mine.

@SunkenInTime SunkenInTime left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed head 6a1b459.

The new commit addresses the remaining guard issue exactly: the packaged-tree execution probe now uses --no-global-search-paths while continuing to clear NODE_PATH. The original fake-USERPROFILE fixture now returns MODULE_NOT_FOUND, closing the global CommonJS false-success path.

Fresh Windows 11 x64 verification:

  • 77/77 focused tests passed;
  • scripts, server, and desktop targeted typechecks exited 0;
  • a fresh x64/NSIS artifact build exited 0 in 244 seconds, including the corrected post-builder self-containment probe;
  • installer: 145,957,918 bytes; SHA-256 9A11BF25D4AC6AE533EC8662D02C232CE20D5895ACA8D22DE2D4C896408E6702.

No additional actionable findings. The prior issue is fixed; this is ready to merge.

@t3-code t3-code Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

reviewed exact head 6a1b459eca06de813d2cf3b9a75c14c025a9b03b.

the previous blocker is fixed. the packaged-tree probe now runs the emitted cli through node with --no-global-search-paths and an empty NODE_PATH, so the earlier partial-externalization and global-module false positives are checked by node resolution itself rather than the weak effect sentinel.

no new actionable findings.

verified locally on linux:

  • server build passes
  • 49 focused packaging tests pass
  • server and scripts typechecks pass
  • isolated bin.mjs --version succeeds
  • emitted bundle has 660 module regions, effect inlined, and no configured external packages inlined
  • git diff --check passes
  • github checks are green

code review: approved.
merge readiness: clean and mergeable.
release readiness: i did not independently run the packaged windows + wsl flow on this linux host; the pr includes successful windows/wsl artifact evidence from other reviewers.

@t3-code t3-code Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

correction to my earlier approval at exact head 6a1b459eca06de813d2cf3b9a75c14c025a9b03b: i found a reproducible blocker in the new packaged-tree probe.

🔴 blocker: scripts/build-desktop-artifact.ts:1382

fs.copy(unpackedRoot, probeApp) uses node filesystem copy semantics that rewrite copied relative pnpm symlinks into absolute links pointing back into the original staged app.asar.unpacked tree. module resolution then starts from that original target and can walk into the staging app parent node_modules.

the ancestor guard only checks parents of probeApp, so it misses this escape. NODE_PATH="" and --no-global-search-paths do not stop normal parent lookup from the symlink target.

i reproduced this with a pnpm-shaped relative symlink: the copied probe had no ancestor node_modules, its copied symlink pointed into the source staging tree, and node exited 0 after loading a dependency present only in the staging app parent node_modules.

this can make the self-containment check pass while the installed WSL tree is missing a dependency.

suggested fix: preserve relative symlinks during the copy, dereference/materialize the copied tree, or reject any copied symlink whose resolved target remains outside probeApp. add the reproduced staging-parent leak as a regression test.

my previous approval was incorrect. code review is blocked until this is fixed.

Comment thread scripts/build-desktop-artifact.ts Outdated
@t3-code
t3-code Bot force-pushed the perf/windows-installer-file-count branch 2 times, most recently from cb0e870 to 11e8b3b Compare August 13, 2026 08:07
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
@t3-code
t3-code Bot force-pushed the perf/windows-installer-file-count branch from 11e8b3b to 4013ebd Compare August 13, 2026 08:13

@t3-code t3-code Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed and re-reviewed at exact head 4013ebd4b5732a23760711bc5a2d31ac69ab8b0f.

the isolated probe now rebases every in-tree pnpm link into the copied tree, rejects links that escape staging, and recreates directory links as windows-compatible junctions. the regression covers both relative and absolute source links.

verified: 50 focused tests, scripts typecheck, server build + cli smoke, formatting/lint, and github ci check/test/release smoke.

@UtkarshUsername

UtkarshUsername commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

I tested this branch against its merge-base commit 02f4ce5 on Windows.

WSL used to take a long time to connect. On this build the WSL backend connected in a few seconds in both dual and WSL-only mode. The app didn't get stuck on the "Connecting to WSL..." splash screen.

I also ran an A/B test vs the merge-base 02f4ce56:

metric merge-base this PR change
installer size 144.64 MB 138.75 MB -5.9 MB (-4.1%)
files installed 14,690 1,201 -13,489 (-91.8%)
install time (silent, 2 samples) 232.5s / 213.2s 116.9s / 99.9s ~2.1x faster
module load, cold (bin.mjs --version) 6.17s / 4.16s / 2.88s 4.28s / 2.74s / 2.01s -31% cold, ~-30% warm

The biggest improvement I felt was the decrease in the time it took to connect to WSL.

Now that all issues have been resolved, I think this PR is ready to merge. @juliusmarminge

@shivamhwp
shivamhwp merged commit 7e01d33 into pingdotgg:main Aug 14, 2026
18 checks passed
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 14, 2026
## What's Changed
* fix(web): simplify the desktop-managed server update banner copy by @t3dotgg in pingdotgg/t3code#6549
* fix(web): show background policy tooltips sooner by @davidhu2000 in pingdotgg/t3code#6506
* feat(desktop): add favicons to the Browser panel by @chrisdeeming in pingdotgg/t3code#5644
* fix(preview): only show browser-ready local servers by @chrisdeeming in pingdotgg/t3code#6021
* perf(build): stop unpacking node_modules wholesale from the Windows asar by @tsouth89 in pingdotgg/t3code#5877

## New Contributors
* @davidhu2000 made their first contribution in pingdotgg/t3code#6506

**Full Changelog**: pingdotgg/t3code@v0.0.34-nightly.20260814.1089...v0.0.34-nightly.20260814.1090

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.34-nightly.20260814.1090
awtprod added a commit to awtprod/t3-code that referenced this pull request Aug 16, 2026
* feat: pick worktree or current checkout per project (pingdotgg#5766)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(web): sidebar rows show the branch again, not a truncated plan step (pingdotgg#5776)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(server): vp run migrate-dev-db seeds worktree dev dbs with real data (pingdotgg#5773)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* feat(web): keep unsent drafts one click away in the sidebar (pingdotgg#5777)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* feat(web): project icons can be chosen manually (pingdotgg#5775)

* fix(server): one greedy agent process no longer takes down the whole server (pingdotgg#5788)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* ci: label-gated hosted-web preview deploys (pingdotgg#5465)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* Add cross-platform mobile usage dashboard (pingdotgg#5743)

* fix(web): preserve desktop route during Clerk auth (pingdotgg#5770)

* fix(web): match create theme and import theme buttons to the standard outline style (pingdotgg#5860)

* fix(server): favicon resolution no longer pins the event loop (pingdotgg#5538)

* fix(shared): bound the file-link label so bracket runs stop rescanning (pingdotgg#5782)

Co-authored-by: tsouth89 <tsouth89@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(web): thread title button no longer eats the drag area (pingdotgg#5857)

* fix(web): unify usage page chrome (pingdotgg#5823)

* fix(shell): add ~/.local/bin to the Windows CLI resolver so native-installed providers are found (pingdotgg#5074)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(web): match settings search shortcut styling to command palette's (pingdotgg#5841)

* fix(mobile): long-pressing a thread row no longer navigates into the thread (pingdotgg#5901)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(server): usage no longer double-counts forked Codex sessions (pingdotgg#5887)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(server): sandbox user-provided SVGs (pingdotgg#5916)

* fix(web): match usage titlebar text styling (pingdotgg#5897)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* Move project settings to contextual project routes (pingdotgg#5923)

* Preserve back navigation when opening settings (pingdotgg#5930)

Co-authored-by: codex <codex@users.noreply.github.com>

* Automate production mobile EAS releases (pingdotgg#5609)

* Add settings and usage breadcrumbs (pingdotgg#5929)

* fix(web): correct model picker trigger padding (pingdotgg#5935)

* fix(web): show worktree icon in sidebar v2 (pingdotgg#5909)

* fix(web): enable restore defaults after theme mix changes (pingdotgg#5928)

Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>

* fix(web): trait menu closes after you pick a level (pingdotgg#5879)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(web): align project name with headline (pingdotgg#5864)

* fix(web): update pills use readable theme foregrounds (pingdotgg#5938)

* fix(web): use themed confirmation dialogs (pingdotgg#5624)

* fix(web): use import/export-appropriate icons for theme buttons (pingdotgg#5964)

* fix(mobile): detect PowerShell cmdlet errors in work log rows (pingdotgg#5726)

* fix(mobile): stop Android user bubbles with code blocks from overlapping (pingdotgg#5659)

Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(mobile): parse EAS fingerprint JSON (pingdotgg#5991)

Co-authored-by: codex <codex@users.noreply.github.com>

* chore(release): prepare v0.0.33

* feat: multi-provider pull requests page with in-app reviews (pingdotgg#4849)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* perf(desktop): probe the Windows shell environment concurrently (pingdotgg#5878)

Co-authored-by: tsouth89 <tsouth89@users.noreply.github.com>

* feat(web): add duplicate action to the T3 Code default theme (pingdotgg#6013)

* fix(web): improve built-in theme contrast (pingdotgg#6000)

* fix(ci): extend release publish timeout (pingdotgg#6034)

* Allow Android tablets to rotate (pingdotgg#5613)

* fix(web): account for Windows window controls in PR page header (pingdotgg#6049)

* feat: add three-hour snooze option (pingdotgg#5914)

* fix(mobile): keep chat composer above the Android gesture bar (pingdotgg#5988)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(server): OpenCode model parsing drops models with a slash in the JSON body (pingdotgg#5072)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(web): persist sidebar shelf collapse state (pingdotgg#5136)

Co-authored-by: Illia Panasenko <hello@ipanasenko.me>

* perf(web): skip base64 for oversized image candidates (pingdotgg#5220)

* fix(server): skip Linux libc detection on Windows/macOS (pingdotgg#5354)

* fix(server): advertise 256-color TERM on Windows terminals (pingdotgg#5693)

* fix(server): handle unborn HEAD in VCS status (pingdotgg#5944)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* fix(pull-requests): route self-hosted GitLab remotes (pingdotgg#6061)

* feat: add ability to create a new thread in the current project with shift+click and show shortcut in tooltip (pingdotgg#5994)

Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>

* feat(web): add Copy Thread ID to the sidebar and chat header thread context menu (pingdotgg#5574)

Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>

* fix(mobile): stabilize thread composer and interactions (pingdotgg#5986)

Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Thuong Tin <thuongtin@gmail.com>
Co-authored-by: Kapish14 <kapishnarang01@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* Add hourly past-24-hour usage view (pingdotgg#6170)

* fix(mobile): guard App Store release versions (pingdotgg#6177)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(web): restore typography font sizes to defaults (pingdotgg#6172)

* feat(web): make environment artwork theme aware (pingdotgg#6183)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(shared): normalize a bare Windows drive root the same as C:\ / C:/ (pingdotgg#6189)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(shared): detect Azure DevOps SSH remotes (ssh.dev.azure.com) (pingdotgg#6187)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(web): add back buttons for the pull requests and usage pages in the sidebar footer (pingdotgg#6031)

Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>

* fix(web): render dropdowns above toasts (pingdotgg#6165)

Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(web): thread error banner dismiss survives reconnect and rerenders (pingdotgg#6123)

* fix(web): use a clearer pull action icon (pingdotgg#6194)

* feat(web): use OKLCH for theme palettes (pingdotgg#6036)

* fix(web): use upload icon for disabled push action (pingdotgg#6207)

* feat(web): add Open VSX theme search (pingdotgg#5654)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(web): clean up composer resize animation (pingdotgg#6209)

* feat(web): compact sidebar footer actions (pingdotgg#6210)

* fix(web): keep sidebar wordmark visible at minimum width (pingdotgg#6246)

* feat(mobile): add thread title regeneration (pingdotgg#6253)

* chore: add dara to vouched (pingdotgg#6259)

* fix(web): align the composer model picker (pingdotgg#6252)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>

* fix(mobile): keep ordered lists inside user bubbles (pingdotgg#6154)

Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>

* feat(web): a better right panel empty state (pingdotgg#6258)

* fix(web): align mobile onboarding header (pingdotgg#6293)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>

* fix(connect): preserve CLI OAuth parameters through browser sign-in (pingdotgg#6285)

* fix(web): prevent changed files header overlap (pingdotgg#6314)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>

* fix(web): theme Clerk surfaces (pingdotgg#6300)

* feat(web): reset sidebar width on double click (pingdotgg#6320)

* fix(web): align update toast release notes link (pingdotgg#6322)

Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>

* fix(web): render tooltips above dropdowns (pingdotgg#6241)

* fix(web): open modified PR clicks in browser (pingdotgg#6278)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>

* Fix mobile command popover glass rendering (pingdotgg#6370)

* test(mobile): seed snoozed showcase threads (pingdotgg#5155)

* fix(web): preserve appearance mode when changing themes (pingdotgg#6343)

* feat(connect): deregister account environments from any client (pingdotgg#4844)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* feat(web): pull request surfaces — filters & qualifiers, all-server listing, update branch, reactions, in-place editing, smarter diffs (pingdotgg#6039)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(web): cmd+click sidebar PR numbers open in the browser (pingdotgg#6378)

* feat(web): project favicon and workspace icons in command subtitles (pingdotgg#6330)

Co-authored-by: Cursor <cursoragent@cursor.com>

* web/settings: fix source control scan on relay environments (pingdotgg#6230)

* fix(web): make reset zoom hover visible (pingdotgg#6385)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>

* fix(web): keep the typed prompt when a draft changes repo (pingdotgg#6393)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(web): keep diff file lists scrollable past expanded files (pingdotgg#6423)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(server): align Codex collaboration prompts (pingdotgg#6432)

* fix(web): keep turn minimap stable as composer grows (pingdotgg#6414)

* fix(web): keep pull request panel within viewport (pingdotgg#6451)

* Add bil0000 to VOUCHED contributors list (pingdotgg#6462)

* fix: ignore pull request actions in latency tracker (pingdotgg#6476)

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>

* Remove rebase requirement before opening PR (pingdotgg#6479)

* fix(mobile): extend blockquotes across wrapped lines (pingdotgg#6482)

* fix(mobile): prevent invalid HTML entities from crashing markdown (pingdotgg#6495)

Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>

* fix(web): avoid Clerk close button overlap (pingdotgg#6442)

Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>

* fix(web): show unlinked icon when viewport aspect ratio is unlocked (pingdotgg#6509)

* fix(web): scope pull request errors to their environment (pingdotgg#6490)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(mobile): show a real settings cog in the Android sidebar header (pingdotgg#6520)

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* fix(web): restore default stage artwork colors (pingdotgg#6535)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>

* fix(web): align sidebar wordmark label (pingdotgg#6086)

* fix(web): align the snoozed thread wake icon (pingdotgg#6215)

* feat: allow disabling auto-settle on merge (pingdotgg#5880)

* Nest mobile task settings in bottom sheets (pingdotgg#6224)

Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* chore(mobile): bump app version to 1.0.4

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(web): simplify the desktop-managed server update banner copy (pingdotgg#6549)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(web): show background policy tooltips sooner (pingdotgg#6506)

* feat(desktop): add favicons to the Browser panel (pingdotgg#5644)

* fix(preview): only show browser-ready local servers (pingdotgg#6021)

* perf(build): stop unpacking node_modules wholesale from the Windows asar (pingdotgg#5877)

Co-authored-by: tsouth89 <tsouth89@users.noreply.github.com>
Co-authored-by: t3-code[bot] <t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>

* fix: avoid stale Live Activities when publishing is disabled (pingdotgg#6325)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(mobile): add breathing room between the git progress overlay and the app bar (pingdotgg#6587)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(web): keep thread rename open during IME composition (pingdotgg#6281)

* refactor(mobile): name the iOS nav bar height fallback (pingdotgg#6589)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(mobile): preserve keyboard suggestions while typing (pingdotgg#6323)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(mobile): prevent OTA update restart crashes (pingdotgg#6324)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(web): align every titlebar control cluster on one shared inset (pingdotgg#6592)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(mobile): steer active turns by default (pingdotgg#6543)

* fix(web): clarify desktop update status (pingdotgg#6504)

* fix(server): terminal subprocess polling no longer floods the PID space (pingdotgg#6377)

* fix(web): add copying terminal selection with ctrl+c in the web app (pingdotgg#5638)

* perf(desktop): speed up Windows update installation (pingdotgg#6169)

* fix(web): style sidebar action tooltips (pingdotgg#6371)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>

* refactor(web): simplify global styling (pingdotgg#6381)

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(server): handle files named HEAD in git status (pingdotgg#6397)

Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>

* feat(packaging): maintain AUR packages in-repo (pingdotgg#4128)

* fix(web): bound OKLCH gamut mapping (pingdotgg#6485)

Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>

* feat(web): open remote environments in your local editor over SSH (pingdotgg#6572)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* feat(web): refresh workspace layouts and tool activity

* revert: refresh workspace layouts and tool activity (pingdotgg#6657)

* Sync upstream with public-safe fixtures

Squash the reviewed upstream sync into a public-safe history while preserving its final tree.

* feat(web): older chat timestamps show the date, not just the time (pingdotgg#6654)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(web): align pull request action menu rows (pingdotgg#6534)

Co-authored-by: Nickolas Kyryliuk <nickolaskyryliuk@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(web): restore selected themes in dark mode (pingdotgg#6665)

* fix(web): improve Codex usage graph contrast (pingdotgg#6669)

* docs: route feature requests to Discussions

- Disable feature-request issue templates
- Direct contributors to Ideas discussions for proposals

* fix(desktop): app zoom no longer zooms the preview browser (pingdotgg#6649)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(server): keep provider notification consumers alive past startSession (pingdotgg#6538)

Co-authored-by: tsouth89 <tsouth89@users.noreply.github.com>

* fix(server): treat removed Bitbucket permissions endpoint as unknown, not blocking (pingdotgg#6525)

* fix(ssh): let cold remote servers finish starting (pingdotgg#6168)

* fix(web): preserve Claude insight line breaks (pingdotgg#4344)

* feat(web): accept file drops across the chat workspace (pingdotgg#6636)

* fix(web): widen ordered-list marker gutter for 3+ digit item numbers (pingdotgg#6527)

* fix(server): bound thread activity hydration (pingdotgg#6153)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* fix(web): restore the Archive action in the default sidebar thread menu (pingdotgg#6526)

* fix(web): open diff files from nested projects (pingdotgg#6174)

* fix(mobile): use tryOpenExternalUrl for markdown links in ThreadFeed (pingdotgg#5872)

Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(web): open the file a bare filename reference names (pingdotgg#6297)

Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(server): stop the provider title mirror from overwriting real thread titles (pingdotgg#5941)

* fix(shared): match source-control providers by DNS label (pingdotgg#6175)

* feat(desktop): Chrome-style hold-to-quit (pingdotgg#5508)

* fix(gitlab): submit review comments on context lines (pingdotgg#6348)

* fix(marketing): keep Grok mark clear of mobile hero copy (pingdotgg#4542)

* fix(mobile): recover the QR pairing scanner when camera access is denied (pingdotgg#6487)

* fix(web): keep a long path from running under the folder picker button (pingdotgg#4823)

Co-authored-by: Sy-D <8460326+Sy-D@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(terminal): right-click paste works in the terminal (pingdotgg#5240)

* fix(mobile): explain iOS-only settings on Android (pingdotgg#4981)

* fix(web): stop counting a workflow coordinator as a working agent (pingdotgg#6672)

* fix(web): keep floating preview anchored after panel closes (pingdotgg#6547)

* fix(web): unstick /connect after in-modal sign-in by redirecting to the authorize endpoint (pingdotgg#5133)

* fix(web): keep send reachable while a turn is running on mobile (pingdotgg#4781)

Co-authored-by: AMohamedAakhil <hello@takaitech.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(web): reject unsupported composer image types at attach time (pingdotgg#6574)

* Make ClaudeTextGeneration tests hermetic on Windows (pingdotgg#4508)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(web): show command output in work log (pingdotgg#4083)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(web): reserve sibling column width when resizing the right panel (pingdotgg#6279)

* fix(web): replace whitespace in new ref names with dashes (pingdotgg#6270)

* fix(client-runtime): branch list no longer resets while paging through refs (pingdotgg#5858)

* fix(web): support Shift+Insert terminal paste (pingdotgg#5982)

* fix(web): keep the composer glass aligned with the context strip at any interface font size (pingdotgg#5703)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(codex): keep background memory out of chats (pingdotgg#5468)

* fix(server): treat a missing Codex rollout as a recoverable resume error (pingdotgg#6671)

* fix(web): hide provider Update toast action while an update is running (pingdotgg#6544)

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(desktop): agent shells inherit a UTF-8 locale on macOS (pingdotgg#6236)

* fix(server): ignore Claude command lifecycle messages (pingdotgg#6606)

* docs: mention Bitbucket user read scope needed by auth probe (pingdotgg#6291)

Co-authored-by: Gerwin Bisschop <gerwin@regeljelease.nl>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(server): return valid preview action results (pingdotgg#5966)

Co-authored-by: duncan-vc <247855047+duncan-vc@users.noreply.github.com>

* fix(claude): make "Always allow for session" stick, and only for the session (pingdotgg#5041)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(ssh): surface a failed remote t3 install instead of a silent 0-byte server.log (pingdotgg#5132)

* perf(server): persist the wire projection for streaming tool.updated data (pingdotgg#6675)

Co-authored-by: mInrOz <14320143+mInrOz@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(web): stop wrapping partial code block selections in markdown fences (pingdotgg#5069)

* fix(web): hide T3 Connect toggle in web app settings (pingdotgg#5068)

* fix(web): show provider account accent badge in sidebar rows and hover card (pingdotgg#5980)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(server): wait for concurrent SQLite writers instead of failing with SQLITE_BUSY (pingdotgg#5134)

* fix(web): reject oversized prompts before provider turn start (pingdotgg#6602)

* feat(web): collapse the question prompt from its header (pingdotgg#6773)

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* fix(shared): degrade an unknown system time zone to UTC in usage windows (pingdotgg#6670)

* fix(claude): discover repo-local .agents/skills in skill discovery (pingdotgg#5488)

* fix(server): let slow provider CLIs raise their discovery probe budget (pingdotgg#6223)

Co-authored-by: Julius Marminge <jmarminge@gmail.com>

* fix(web): retain terminal PR badges after checkout switch (pingdotgg#4755)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(web): show selected model in context window tooltip (pingdotgg#4772)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(web): scale command details with code font (pingdotgg#6510)

* fix(web): preserve XML-like tags in user messages (pingdotgg#4133)

Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(desktop): route mouse thumb buttons to the in-app browser (pingdotgg#4459)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* fix(web): keep the final segment of directory paths with a trailing separator (pingdotgg#5460)

Co-authored-by: jorvarea <jorvarea@users.noreply.github.com>

* Keep block code plain when copying from rendered markdown (pingdotgg#4468)

* fix(web): add web app manifest so installed app keeps its scope (pingdotgg#4306)

* Skip user hooks during Claude capability probes (pingdotgg#4466)

* fix(mobile): use Android monospace font family (pingdotgg#4609)

* fix(desktop): timestamps follow the OS locale instead of en-US (pingdotgg#6190)

* fix(web): keep multi-select questions open after the first click (pingdotgg#6646)

* fix(web): stop clipping the changed-files expand hover on Windows (pingdotgg#6545)

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(server): allow long-running git pushes (pingdotgg#6499)

* fix(desktop): keep probing backend readiness while the process is alive (pingdotgg#5526)

* fix(server): allow install scripts in npm-global provider updates (pingdotgg#5646)

* fix: detect SSH remotes with non-git user prefixes (e.g. gitlab@) (pingdotgg#3649)

* fix(web): describe what Ultracode does in the Reasoning picker (pingdotgg#6092)

* fix(server): settle pending user-input requests when a Claude session stops (pingdotgg#5127)

Co-authored-by: Capxul Agent <agent@capxul.dev>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(server): stop replaying a command receipt for a different aggregate (pingdotgg#5246)

* fix(server): settle snoozed threads immediately (pingdotgg#5379)

* fix(mobile): prevent crash on sign out in settings (pingdotgg#4899)

* fix(mobile): local-checkout threads record their branch so PR badges show (pingdotgg#4986)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(web): contain long approval commands (pingdotgg#6503)

* feat(web): make right panel maximize bindable (pingdotgg#5091)

* fix(server): respect inherited OPENCODE_CONFIG_CONTENT (pingdotgg#4242)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(marketing): detect Mac chip on homepage download button (pingdotgg#4197)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* Keep the server alive when a response write hits a dead socket (pingdotgg#4470)

* Limit physical key fallback to non-Latin layout output (pingdotgg#4469)

* fix: restore CLAUDE.md symlink target (pingdotgg#3929)

* fix(clients): default clone destination to folder plus repo name (pingdotgg#5989)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(web): keep timestamp date and time in the same locale (pingdotgg#7081)

Co-authored-by: codex <codex@users.noreply.github.com>

* feat(desktop): add signal macOS DMG installer background (pingdotgg#6201)

Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* feat(web): send PR line requests to agent (pingdotgg#6597)

* fix(web): restore dark theme palette (pingdotgg#6663)

Co-authored-by: maria <maria@kuuro.net>

* refactor(web): simplify advanced theme controls (pingdotgg#7107)

* fix(web): keep highlighted command menu items clear of the scroll fade (pingdotgg#7132)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* test: remove redundant and stale tests (pingdotgg#6267)

* fix: repair typecheck errors left by the upstream/main merge

Fixes surfaced by a full repo-wide typecheck after merging upstream/main
and origin/main into sync-upstream-continue:

- apps/web/src/components/SidebarV2.tsx: add missing isRunning field
- apps/web/src/components/settings/BetaSettingsPanel.tsx: replace removed
  useSidebarV2Enabled hook with useClientSettings selector
- apps/web/src/components/settings/SettingsFontPreviews.tsx: drop obsolete
  onCopy callback (GhosttyTerminalSurface now handles copy natively)
- apps/mobile/src/lib/threadActivity.ts: remove duplicate
  MOBILE_TERMINAL_UPDATE_STATUSES/isTerminalBypassUpdate/isAgentInternalActivity
  block left by a silent (non-conflict-marked) merge duplication
- apps/mobile/src/features/threads/ThreadComposer.tsx: remove duplicate
  handleEfficiencyMenuAction, same cause
- apps/mobile/src/features/threads/ThreadDetailScreen.tsx: stop passing
  activeThreadBusy to ThreadComposer, which no longer accepts it
- apps/mobile/src/features/home/HomeScreen.tsx: remove dead
  shouldShowConnectionStatus/WorkspaceConnectionStatus/connectionStatus
  references (connection state now surfaces via the header title slot)
- apps/mobile/src/features/home/HomeRouteScreen.tsx: fix settings-sheet
  navigation params, drop the now-removed onOpenEnvironments prop
- apps/mobile/src/features/settings/SettingsUsageRouteScreen.tsx: use the
  fork's UsageQuerySummary/UsageQueryTokenTotals types instead of upstream's
  UsageSummary/UsageTokenTotals, matching what the usage RPC actually returns
- packages/contracts/src/ipc.ts: drop DesktopBridge.confirm, superseded by
  LocalApi.dialogs.confirm; every desktop-side implementation had already
  dropped it independently
- apps/desktop/src/window/DesktopApplicationMenu.test.ts: drop the
  now-invalid confirm mock to match
- apps/desktop/src/preview/Manager.ts: remove a duplicate
  FrameCaptureConsumer/FrameCaptureSession/PictureInPictureSession block
- apps/server/src/environment/RemoteOpenTargets.ts: fix service tag to the
  fork's @awtprod/command-center/... convention
- apps/server/src/persistence/Layers/ProjectionThreads.ts: restore the
  upsertProjectionThreadRow query, which a conflict resolution had mangled
  into an invalid mix of INSERT and SELECT clauses
- apps/mobile/package.json, patches/@legendapp__list@3.3.3.patch: fix
  @legendapp/list version pin and repair a patch file left with unresolved
  nested conflict markers from a rename/rename conflict

Full repo-wide `vp run -r typecheck` now passes clean across all 16
workspace packages.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix: repair pre-existing SQL and test bugs surfaced by running the full suite

- apps/server/src/orchestration/Layers/ProjectionSnapshotQuery.ts: three
  activity-listing queries selected correlated_message_id in their outer
  SELECT but never in the inner bounded subquery (two cases) or not at all
  (listPinnedThreadActivityRowsByThread), causing "no such column" SQL
  errors and schema decode failures. Pre-existing in HEAD before this
  merge, just never exercised until the full test suite ran clean of
  conflict markers.
- packages/contracts/src/settings.test.ts: removed a test asserting that
  decoding drops the sidebarV2Enabled/sidebarV2ConfiguredByUser keys —
  contradicted the adjacent "ClientSettings sidebar v2" tests and the
  real schema, which keeps both fields alive alongside legacySidebarEnabled
  for BetaSettingsPanel.tsx.
- packages/contracts/src/settings.ts: fixed the legacySidebarEnabled
  comment to describe the fields as coexisting, not superseding.
- apps/web/src/browserFaviconStore.test.ts, browserHistoryStore.test.ts:
  switched their `~/state/session` mocks to importOriginal() + override,
  so the real environmentSession export (now used transitively via
  state/server.ts) stays available instead of being dropped entirely.

Full repo-wide `vp run -r test` passes (aside from two known-flaky
poll-based tests that pass in isolation but time out under full
concurrent load, unrelated to this merge).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(server): update stale npm-global test expectation for --allow-scripts

Upstream added the --allow-scripts=<package> flag to npm-global provider
update commands; this test's expectation was the only one in the file
that hadn't been updated to match (the other three assertions in the same
file already expect the flag).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* test(server): skip a deadlocking git-push timeout test pending investigation

"allows pushes to run longer than the default command timeout" hangs until
the test timeout regardless of how long that timeout is (confirmed at both
120s and 180s), merged verbatim from upstream commit 86fb47a and
untouched by any conflict resolution in this sync. Needs its own look at
how pushCurrentBranch's command-timeout override interacts with TestClock;
skipping for now so it doesn't block the suite.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix: keep usage dashboard current (#25)

Co-authored-by: atryan <atryan@users.noreply.github.com>

* fix(web): keep usage totals current by default (#26)

Co-authored-by: atryan <atryan@users.noreply.github.com>

* feat(desktop): run local threads without leaving a remote primary (#27)

* fix(web): switch new threads between connected computers

* feat(desktop): keep Windows available with a remote primary

* docs: explain local execution with a remote primary

---------

Co-authored-by: atryan <atryan@users.noreply.github.com>

* fix(web): open usage on the past 24 hours (#28)

* fix(web): open usage on the past 24 hours

* fix(server): resolve native Codex npm runtimes

---------

Co-authored-by: atryan <atryan@users.noreply.github.com>

* fix(desktop): stop remote-primary mode from launching a local backend (#30)

Co-authored-by: atryan <atryan@users.noreply.github.com>

* fix(web): keep visible usage dashboards current (#31)

Co-authored-by: atryan <atryan@users.noreply.github.com>

* Fix/codex isolation missing auth (#32)

* fix(web): open usage on the past 24 hours

* fix(server): resolve native Codex npm runtimes

* fix(desktop): stop remote-primary mode from launching a local backend

* fix(server): bypass identity wrapper for isolated Codex

* fix(server): accept enforced Codex read denials

* fix(server): stop isolation probe from scanning host processes

* fix(server): fail closed when Codex isolation finds no credentials

`prepareCommandCenterCodexHome` only copied `auth.json` into the isolated
home when the source home had one, and never checked the result. A source
home without credentials produced a working session that failed on its
first model call with an opaque provider 401 naming neither the missing
file nor the home Command Center actually read.

Require credentials in the isolated home before returning the layout, and
name the resolved source path in the error.

Seed `auth.json` in the fixtures that relied on the previous fail-open
behavior; they cover home layout and profile injection, not auth.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(server): surface Codex sandbox permission requests

Codex 0.147 asks to widen its sandbox with
`item/permissions/requestApproval`. No handler was registered, so the
request fell through to `handleUnknownServerRequest` and was answered
with a JSON-RPC "method not found". Codex reports that as
`user rejected MCP tool call`, so the turn failed with an approval the
user was never shown and could not answer.

Register the handler and map the method through to a real approval
prompt. The request carries an arbitrary path list (each read/write/deny)
plus a network toggle, so the decision is classified on the requested
permissions rather than on the tool that triggered them — a read-only
tool can still ask for write.

`autoApproveReadOnlyPermissions` (off by default) grants an escalation
without prompting only when every entry is a read: any write, sandbox
denial, legacy write list, or network enable still prompts. Auto-grants
are scoped to the turn, never the session.

The approval channel carries only accept/decline, so the granted profile
is the requested one echoed back on accept and an empty profile on
refusal, mirroring how ClaudeAdapter replays SDK permission suggestions.

Requests are surfaced with the `file-change` kind: ingestion derives the
kind from the canonical request type alone, and a kind that varied per
request would disagree between the opened and resolved activities. A
request with no kind renders no prompt in web or mobile while the server
still opens a pending row, which parks the thread unanswerable.

The persisted activity keeps only `detail`, so the requested paths are
folded into it — otherwise the prompt cannot be reviewed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: atryan <atryan@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* style(web): wrap an over-long condition in useLiveRefresh (#34)

`vp check` fails on sync-upstream because this line exceeds the print width,
which blocks CI for every PR targeting the branch. Formatter-only change: the
condition is re-wrapped, with no behaviour difference.

Co-authored-by: atryan <atryan@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(dev): stop a stray system `vp` from silently killing dev servers (#33)

dev-runner spawns `vp` by bare name with `extendEnv: false`, so resolution
depended entirely on the PATH it inherited. When node_modules/.bin was absent
from that PATH, an unrelated /usr/bin/vp (atfs/ShapeTools) won the lookup and
failed in the worst possible way: it printed `basename: unrecognized option
'--filter=...'`, started no dev server, and exited 0. The launcher reported
success while the stack was already gone.

Pin the repo's node_modules/.bin ahead of the inherited PATH so `vp` always
means this repo's toolchain, whatever environment we were launched from.

Co-authored-by: atryan <atryan@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(web): drop stale ComposerPrimaryActions.test.ts duplicate

The upstream sync left both .ts and .tsx test files for the same
component; they collide on case-insensitive filesystems (Windows/macOS
CI) and release-smoke's path-collision check fails the build. The .tsx
version is upstream's current file and is a strict superset of the
stale fork-only .ts copy.

---------

Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Robert Soriano <sorianorobertc@gmail.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Matt Urenovich <murenovich@gmail.com>
Co-authored-by: Tyler <tyler@southboundsoftware.com>
Co-authored-by: tsouth89 <tsouth89@users.noreply.github.com>
Co-authored-by: nathangerday <44236114+nathangerday@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Arham Amin <132888838+arhxam@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Ellie Gummere <hello@unknownhost.name>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Carter Smith <51297686+carterwsmith@users.noreply.github.com>
Co-authored-by: Chris Deeming <chris@xenforo.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Mina Yacoub <56601613+myacoub91@users.noreply.github.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Jono Kemball <Noojuno@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Taras <Taras.Fomin@gmail.com>
Co-authored-by: bkntr <888122+bkntr@users.noreply.github.com>
Co-authored-by: yassiEmp <158713173+yassiEmp@users.noreply.github.com>
Co-authored-by: Guilherme Vieira <46866023+GuilhermeVieiraDev@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Thuong Tin <thuongtin@gmail.com>
Co-authored-by: Kapish14 <kapishnarang01@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Dominic Roy <dominic@goauthentik.io>
Co-authored-by: Dominic Roy <dominic@sdko.org>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Adamulek123 <adam.bogucki@piekna.edu.pl>
Co-authored-by: Paul van Dyk <paul@vandyk.fr>
Co-authored-by: Taylor Bombay <taylor@warheadent.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: David Hu <davidhu314@gmail.com>
Co-authored-by: t3-code[bot] <t3-code[bot]@users.noreply.github.com>
Co-authored-by: Michael Charles Aubrey <aubrey@michaelcharl.es>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: atryan <atryan@users.noreply.github.com>
Co-authored-by: Nickolas Kyryliuk <nickolaskyryliuk@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: David Balderston <dbalders@gmail.com>
Co-authored-by: mohamedmastouri-hue <mohamed.mastouri@ensi-uma.tn>
Co-authored-by: Ulises Britos <45952970+repparw@users.noreply.github.com>
Co-authored-by: Nicolas Layne <49288482+NicL9923@users.noreply.github.com>
Co-authored-by: JJ <93147993+hey-jj@users.noreply.github.com>
Co-authored-by: Simon Doba <simon.doba@hotmail.de>
Co-authored-by: Sy-D <8460326+Sy-D@users.noreply.github.com>
Co-authored-by: Daniel Vernon <danpvernon@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Akshar Patel <123344143+AksharP5@users.noreply.github.com>
Co-authored-by: Torben Wetter <github@torben.id>
Co-authored-by: BootesVoid <78485654+AMohamedAakhil@users.noreply.github.com>
Co-authored-by: AMohamedAakhil <hello@takaitech.com>
Co-authored-by: mohammed shazeb <mohammedshazeb10@gmail.com>
Co-authored-by: Mihnea Peteu <mihneanob@gmail.com>
Co-authored-by: LikoKiko Tech <145937091+LikoKiko@users.noreply.github.com>
Co-authored-by: Vividh Mahajan <82711162+Lasdw6@users.noreply.github.com>
Co-authored-by: Jorge Pineda <jorgepineda0310@gmail.com>
Co-authored-by: abhwshek <67309069+a20hek@users.noreply.github.com>
Co-authored-by: aoright <102943475+aoright@users.noreply.github.com>
Co-authored-by: Williawar <28518115+Williawar@users.noreply.github.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: Linus Boehm <linus.boehm@finto.de>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Gerwin <9853101+thamrx@users.noreply.github.com>
Co-authored-by: Gerwin Bisschop <gerwin@regeljelease.nl>
Co-authored-by: duncan-vc <duncan@ommsocial.co.za>
Co-authored-by: duncan-vc <247855047+duncan-vc@users.noreply.github.com>
Co-authored-by: Joaquin Navarro <alfian1991@gmail.com>
Co-authored-by: Martin Bergo <martin.n.bergo@gmail.com>
Co-authored-by: mInrOz <14320143+mInrOz@users.noreply.github.com>
Co-authored-by: Tai Nguyen <87302343+JoeJoeflyn@users.noreply.github.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ostap <33957189+ostapondo@users.noreply.github.com>
Co-authored-by: Jaroslav Brtis <6890442+Jardo-51@users.noreply.github.com>
Co-authored-by: Roshan Mhatre <officialroshanm@gmail.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: sebbonit <36650750+sebbonit@users.noreply.github.com>
Co-authored-by: nqrwhal <81386789+nqrwhal@users.noreply.github.com>
Co-authored-by: CursedApple <36764254+Serendeep@users.noreply.github.com>
Co-authored-by: John Surles <outsightszs@Outlook.com>
Co-authored-by: Akos Balogh <hello.akosb@gmail.com>
Co-authored-by: jorvarea <47249803+jorvarea@users.noreply.github.com>
Co-authored-by: jorvarea <jorvarea@users.noreply.github.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Alex Brodsky <122503996+Albro3459@users.noreply.github.com>
Co-authored-by: Harshith Goka <harshith9399@gmail.com>
Co-authored-by: Paul <paul@brzz.dev>
Co-authored-by: RaitP1 <150583432+RaitP1@users.noreply.github.com>
Co-authored-by: Dev Talan <chaudhary.dev.talan@gmail.com>
Co-authored-by: Luis Gustavo Couto Wacker <luis.wacker@pagar.me>
Co-authored-by: JackatDJL <71508487+JackatDJL@users.noreply.github.com>
Co-authored-by: delltrak <78751023+delltrak@users.noreply.github.com>
Co-authored-by: Aaron Abu Usama <50079365+AaronAbuUsama@users.noreply.github.com>
Co-authored-by: Capxul Agent <agent@capxul.dev>
Co-authored-by: Kevin Bravo <79945749+0bkevin@users.noreply.github.com>
Co-authored-by: shubhu <93861282+shubhu121@users.noreply.github.com>
Co-authored-by: Zeus-Deus <100132710+Zeus-Deus@users.noreply.github.com>
Co-authored-by: El-Hussein Abdelraouf <hussein@raoufs.me>
Co-authored-by: Jono <jono@foodnotblogs.com>
Co-authored-by: Mahdi Ben Messaoud <mahdibenmassoud98@gmail.com>
Co-authored-by: Ngo Quoc Viet <123613986+NgoQuocViet2001@users.noreply.github.com>
Co-authored-by: Inaya Yousfi <zied.essaber@gmail.com>
Co-authored-by: Eddy Naboulet <93473191+eddy-naboulet@users.noreply.github.com>
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
…sar (pingdotgg#5877)

Co-authored-by: tsouth89 <tsouth89@users.noreply.github.com>
Co-authored-by: t3-code[bot] <t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 26, 2026
## What's Changed
* feat: multi-provider pull requests page with in-app reviews by @Bil0000 in https://github.com/pingdotgg/t3code/pull/4849
* perf(desktop): probe the Windows shell environment concurrently by @tsouth89 in https://github.com/pingdotgg/t3code/pull/5878
* feat(web): add duplicate action to the T3 Code default theme by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/6013
* fix(web): improve built-in theme contrast by @chrisdeeming in https://github.com/pingdotgg/t3code/pull/6000
* fix(ci): extend release publish timeout by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6034
* Allow Android tablets to rotate by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/5613
* fix(web): account for Windows window controls in PR page header by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/6049
* feat: add three-hour snooze option by @Noojuno in https://github.com/pingdotgg/t3code/pull/5914
* fix(mobile): keep chat composer above the Android gesture bar by @PollyGlot in https://github.com/pingdotgg/t3code/pull/5988
* fix(server): OpenCode model parsing drops models with a slash in the JSON body by @arhxam in https://github.com/pingdotgg/t3code/pull/5072
* fix(web): persist sidebar shelf collapse state by @PixPMusic in https://github.com/pingdotgg/t3code/pull/5136
* perf(web): skip base64 for oversized image candidates by @tarik02 in https://github.com/pingdotgg/t3code/pull/5220
* fix(server): skip Linux libc detection on Windows/macOS by @bkntr in https://github.com/pingdotgg/t3code/pull/5354
* fix(server): advertise 256-color TERM on Windows terminals by @yassiEmp in https://github.com/pingdotgg/t3code/pull/5693
* fix(server): handle unborn HEAD in VCS status by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/5944
* fix(pull-requests): route self-hosted GitLab remotes by @GuilhermeVieiraDev in https://github.com/pingdotgg/t3code/pull/6061
* feat: add ability to create a new thread in the current project with shift+click and show shortcut in tooltip by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/5994
* feat(web): add Copy Thread ID to the sidebar and chat header thread context menu by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/5574
* fix(mobile): stabilize thread composer and interactions by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/5986
* Add hourly past-24-hour usage view by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/6170
* fix(mobile): guard App Store release versions by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/6177
* fix(web): restore typography font sizes to defaults by @StiensWout in https://github.com/pingdotgg/t3code/pull/6172
* feat(web): make environment artwork theme aware by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/6183
* fix(shared): normalize a bare Windows drive root the same as C:\ / C:/ by @arhxam in https://github.com/pingdotgg/t3code/pull/6189
* fix(shared): detect Azure DevOps SSH remotes (ssh.dev.azure.com) by @arhxam in https://github.com/pingdotgg/t3code/pull/6187
* feat(web): add back buttons for the pull requests and usage pages in the sidebar footer by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/6031
* fix(web): render dropdowns above toasts by @Brechard in https://github.com/pingdotgg/t3code/pull/6165
* fix(web): thread error banner dismiss survives reconnect and rerenders by @myacoub91 in https://github.com/pingdotgg/t3code/pull/6123
* fix(web): use a clearer pull action icon by @extoci in https://github.com/pingdotgg/t3code/pull/6194
* feat(web): use OKLCH for theme palettes by @StiensWout in https://github.com/pingdotgg/t3code/pull/6036
* fix(web): use upload icon for disabled push action by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6207
* feat(web): add Open VSX theme search by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/5654
* fix(web): clean up composer resize animation by @extoci in https://github.com/pingdotgg/t3code/pull/6209
* feat(web): compact sidebar footer actions by @maria-rcks in https://github.com/pingdotgg/t3code/pull/6210
* fix(web): keep sidebar wordmark visible at minimum width by @extoci in https://github.com/pingdotgg/t3code/pull/6246
* feat(mobile): add thread title regeneration by @chrisdeeming in https://github.com/pingdotgg/t3code/pull/6253
* chore: add dara to vouched by @maria-rcks in https://github.com/pingdotgg/t3code/pull/6259
* fix(web): align the composer model picker by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6252
* fix(mobile): keep ordered lists inside user bubbles by @none23 in https://github.com/pingdotgg/t3code/pull/6154
* feat(web): a better right panel empty state by @StiensWout in https://github.com/pingdotgg/t3code/pull/6258
* fix(web): align mobile onboarding header by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6293
* fix(connect): preserve CLI OAuth parameters through browser sign-in by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/6285
* fix(web): prevent changed files header overlap by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6314
* fix(web): theme Clerk surfaces by @StiensWout in https://github.com/pingdotgg/t3code/pull/6300
* feat(web): reset sidebar width on double click by @extoci in https://github.com/pingdotgg/t3code/pull/6320
* fix(web): align update toast release notes link by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6322
* fix(web): render tooltips above dropdowns by @extoci in https://github.com/pingdotgg/t3code/pull/6241
* fix(web): open modified PR clicks in browser by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6278
* Fix mobile command popover glass rendering by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/6370
* test(mobile): seed snoozed showcase threads by @PixPMusic in https://github.com/pingdotgg/t3code/pull/5155
* fix(web): preserve appearance mode when changing themes by @extoci in https://github.com/pingdotgg/t3code/pull/6343
* feat(connect): deregister account environments from any client by @StiensWout in https://github.com/pingdotgg/t3code/pull/4844
* feat(web): pull request surfaces — filters & qualifiers, all-server listing, update branch, reactions, in-place editing, smarter diffs by @Bil0000 in https://github.com/pingdotgg/t3code/pull/6039
* fix(web): cmd+click sidebar PR numbers open in the browser by @t3dotgg in https://github.com/pingdotgg/t3code/pull/6378
* feat(web): project favicon and workspace icons in command subtitles by @gsimone in https://github.com/pingdotgg/t3code/pull/6330
* web/settings: fix source control scan on relay environments by @dominic-r in https://github.com/pingdotgg/t3code/pull/6230
* fix(web): make reset zoom hover visible by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6385
* fix(web): keep the typed prompt when a draft changes repo by @t3dotgg in https://github.com/pingdotgg/t3code/pull/6393
* fix(web): keep diff file lists scrollable past expanded files by @dominic-r in https://github.com/pingdotgg/t3code/pull/6423
* fix(server): align Codex collaboration prompts by @none23 in https://github.com/pingdotgg/t3code/pull/6432
* fix(web): keep turn minimap stable as composer grows by @extoci in https://github.com/pingdotgg/t3code/pull/6414
* fix(web): keep pull request panel within viewport by @Bil0000 in https://github.com/pingdotgg/t3code/pull/6451
* Add bil0000 to VOUCHED contributors list by @maria-rcks in https://github.com/pingdotgg/t3code/pull/6462
* fix: ignore pull request actions in latency tracker by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6476
* Remove rebase requirement before opening PR by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/6479
* fix(mobile): extend blockquotes across wrapped lines by @chrisdeeming in https://github.com/pingdotgg/t3code/pull/6482
* fix(mobile): prevent invalid HTML entities from crashing markdown by @Lucenx9 in https://github.com/pingdotgg/t3code/pull/6495
* fix(web): avoid Clerk close button overlap by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6442
* fix(web): show unlinked icon when viewport aspect ratio is unlocked by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/6509
* fix(web): scope pull request errors to their environment by @Adamulek123 in https://github.com/pingdotgg/t3code/pull/6490
* fix(mobile): show a real settings cog in the Android sidebar header by @paul-vd in https://github.com/pingdotgg/t3code/pull/6520
* fix(web): restore default stage artwork colors by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6535
* fix(web): align sidebar wordmark label by @WarheadTaylor in https://github.com/pingdotgg/t3code/pull/6086
* fix(web): align the snoozed thread wake icon by @RakshithBhat03 in https://github.com/pingdotgg/t3code/pull/6215
* feat: allow disabling auto-settle on merge by @t3dotgg in https://github.com/pingdotgg/t3code/pull/5880
* Nest mobile task settings in bottom sheets by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/6224
* fix(web): simplify the desktop-managed server update banner copy by @t3dotgg in https://github.com/pingdotgg/t3code/pull/6549
* fix(web): show background policy tooltips sooner by @davidhu2000 in https://github.com/pingdotgg/t3code/pull/6506
* feat(desktop): add favicons to the Browser panel by @chrisdeeming in https://github.com/pingdotgg/t3code/pull/5644
* fix(preview): only show browser-ready local servers by @chrisdeeming in https://github.com/pingdotgg/t3code/pull/6021
* perf(build): stop unpacking node_modules wholesale from the Windows asar by @tsouth89 in https://github.com/pingdotgg/t3code/pull/5877
* fix: avoid stale Live Activities when publishing is disabled by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/6325
* fix(mobile): add breathing room between the git progress overlay and the app bar by @PollyGlot in https://github.com/pingdotgg/t3code/pull/6587
* fix(web): keep thread rename open during IME composition by @MichaelCharles in https://github.com/pingdotgg/t3code/pull/6281
* refactor(mobile): name the iOS nav bar height fallback by @PollyGlot in https://github.com/pingdotgg/t3code/pull/6589
* fix(mobile): preserve keyboard suggestions while typing by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/6323
* fix(mobile): prevent OTA update restart crashes by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/6324
* fix(web): align every titlebar control cluster on one shared inset by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/6592
* fix(mobile): steer active turns by default by @chrisdeeming in https://github.com/pingdotgg/t3code/pull/6543
* fix(web): clarify desktop update status by @StiensWout in https://github.com/pingdotgg/t3code/pull/6504
* fix(server): terminal subprocess polling no longer floods the PID space by @SunkenInTime in https://github.com/pingdotgg/t3code/pull/6377
* fix(web): add copying terminal selection with ctrl+c in the web app by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/5638
* perf(desktop): speed up Windows update installation by @StiensWout in https://github.com/pingdotgg/t3code/pull/6169
* fix(web): style sidebar action tooltips by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6371
* refactor(web): simplify global styling by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6381
* fix(server): handle files named HEAD in git status by @Lucenx9 in https://github.com/pingdotgg/t3code/pull/6397
* feat(packaging): maintain AUR packages in-repo by @maria-rcks in https://github.com/pingdotgg/t3code/pull/4128
* fix(web): bound OKLCH gamut mapping by @Lucenx9 in https://github.com/pingdotgg/t3code/pull/6485
* feat(web): open remote environments in your local editor over SSH by @t3dotgg in https://github.com/pingdotgg/t3code/pull/6572
* feat(web): refresh workspace layouts and tool activity by @maria-rcks in https://github.com/pingdotgg/t3code/pull/6275
* revert: refresh workspace layouts and tool activity by @maria-rcks in https://github.com/pingdotgg/t3code/pull/6657
* feat(web): older chat timestamps show the date, not just the time by @t3dotgg in https://github.com/pingdotgg/t3code/pull/6654
* fix(web): align pull request action menu rows by @Bil0000 in https://github.com/pingdotgg/t3code/pull/6534
* fix(web): restore selected themes in dark mode by @StiensWout in https://github.com/pingdotgg/t3code/pull/6665
* fix(web): improve Codex usage graph contrast by @StiensWout in https://github.com/pingdotgg/t3code/pull/6669
* fix(desktop): app zoom no longer zooms the preview browser by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/6649
* fix(server): keep provider notification consumers alive past startSession by @tsouth89 in https://github.com/pingdotgg/t3code/pull/6538
* fix(server): treat removed Bitbucket permissions endpoint as unknown, not blocking by @lnieuwenhuis in https://github.com/pingdotgg/t3code/pull/6525
* fix(ssh): let cold remote servers finish starting by @gbarros-dev in https://github.com/pingdotgg/t3code/pull/6168
* fix(web): preserve Claude insight line breaks by @nateEc in https://github.com/pingdotgg/t3code/pull/4344
* feat(web): accept file drops across the chat workspace by @dbalders in https://github.com/pingdotgg/t3code/pull/6636
* fix(web): widen ordered-list marker gutter for 3+ digit item numbers by @lnieuwenhuis in https://github.com/pingdotgg/t3code/pull/6527
* fix(server): bound thread activity hydration by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6153
* fix(web): restore the Archive action in the default sidebar thread menu by @lnieuwenhuis in https://github.com/pingdotgg/t3code/pull/6526
* fix(web): open diff files from nested projects by @gbarros-dev in https://github.com/pingdotgg/t3code/pull/6174
* fix(mobile): use tryOpenExternalUrl for markdown links in ThreadFeed by @mohamedmastouri-hue in https://github.com/pingdotgg/t3code/pull/5872
* fix(web): open the file a bare filename reference names by @Brechard in https://github.com/pingdotgg/t3code/pull/6297
* fix(server): stop the provider title mirror from overwriting real thread titles by @repparw in https://github.com/pingdotgg/t3code/pull/5941
* fix(shared): match source-control providers by DNS label by @gbarros-dev in https://github.com/pingdotgg/t3code/pull/6175
* feat(desktop): Chrome-style hold-to-quit by @Bil0000 in https://github.com/pingdotgg/t3code/pull/5508
* fix(gitlab): submit review comments on context lines by @tarik02 in https://github.com/pingdotgg/t3code/pull/6348
* fix(marketing): keep Grok mark clear of mobile hero copy by @NicL9923 in https://github.com/pingdotgg/t3code/pull/4542
* fix(mobile): recover the QR pairing scanner when camera access is denied by @hey-jj in https://github.com/pingdotgg/t3code/pull/6487
* fix(web): keep a long path from running under the folder picker button by @Sy-D in https://github.com/pingdotgg/t3code/pull/4823
* fix(terminal): right-click paste works in the terminal by @StiensWout in https://github.com/pingdotgg/t3code/pull/5240
* fix(mobile): explain iOS-only settings on Android by @danvernon in https://github.com/pingdotgg/t3code/pull/4981
* fix(web): stop counting a workflow coordinator as a working agent by @Rishet11 in https://github.com/pingdotgg/t3code/pull/6672
* fix(web): keep floating preview anchored after panel closes by @AksharP5 in https://github.com/pingdotgg/t3code/pull/6547
* fix(web): unstick /connect after in-modal sign-in by redirecting to the authorize endpoint by @TorbenWetter in https://github.com/pingdotgg/t3code/pull/5133
* fix(web): keep send reachable while a turn is running on mobile by @AMohamedAakhil in https://github.com/pingdotgg/t3code/pull/4781
* fix(web): reject unsupported composer image types at attach time by @mdshzb04 in https://github.com/pingdotgg/t3code/pull/6574
* Make ClaudeTextGeneration tests hermetic on Windows by @mihneaptu in https://github.com/pingdotgg/t3code/pull/4508
* fix(web): show command output in work log by @LikoKiko in https://github.com/pingdotgg/t3code/pull/4083
* fix(web): reserve sibling column width when resizing the right panel by @Lasdw6 in https://github.com/pingdotgg/t3code/pull/6279
* fix(web): replace whitespace in new ref names with dashes by @jorj-pineda in https://github.com/pingdotgg/t3code/pull/6270
* fix(client-runtime): branch list no longer resets while paging through refs by @a20hek in https://github.com/pingdotgg/t3code/pull/5858
* fix(web): support Shift+Insert terminal paste by @aoright in https://github.com/pingdotgg/t3code/pull/5982
* fix(web): keep the composer glass aligned with the context strip at any interface font size by @Williawar in https://github.com/pingdotgg/t3code/pull/5703
* fix(codex): keep background memory out of chats by @AksharP5 in https://github.com/pingdotgg/t3code/pull/5468
* fix(server): treat a missing Codex rollout as a recoverable resume error by @Rishet11 in https://github.com/pingdotgg/t3code/pull/6671
* fix(web): hide provider Update toast action while an update is running by @mrmg in https://github.com/pingdotgg/t3code/pull/6544
* fix(desktop): agent shells inherit a UTF-8 locale on macOS by @Linus-Boehm in https://github.com/pingdotgg/t3code/pull/6236
* fix(server): ignore Claude command lifecycle messages by @naveed949 in https://github.com/pingdotgg/t3code/pull/6606
* docs: mention Bitbucket user read scope needed by auth probe by @thamrx in https://github.com/pingdotgg/t3code/pull/6291
* fix(server): return valid preview action results by @duncan-vc in https://github.com/pingdotgg/t3code/pull/5966
* fix(claude): make "Always allow for session" stick, and only for the session by @kakismash in https://github.com/pingdotgg/t3code/pull/5041
* fix(ssh): surface a failed remote t3 install instead of a silent 0-byte server.log by @TorbenWetter in https://github.com/pingdotgg/t3code/pull/5132
* perf(server): persist the wire projection for streaming tool.updated data by @mInrOz in https://github.com/pingdotgg/t3code/pull/6675
* fix(web): stop wrapping partial code block selections in markdown fences by @JoeJoeflyn in https://github.com/pingdotgg/t3code/pull/5069
* fix(web): hide T3 Connect toggle in web app settings by @JoeJoeflyn in https://github.com/pingdotgg/t3code/pull/5068
* fix(web): show provider account accent badge in sidebar rows and hover card by @vitalyiegorov in https://github.com/pingdotgg/t3code/pull/5980
* fix(server): wait for concurrent SQLite writers instead of failing with SQLITE_BUSY by @ostapondo in https://github.com/pingdotgg/t3code/pull/5134
* fix(web): reject oversized prompts before provider turn start by @naveed949 in https://github.com/pingdotgg/t3code/pull/6602
* feat(web): collapse the question prompt from its header by @Jardo-51 in https://github.com/pingdotgg/t3code/pull/6773
* fix(shared): degrade an unknown system time zone to UTC in usage windows by @Rishet11 in https://github.com/pingdotgg/t3code/pull/6670
* fix(claude): discover repo-local .agents/skills in skill discovery by @RoshanMhatre in https://github.com/pingdotgg/t3code/pull/5488
* fix(server): let slow provider CLIs raise their discovery probe budget by @CDVolvik in https://github.com/pingdotgg/t3code/pull/6223
* fix(web): retain terminal PR badges after checkout switch by @sebbonit in https://github.com/pingdotgg/t3code/pull/4755
* fix(web): show selected model in context window tooltip by @nqrwhal in https://github.com/pingdotgg/t3code/pull/4772
* fix(web): scale command details with code font by @Serendeep in https://github.com/pingdotgg/t3code/pull/6510
* fix(web): preserve XML-like tags in user messages by @0utsights in https://github.com/pingdotgg/t3code/pull/4133
* fix(desktop): route mouse thumb buttons to the in-app browser by @akosbalogh in https://github.com/pingdotgg/t3code/pull/4459
* fix(web): keep the final segment of directory paths with a trailing separator by @jorvarea in https://github.com/pingdotgg/t3code/pull/5460
* Keep block code plain when copying from rendered markdown by @yashranaway in https://github.com/pingdotgg/t3code/pull/4468
* fix(web): add web app manifest so installed app keeps its scope by @Albro3459 in https://github.com/pingdotgg/t3code/pull/4306
* Skip user hooks during Claude capability probes by @yashranaway in https://github.com/pingdotgg/t3code/pull/4466
* fix(mobile): use Android monospace font family by @tastelessjolt in https://github.com/pingdotgg/t3code/pull/4609
* fix(desktop): timestamps follow the OS locale instead of en-US by @brzzdev in https://github.com/pingdotgg/t3code/pull/6190
* fix(web): keep multi-select questions open after the first click by @RaitP1 in https://github.com/pingdotgg/t3code/pull/6646
* fix(web): stop clipping the changed-files expand hover on Windows by @mrmg in https://github.com/pingdotgg/t3code/pull/6545
* fix(server): allow long-running git pushes by @devchaudhary24k in https://github.com/pingdotgg/t3code/pull/6499
* fix(desktop): keep probing backend readiness while the process is alive by @lgwacker in https://github.com/pingdotgg/t3code/pull/5526
* fix(server): allow install scripts in npm-global provider updates by @hey-jj in https://github.com/pingdotgg/t3code/pull/5646
* fix: detect SSH remotes with non-git user prefixes (e.g. gitlab@) by @JackatDJL in https://github.com/pingdotgg/t3code/pull/3649
* fix(web): describe what Ultracode does in the Reasoning picker by @delltrak in https://github.com/pingdotgg/t3code/pull/6092
* fix(server): settle pending user-input requests when a Claude session stops by @AaronAbuUsama in https://github.com/pingdotgg/t3code/pull/5127
* fix(server): stop replaying a command receipt for a different aggregate by @ostapondo in https://github.com/pingdotgg/t3code/pull/5246
* fix(server): settle snoozed threads immediately by @0bkevin in https://github.com/pingdotgg/t3code/pull/5379
* fix(mobile): prevent crash on sign out in settings by @shubhu121 in https://github.com/pingdotgg/t3code/pull/4899
* fix(mobile): local-checkout threads record their branch so PR badges show by @Zeus-Deus in https://github.com/pingdotgg/t3code/pull/4986
* fix(web): contain long approval commands by @Serendeep in https://github.com/pingdotgg/t3code/pull/6503
* feat(web): make right panel maximize bindable by @husseinraoouf in https://github.com/pingdotgg/t3code/pull/5091
* fix(server): respect inherited OPENCODE_CONFIG_CONTENT by @jonocodes in https://github.com/pingdotgg/t3code/pull/4242
* fix(marketing): detect Mac chip on homepage download button by @mahdibm-dev in https://github.com/pingdotgg/t3code/pull/4197
* Keep the server alive when a response write hits a dead socket by @yashranaway in https://github.com/pingdotgg/t3code/pull/4470
* Limit physical key fallback to non-Latin layout output by @yashranaway in https://github.com/pingdotgg/t3code/pull/4469
* fix: restore CLAUDE.md symlink target by @NgoQuocViet2001 in https://github.com/pingdotgg/t3code/pull/3929
* fix(clients): default clone destination to folder plus repo name by @inayayousfi in https://github.com/pingdotgg/t3code/pull/5989
* fix(web): keep timestamp date and time in the same locale by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/7081
* feat(desktop): add signal macOS DMG installer background by @Brechard in https://github.com/pingdotgg/t3code/pull/6201
* feat(web): send PR line requests to agent by @Bil0000 in https://github.com/pingdotgg/t3code/pull/6597
* fix(web): restore dark theme palette by @eddy-naboulet in https://github.com/pingdotgg/t3code/pull/6663
* refactor(web): simplify advanced theme controls by @StiensWout in https://github.com/pingdotgg/t3code/pull/7107
* fix(web): keep highlighted command menu items clear of the scroll fade by @PollyGlot in https://github.com/pingdotgg/t3code/pull/7132
* test: remove redundant and stale tests by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/6267
* test: favor behavior over implementation details by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7157
* feat(mobile): add built-in themes by @chrisdeeming in https://github.com/pingdotgg/t3code/pull/6619
* docs: point CLAUDE.md at AGENTS.md with an @import instead of a symlink by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/7171
* fix(web): show filenames when commit dialog paths overflow by @frarredondo in https://github.com/pingdotgg/t3code/pull/6392
* fix(mobile): keep sheet actions below status bar by @NitayRabi in https://github.com/pingdotgg/t3code/pull/6635
* fix(web): align Windows update confirmation copy by @StiensWout in https://github.com/pingdotgg/t3code/pull/7208
* feat(lint): ban native title tooltips and migrate to styled Tooltip by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/7209
* fix(pull-requests): protect provider API budgets by @Bil0000 in https://github.com/pingdotgg/t3code/pull/6466
* feat(web): configurable browser defaults in Settings → Integrations by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/7082
* fix(web): center the context usage meter by @StiensWout in https://github.com/pingdotgg/t3code/pull/7296
* feat(server): let users withhold browser access from agents by @juliusmarminge in https://github.com/pingdotgg/t3code/pull/7083
* feat(web): make review verdicts legible in the pull request detail by @Bil0000 in https://github.com/pingdotgg/t3code/pull/7077
* fix(mobile): rotate snoozed and settled shelf chevrons by @lnieuwenhuis in https://github.com/pingdotgg/t3code/pull/7276
* fix(web): show all usage breakdown periods by @tris203 in https://github.com/pingdotgg/t3code/pull/7219
* test(web): remove duplicate lookup assertion by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7364
* fix(mobile): show structured input option descriptions by @none23 in https://github.com/pingdotgg/t3code/pull/7321
* fix(orchestration): do not revive idle tasks from status-free progress by @maslinedwin in https://github.com/pingdotgg/t3code/pull/7172
* refactor(server): simplify error transformation with Effect.mapError in GitHubPullRequestCli by @aoright in https://github.com/pingdotgg/t3code/pull/7385
* fix(preview): open local environment ports on localhost by @gbarros-dev in https://github.com/pingdotgg/t3code/pull/7300
* fix(desktop): prevent quit shortcut spillover by @Bil0000 in https://github.com/pingdotgg/t3code/pull/7397
* fix(desktop): stop overwriting a custom dock icon on launch by @Rishet11 in https://github.com/pingdotgg/t3code/pull/7125
* feat(web): show project location in new thread picker by @StiensWout in https://github.com/pingdotgg/t3code/pull/7392
* fix(packaging): install AUR launcher icons where icon themes look by @AugusDogus in https://github.com/pingdotgg/t3code/pull/7421
* fix(web): label pull request merge actions by @tarik02 in https://github.com/pingdotgg/t3code/pull/7381
* fix(server): avoid PRs inherited from default upstreams by @gsimone in https://github.com/pingdotgg/t3code/pull/7317
* fix(desktop): stop the passkey dialog from popping as soon as sign-in opens by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7437
* feat(desktop): mute a browser tab by @chrisdeeming in https://github.com/pingdotgg/t3code/pull/7252
* fix(web): improve disconnected composer placeholder by @inayayousfi in https://github.com/pingdotgg/t3code/pull/7122
* fix(desktop): throttle hidden preview rendering by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7445
* fix(server): stop probing Grok, Cursor, and OpenCode unless turned on by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7459
* fix(desktop): boot the main window unthrottled so cold start paints at full speed by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7460
* fix(threads): a merged PR settles its thread only once by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7454
* feat(cli): npx t3 triage hands broken installs to your own coding agent by @t3dotgg in https://github.com/pingdotgg/t3code/pull/6563
* fix(marketing): Safari gets the arm64 Mac download by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7473
* feat(web): add shortcuts to the surface dropdown by @gsimone in https://github.com/pingdotgg/t3code/pull/7318
* fix(marketing): never serve the Intel build to Apple Silicon Macs by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7477
* fix(web): animate command palette when closing by @tarik02 in https://github.com/pingdotgg/t3code/pull/5169
* fix(desktop): upgrade Clerk OAuth transport by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7479
* feat(server): run the background service on macOS via launchd by @t3dotgg in https://github.com/pingdotgg/t3code/pull/6286
* fix(web): align sidebar statuses with project names by @RakshithBhat03 in https://github.com/pingdotgg/t3code/pull/7491
* fix(desktop): close the window before quit cleanup by @t3dotgg in https://github.com/pingdotgg/t3code/pull/6562
* fix(desktop): stop automatic passkey prompts by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7522
* fix(web): align version text with its label by @RakshithBhat03 in https://github.com/pingdotgg/t3code/pull/7521
* fix(web): refresh open file with the file tree by @StiensWout in https://github.com/pingdotgg/t3code/pull/7490
* Add OpenCode skill discovery by @dbalders in https://github.com/pingdotgg/t3code/pull/3154
* feat(web): unify workspace navigation by @maria-rcks in https://github.com/pingdotgg/t3code/pull/7153
* fix(web): hide opencode's plan agent when legacy plan mode is off by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/6420
* feat: refine thread action menus by @maria-rcks in https://github.com/pingdotgg/t3code/pull/7476
* feat(web): redesign usage insights by @maria-rcks in https://github.com/pingdotgg/t3code/pull/7147
* fix(server): outdated gh no longer reads as "not authenticated" by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7588
* fix(desktop): refresh queued updates before install by @SunkenInTime in https://github.com/pingdotgg/t3code/pull/6269
* feat(web): confirm before closing a terminal by @maria-rcks in https://github.com/pingdotgg/t3code/pull/7592
* feat(web): refresh pull request details by @maria-rcks in https://github.com/pingdotgg/t3code/pull/7148
* fix(web): usage hourly breakdown lists every hour chronologically by @lgwacker in https://github.com/pingdotgg/t3code/pull/7595
* fix(web): remove the terminal pane's app-canvas gutter by @jakeleventhal in https://github.com/pingdotgg/t3code/pull/6222
* feat(web): attach composer state drawers by @maria-rcks in https://github.com/pingdotgg/t3code/pull/7150
* fix(server): preserve tool lifecycle identity by @maria-rcks in https://github.com/pingdotgg/t3code/pull/7151
* chore(desktop): use stable Clerk Electron release by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7602
* feat(web): collapse tool activity into one line by @maria-rcks in https://github.com/pingdotgg/t3code/pull/7152
* test(web): remove redundant timestamp assertions by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7633
* fix(web): import dependency-heavy Open VSX themes by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7642
* fix(web): retry failed thread bootstraps with a fresh id by @SunkenInTime in https://github.com/pingdotgg/t3code/pull/7664
* fix(web): copy terminal selection instead of a blank clipboard by @sethwebster in https://github.com/pingdotgg/t3code/pull/7678
* revert(web): restore sparse hourly usage breakdown by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7718
* fix(server): reconcile orphaned provider sessions by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7719
* fix(web): fix subagent row left border being cut off by @sameerr03 in https://github.com/pingdotgg/t3code/pull/7207
* fix(web): unify composer control rounding by @kototok903 in https://github.com/pingdotgg/t3code/pull/5957
* fix(web): show pointer on add project button by @incognitojam in https://github.com/pingdotgg/t3code/pull/5545
* fix(server): enable the Cursor provider by default like every other provider by @Rishet11 in https://github.com/pingdotgg/t3code/pull/7089
* fix(web): fix thread jumping after reorder by @ipanasenko in https://github.com/pingdotgg/t3code/pull/7103
* fix(server): keep Daybreak models out of legacy models by @cn0ss in https://github.com/pingdotgg/t3code/pull/7659
* fix(contracts): reconcile provider default tests by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7725
* fix(web): polish theme library buttons, search, and import dialog by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/7580
* chore: vouch Seth Webster and pcstyle by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7728
* fix(web): add space above composer task tabs by @Bil0000 in https://github.com/pingdotgg/t3code/pull/7740
* feat(composer): list skills with slash commands by @maria-rcks in https://github.com/pingdotgg/t3code/pull/7737
* fix(web): show the full path in file link tooltips by @s243a in https://github.com/pingdotgg/t3code/pull/7741
* fix(server): serve html assets with utf-8 charset by @talkingdonkeyz in https://github.com/pingdotgg/t3code/pull/6409
* fix(vcs): give `git worktree add` a longer timeout on large repos by @ChamaruAmasara in https://github.com/pingdotgg/t3code/pull/6326
* chore: move implementation plans out of repository by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7665
* Update user count in AGENTS.md by @saphid in https://github.com/pingdotgg/t3code/pull/7658
* fix(desktop): restrict editor deep links by @Lucenx9 in https://github.com/pingdotgg/t3code/pull/7697
* fix(web): prevent pinned threads reshuffling after drop by @tarik02 in https://github.com/pingdotgg/t3code/pull/7676
* fix(web): encode shifted characters correctly in the terminal by @chrisdeeming in https://github.com/pingdotgg/t3code/pull/7485
* fix(web): resolve sidebar provider icons from the thread's own environment by @vitalyiegorov in https://github.com/pingdotgg/t3code/pull/7292
* fix(web): hide thread jump hints while the terminal is focused by @lnieuwenhuis in https://github.com/pingdotgg/t3code/pull/7277
* fix(web): keep following the stream after scrolling back to the live edge by @lnieuwenhuis in https://github.com/pingdotgg/t3code/pull/6519
* perf(ci): parallelize the test suite and split out Rust checks by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7286
* ci: only boot the macOS native lint runner when native sources change by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7283
* chore: stop committing pull request assets by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7762
* fix(clients): default GitHub clones to HTTPS by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7760
* perf(web): stop preview loading rerenders by @Bil0000 in https://github.com/pingdotgg/t3code/pull/7561
* fix(web): keep messages clear of composer banners by @Bil0000 in https://github.com/pingdotgg/t3code/pull/7792
* feat(web): double-click chat header title to rename thread by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/7817
* fix(web): model picker no longer shows a double border by @RakshithBhat03 in https://github.com/pingdotgg/t3code/pull/7772
* fix(web): give sidebar un-settle button a tooltip by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/7796
* fix(web): render oversized terminal graphemes without crashing by @Lucenx9 in https://github.com/pingdotgg/t3code/pull/7809
* feat(web): cmd+enter to create thread in background by @extoci in https://github.com/pingdotgg/t3code/pull/7821
* fix(web): launcher shortcuts no longer hijack the empty composer by @Lucenx9 in https://github.com/pingdotgg/t3code/pull/7794
* feat(desktop): choose external project icons by @Bil0000 in https://github.com/pingdotgg/t3code/pull/7823
* perf(web): dedupe terminal mouse motion reports by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7845
* fix(search): oversized thread queries no longer crash clients by @Lucenx9 in https://github.com/pingdotgg/t3code/pull/6633
* fix(mobile): stop a directly-saved backend from hiding its T3 Connect environment by @Rishet11 in https://github.com/pingdotgg/t3code/pull/7086
* feat(analytics): threads and turns now know which client started them by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7774
* fix(web): stop marking mixed tool runs as failed by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7893
* fix(web): command-click spaced folder links by @SunkenInTime in https://github.com/pingdotgg/t3code/pull/6439
* fix(chat): stop pushing follow-up messages to the top by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7897
* test(desktop): remove redundant release note assertion by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7873
* fix(web): handle wide ordered-list marker edge cases by @abcdmku in https://github.com/pingdotgg/t3code/pull/7856
* fix(ssh): restore user PATH for remote servers by @gbarros-dev in https://github.com/pingdotgg/t3code/pull/7213
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints by @Rishet11 in https://github.com/pingdotgg/t3code/pull/7116
* fix(web): keep Codex service tier labels readable by @PixPMusic in https://github.com/pingdotgg/t3code/pull/4503
* fix: render workspace images in chat markdown by @SunkenInTime in https://github.com/pingdotgg/t3code/pull/6433
* fix(clients): keep opening responses visible after turns settle by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7723
* feat(web): add appearance contrast control by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/7906
* fix(server): stop completed Codex threads from staying stuck on working by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7937
* fix(mobile): preserve markdown image dimensions by @SunkenInTime in https://github.com/pingdotgg/t3code/pull/7940
* fix(web): remove duplicate provider update progress by @naveed949 in https://github.com/pingdotgg/t3code/pull/7761
* fix(server): fall back to the remote default branch instead of assuming main by @Rishet11 in https://github.com/pingdotgg/t3code/pull/7078
* fix(web): give sidebar project menu rows the same side padding as other menus by @ishaanko in https://github.com/pingdotgg/t3code/pull/7913
* fix(clients): reconnect after credentials fail during remote server updates by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7953
* feat(codex): submit thread feedback to OpenAI by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7949
* fix(server): stop kills lingering Claude work by @t3dotgg in https://github.com/pingdotgg/t3code/pull/5891
* fix(ci): let Macroscope approve pull requests again by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7970
* fix(clients): move settled pinned threads into the settled section by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7969
* perf(ci): speed up release builds and Windows packaging by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7975
* fix(web): stop tool calls from leaving a blank page in threads by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7971
* fix(web): stop recovered tool failures from marking work logs red by @t3dotgg in https://github.com/pingdotgg/t3code/pull/7999
* fix(mobile): isolate markdown image requests by @SunkenInTime in https://github.com/pingdotgg/t3code/pull/7942
* feat(web): redesign skills in `$` menu and in `/` menu by @extoci in https://github.com/pingdotgg/t3code/pull/8009
* fix(web): restore right panel toggle clicks after closing on desktop by @UtkarshUsername in https://github.com/pingdotgg/t3code/pull/8016
* fix(web): keep server update banners flush with the composer by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8000
* perf(web): reuse work log rows during streaming by @Bil0000 in https://github.com/pingdotgg/t3code/pull/8006
* fix(web): keep provider badge legible in dark themes by @RakshithBhat03 in https://github.com/pingdotgg/t3code/pull/7968
* fix(web): treat configured urls with uppercase schemes as secure by @Lucenx9 in https://github.com/pingdotgg/t3code/pull/8005
* fix(desktop): keep release notes visible while downloading by @extoci in https://github.com/pingdotgg/t3code/pull/6412
* fix(web): show only providers with usage in usage views by @tris203 in https://github.com/pingdotgg/t3code/pull/7563
* fix(web): prevent expanded tool calls from hiding thread content by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8052
* test(server): remove no-op live activity tests by @t3-code[bot] in https://github.com/pingdotgg/t3code/pull/8056
* fix(web): clarify terminal sidebar grouping by @StiensWout in https://github.com/pingdotgg/t3code/pull/7967
* fix(codex): show app access approval prompts by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8058
* feat(web): upload image attachments before sending by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8048
* fix(server): bound OpenCode skill discovery output by @Lucenx9 in https://github.com/pingdotgg/t3code/pull/7675
* fix(mobile): persist thread shelf collapse state by @PixPMusic in https://github.com/pingdotgg/t3code/pull/5152
* fix(mobile): restore Android tablet thread controls, clean up header by @PixPMusic in https://github.com/pingdotgg/t3code/pull/5385
* fix(mobile): land the first thread open above the composer on Android by @PollyGlot in https://github.com/pingdotgg/t3code/pull/5585
* fix(server): check out submodules in a new worktree by @Brechard in https://github.com/pingdotgg/t3code/pull/7674
* fix(server): preserve merged PR badges after branch deletion by @tris203 in https://github.com/pingdotgg/t3code/pull/6216
* fix(server): return fresh live pull request reads by @Adamulek123 in https://github.com/pingdotgg/t3code/pull/6472
* fix(web): compare client and server versions as semver, not strings by @spiky02plateau in https://github.com/pingdotgg/t3code/pull/7579
* fix(web): stop follow-ups from leaving giant blank space by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8068
* fix(marketing): stop automatic Vercel deployments on pull requests by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8070
* chore: vouch repeat contributors by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8071
* fix(server): keep the authoritative subagent model when snapshots race task_started by @spiky02plateau in https://github.com/pingdotgg/t3code/pull/7583
* fix(server): honor auto-accept edits for the OpenCode provider by @Rishet11 in https://github.com/pingdotgg/t3code/pull/7100
* fix(server): run the CLI on Node versions without import.meta.main by @CDVolvik in https://github.com/pingdotgg/t3code/pull/7141
* fix(server): recover from provider interrupt failures by @mrmg in https://github.com/pingdotgg/t3code/pull/7412
* fix(server): recreate a thread's worktree before starting a turn by @mackinleysmith in https://github.com/pingdotgg/t3code/pull/7839
* fix(server): thread delete no longer fails on already-removed worktrees by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8076
* fix(web): stop update notices showing through the composer by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8083
* fix(web): detect outdated nightly servers by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8124
* fix(web): align usage page skeleton layout by @tris203 in https://github.com/pingdotgg/t3code/pull/8111
* fix(web): make terminal links appear clickable only when clickable by @flamboh in https://github.com/pingdotgg/t3code/pull/7488
* fix(web): make Windows file links clickable in chat by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8081
* fix(web): sort usage models by token count by @RakshithBhat03 in https://github.com/pingdotgg/t3code/pull/8108
* fix: open agent file links in the file viewer by @StiensWout in https://github.com/pingdotgg/t3code/pull/8098
* fix(server): stop routine events from rescanning thread history by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8150
* fix(deps): stop pnpm installs from changing the lockfile by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8163
* feat(web): settle and restore threads with a keyboard shortcut by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8089
* perf(desktop): cut macOS signing calls by 81% by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8093
* feat: link pull requests to threads by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8160
* feat(web): safely attach HEIC photos as JPEG images by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8161
* feat(mobile): track device models and OS versions by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8169
* fix(grok): bound cumulative tool output updates by @lnieuwenhuis in https://github.com/pingdotgg/t3code/pull/7279
* fix(web): delay thread shortcut hints by 200 ms by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8172
* fix(server): stop probing Cursor until enabled by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8175
* docs(release): verify remote updates with database migrations by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8177
* fix(server): keep provider CLIs available in the macOS service by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8173
* feat(claude): compact old threads before they burn through usage by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8144
* fix(client-runtime): retry queries after connection interruption by @tris203 in https://github.com/pingdotgg/t3code/pull/8117
* fix(server): keep previously used providers working after upgrades by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8176
* feat(desktop): build macOS previews from a PR label by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8182
* fix(web): thread jump hints no longer stick after a dictation paste by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8189
* fix(web): keep grouped project renames by @MohtashamMurshid in https://github.com/pingdotgg/t3code/pull/7831
* feat(web): reveal chat file chips in the system file manager by @SunkenInTime in https://github.com/pingdotgg/t3code/pull/7140
* fix(server): push no longer writes a feature branch's commits to its base branch by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8228
* chore(deps): bump @clerk/electron to 0.0.37 by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8240
* feat(server): fetch legacy model classification from a hosted manifest by @t3dotgg in https://github.com/pingdotgg/t3code/pull/8227

## New Contributors
* @bkntr made their first contribution in https://github.com/pingdotgg/t3code/pull/5354
* @yassiEmp made their first contribution in https://github.com/pingdotgg/t3code/pull/5693
* @extoci made their first contribution in https://github.com/pingdotgg/t3code/pull/6194
* @none23 made their first contribution in https://github.com/pingdotgg/t3code/pull/6154
* @gsimone made their first contribution in https://github.com/pingdotgg/t3code/pull/6330
* @dominic-r made their first contribution in https://github.com/pingdotgg/t3code/pull/6230
* @Adamulek123 made their first contribution in https://github.com/pingdotgg/t3code/pull/6490
* @paul-vd made their first contribution in https://github.com/pingdotgg/t3code/pull/6520
* @WarheadTaylor made their first contribution in https://github.com/pingdotgg/t3code/pull/6086
* @RakshithBhat03 made their first contribution in https://github.com/pingdotgg/t3code/pull/6215
* @davidhu2000 made their first contribution in https://github.com/pingdotgg/t3code/pull/6506
* @MichaelCharles made their first contribution in https://github.com/pingdotgg/t3code/pull/6281
* @SunkenInTime made their first contribution in https://github.com/pingdotgg/t3code/pull/6377
* @mohamedmastouri-hue made their first contribution in https://github.com/pingdotgg/t3code/pull/5872
* @NicL9923 made their first contribution in https://github.com/pingdotgg/t3code/pull/4542
* @hey-jj made their first contribution in https://github.com/pingdotgg/t3code/pull/6487
* @danvernon made their first contribution in https://github.com/pingdotgg/t3code/pull/4981
* @Rishet11 made their first contribution in https://github.com/pingdotgg/t3code/pull/6672
* @AksharP5 made their first contribution in https://github.com/pingdotgg/t3code/pull/6547
* @TorbenWetter made their first contribution in https://github.com/pingdotgg/t3code/pull/5133
* @AMohamedAakhil made their first contribution in https://github.com/pingdotgg/t3code/pull/4781
* @mdshzb04 made their first contribution in https://github.com/pingdotgg/t3code/pull/6574
* @mihneaptu made their first contribution in https://github.com/pingdotgg/t3code/pull/4508
* @LikoKiko made their first contribution in https://github.com/pingdotgg/t3code/pull/4083
* @Lasdw6 made their first contribution in https://github.com/pingdotgg/t3code/pull/6279
* @jorj-pineda made their first contribution in https://github.com/pingdotgg/t3code/pull/6270
* @a20hek made their first contribution in https://github.com/pingdotgg/t3code/pull/5858
* @aoright made their first contribution in https://github.com/pingdotgg/t3code/pull/5982
* @Williawar made their first contribution in https://github.com/pingdotgg/t3code/pull/5703
* @mrmg made their first contribution in https://github.com/pingdotgg/t3code/pull/6544
* @Linus-Boehm made their first contribution in https://github.com/pingdotgg/t3code/pull/6236
* @naveed949 made their first contribution in https://github.com/pingdotgg/t3code/pull/6606
* @thamrx made their first contribution in https://github.com/pingdotgg/t3code/pull/6291
* @duncan-vc made their first contribution in https://github.com/pingdotgg/t3code/pull/5966
* @kakismash made their first contribution in https://github.com/pingdotgg/t3code/pull/5041
* @mInrOz made their first contribution in https://github.com/pingdotgg/t3code/pull/6675
* @JoeJoeflyn made their first contribution in https://github.com/pingdotgg/t3code/pull/5069
* @vitalyiegorov made their first contribution in https://github.com/pingdotgg/t3code/pull/5980
* @ostapondo made their first contribution in https://github.com/pingdotgg/t3code/pull/5134
* @Jardo-51 made their first contribution in https://github.com/pingdotgg/t3code/pull/6773
* @RoshanMhatre made their first contribution in https://github.com/pingdotgg/t3code/pull/5488
* @CDVolvik made their first contribution in https://github.com/pingdotgg/t3code/pull/6223
* @sebbonit made their first contribution in https://github.com/pingdotgg/t3code/pull/4755
* @nqrwhal made their first contribution in https://github.com/pingdotgg/t3code/pull/4772
* @Serendeep made their first contribution in https://github.com/pingdotgg/t3code/pull/6510
* @0utsights made their first contribution in https://github.com/pingdotgg/t3code/pull/4133
* @akosbalogh made their first contribution in https://github.com/pingdotgg/t3code/pull/4459
* @jorvarea made their first contribution in https://github.com/pingdotgg/t3code/pull/5460
* @yashranaway made their first contribution in https://github.com/pingdotgg/t3code/pull/4468
* @Albro3459 made their first contribution in https://github.com/pingdotgg/t3code/pull/4306
* @tastelessjolt made their first contribution in https://github.com/pingdotgg/t3code/pull/4609
* @brzzdev made their first contribution in https://github.com/pingdotgg/t3code/pull/6190
* @RaitP1 made their first contribution in https://github.com/pingdotgg/t3code/pull/6646
* @devchaudhary24k made their first contribution in https://github.com/pingdotgg/t3code/pull/6499
* @lgwacker made their first contribution in https://github.com/pingdotgg/t3code/pull/5526
* @JackatDJL made their first contribution in https://github.com/pingdotgg/t3code/pull/3649
* @delltrak made their first contribution in https://github.com/pingdotgg/t3code/pull/6092
* @AaronAbuUsama made their first contribution in https://github.com/pingdotgg/t3code/pull/5127
* @0bkevin made their first contribution in https://github.com/pingdotgg/t3code/pull/5379
* @shubhu121 made their first contribution in https://github.com/pingdotgg/t3code/pull/4899
* @Zeus-Deus made their first contribution in https://github.com/pingdotgg/t3code/pull/4986
* @husseinraoouf made their first contribution in https://github.com/pingdotgg/t3code/pull/5091
* @jonocodes made their first contribution in https://github.com/pingdotgg/t3code/pull/4242
* @mahdibm-dev made their first contribution in https://github.com/pingdotgg/t3code/pull/4197
* @NgoQuocViet2001 made their first contribution in https://github.com/pingdotgg/t3code/pull/3929
* @inayayousfi made their first contribution in https://github.com/pingdotgg/t3code/pull/5989
* @eddy-naboulet made their first contribution in https://github.com/pingdotgg/t3code/pull/6663
* @frarredondo made their first contribution in https://github.com/pingdotgg/t3code/pull/6392
* @NitayRabi made their first contribution in https://github.com/pingdotgg/t3code/pull/6635
* @maslinedwin made their first contribution in https://github.com/pingdotgg/t3code/pull/7172
* @AugusDogus made their first contribution in https://github.com/pingdotgg/t3code/pull/7421
* @sethwebster made their first contribution in https://github.com/pingdotgg/t3code/pull/7678
* @sameerr03 made their first contribution in https://github.com/pingdotgg/t3code/pull/7207
* @kototok903 made their first contribution in https://github.com/pingdotgg/t3code/pull/5957
* @incognitojam made their first contribution in https://github.com/pingdotgg/t3code/pull/5545
* @cn0ss made their first contribution in https://github.com/pingdotgg/t3code/pull/7659
* @s243a made their first contribution in https://github.com/pingdotgg/t3code/pull/7741
* @talkingdonkeyz made their first contribution in https://github.com/pingdotgg/t3code/pull/6409
* @ChamaruAmasara made their first contribution in https://github.com/pingdotgg/t3code/pull/6326
* @abcdmku made their first contribution in https://github.com/pingdotgg/t3code/pull/7856
* @ishaanko made their first contribution in https://github.com/pingdotgg/t3code/pull/7913
* @spiky02plateau made their first contribution in https://github.com/pingdotgg/t3code/pull/7579
* @flamboh made their first contribution in https://github.com/pingdotgg/t3code/pull/7488
* @MohtashamMurshid made their first contribution in https://github.com/pingdotgg/t3code/pull/7831

**Full Changelog**: https://github.com/pingdotgg/t3code/compare/v0.0.33...v0.0.34

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.34
darjss pushed a commit to darjss/t3code that referenced this pull request Aug 26, 2026
…sar (pingdotgg#5877)

Co-authored-by: tsouth89 <tsouth89@users.noreply.github.com>
Co-authored-by: t3-code[bot] <t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 500-999 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants