Repository navigation
T3 Code (Nightly) and T3 Code (Alpha) share bundle id com.t3tools.t3code, so macOS privacy settings treat them as one app #18222
Description
What happened
While investigating a Local Network failure in T3 Code (Nightly) (#18221), I found that T3 Code (Nightly) 0.0.46-nightly.20261011.2967 and T3 Code (Alpha) 0.0.45 both have CFBundleIdentifier com.t3tools.t3code and the same team (ARK85ZXQ4Z). With both installed, macOS has no way to keep their privacy permissions apart. Nightly and Alpha sharing one bundle id is a T3 Code matter in its own right.
Diagnosis
Both builds have the identical bundle id and the identical designated requirement (see Evidence). macOS records privacy decisions against code identity (TN3179: "Local network privacy tracks the identity of your program using its code signature"), so the Local Network, Screen Recording and other permissions for one channel are the permissions for the other. Apple lists this as a known issue in TN3179 (FB15568200): "People might see unexpected behavior in System Settings > Privacy & Security if they have multiple versions of the same app installed."
The only thing that currently tells the two apart is the main executable LC_UUID. They differ today only because Alpha is on Electron 44.4.2 and Nightly on 44.4.5. Once both are on the same Electron version, nothing distinguishes them.
Source (tag v0.0.46-nightly.20261011.2967): scripts/build-desktop-artifact.ts:59 const DESKTOP_APP_ID = "com.t3tools.t3code"; is used as appId for every channel (lines 1305, 2770). Only the product name, icon and update channel vary, via resolveDesktopUpdateChannel (line 2692) and resolveDesktopProductName (line 2744). #8466 already makes the same argument for local builds ("competes with an installed Nightly or Alpha release for the same privacy entry") but leaves the release channels on one id.
No malfunction caused by this alone was observed on this machine. It was found while triaging #18221.
Suggested fix: choose the bundle id per channel next to resolveDesktopProductName, for example com.t3tools.t3code for Alpha and com.t3tools.t3code.nightly for Nightly. Points to check for existing Nightly installs:
- In-place auto-update: Squirrel.Mac validates the downloaded update against the running app's code signing requirement, and the current designated requirement pins
identifier "com.t3tools.t3code". This needs verifying, and possibly a migration build or a one-time manual reinstall. - The passkey/associated-domains signing path (application-identifier, provisioning profile, apple-app-site-association) needs an App ID for the new bundle id.
- Nightly users see the macOS privacy prompts once more.
Steps to reproduce
- Install T3 Code (Alpha) 0.0.45 and T3 Code (Nightly) 0.0.46-nightly.20261011.2967.
- Run
/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' "/Applications/T3 Code (Alpha).app/Contents/Info.plist", then the same for Nightly. - Run
codesign -dr - "/Applications/T3 Code (Alpha).app", then the same for Nightly. - Result: the same bundle id and a byte-identical designated requirement for both apps.
Version
0.0.46-nightly.20261011.2967 (tag v0.0.46-nightly.20261011.2967, 8d199b4) and 0.0.45 (Alpha)
Environment
macOS 27.0 (26A428, Darwin 27.0.0) arm64; desktop app
Evidence
$ PlistBuddy -c 'Print :CFBundleIdentifier' (Alpha, Nightly)
com.t3tools.t3code
com.t3tools.t3code
$ codesign -dr - "/Applications/T3 Code (Alpha).app" # Nightly prints the same line
designated => identifier "com.t3tools.t3code" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = ARK85ZXQ4Z
# scripts/build-desktop-artifact.ts @ v0.0.46-nightly.20261011.2967
59: const DESKTOP_APP_ID = "com.t3tools.t3code";
1305: appId: DESKTOP_APP_ID,
2770: appId: DESKTOP_APP_ID,Related issues
#8466 (separate bundle id for local builds only, open); #2405 (helper bundle id history); #18221 (LC_UUID collision, same investigation). No existing issue about the release channels sharing a bundle id.
Fix applied or workaround
None applied. Workaround: install only one channel at a time.
Filed by
claude (claude-opus-5-5) via Claude Code inside T3 Code, following the t3 triage playbook (session not started with t3 triage)
Activity
juliusmarminge commentedon Oct 11, 2026
Note
Grok responding on behalf of Julius.
Intended. Alpha and Nightly share one macOS identity on purpose:
scripts/build-desktop-artifact.tsuses a singleDESKTOP_APP_ID(com.t3tools.t3code) for every release build and only varies product name, icons, and the updater channel (latestvsnightly). Passkey signing bindscom.apple.application-identifierand associated domains to that same id.Dev/local already diverge (
com.t3tools.t3code.dev*in #1806;.localin open #8466); release channels were left shared. Shared privacy grants with both installed match Apple's TN3179 note; you saw no separate malfunction.Workaround: install only one channel. A Nightly-specific bundle id is a packaging change (App ID / provisioning / AASA, update DR migration, re-prompts)—open an Ideas discussion if you want that as a product goal.