Repository navigation
feat(desktop): Add a Linux .deb to releases - #4900
benthecarman wants to merge 1 commit into
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
ApprovabilityVerdict: Needs human review This PR adds a new Linux .deb distribution format to releases, introducing new user-facing download options and modifying the production release pipeline. New features affecting release artifacts warrant human review. You can customize Macroscope's approvability policy. Learn more. |
Linux shipped only the AppImage, leaving users who install through a package manager without a supported path: no desktop entry, no /usr/bin entry, and no dpkg/apt upgrades. electron-builder builds the .deb from the same staged app as the AppImage, so the release gains a package without a second build. The AppImage stays the artifact that self-updates in place; .deb installs upgrade through their package manager instead, which is what the updater already reports on non-AppImage Linux. The .deb also needs metadata the AppImage never required: a project homepage, which electron-builder reads only from the packaged app's manifest, and an RFC 822 maintainer address for the control file. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Dismissing prior approval to re-evaluate a81713a
The desktop build script already accepts `--target deb`; the target string is
passed through to electron-builder untouched and the artifact copy step is
target-agnostic. A deb build fails only because app-builder-lib's FpmTarget
requires two metadata fields the staged package.json omits: `homepage`
(control "Homepage:") and `maintainer` (control "Maintainer:", otherwise
derived from `author`, which carries no email). AppImage needs neither, so
nothing surfaced this.
Rather than add a second Linux matrix entry -- whose upload artifact name
`desktop-linux-x64` would collide with the AppImage entry's -- let the existing
Linux entry emit both targets from one electron-builder run. `--target` now
takes a comma-separated list, and artifactName's ${ext} already keeps the output
files distinct, so there is one artifact name, one runner, and no collision.
The .deb also has to be listed in the collect step and in both
action-gh-release file lists, or it builds and never ships.
Packages declare Electron's shared-library dependencies per format, so a
minimal Debian/Ubuntu install pulls them in instead of the app failing to
start. The same wiring covers `rpm`, exposed as `dist:desktop:rpm` for local
builds; the release workflow stays AppImage+deb because the runners have no
`rpmbuild`.
Consolidates the overlapping .deb work from pingdotgg#4887, pingdotgg#4900 and pingdotgg#5139: the
dependency lists and the rpm target come from @bigpod98's pingdotgg#5139, the docs and
the download-page card from @benthecarman's pingdotgg#4900.
The .deb is not an updater payload -- in-app updates on Linux stay
AppImage-only, so .deb installs upgrade through dpkg/apt. Documented in
docs/operations/release.md.
The Linux release build now also makes a .deb in the same electron-builder run as the AppImage, and the release publishes it. electron-builder lists it in latest-linux.yml and writes resources/package-type into it, so the app updates a .deb install through electron-updater, which installs the new .deb with dpkg. The desktop updater now allows that path. The .deb uses xz in threaded mode (XZ_DEFAULTS=-T0): 113 MB in place of 141 MB with gzip. The Linux arm64 release job moves to a 16-vCPU Blacksmith arm64 runner. The download page, README, install guide, and release docs list the .deb. Based on community work in #4071, #5139, #4900, and #4887. Co-authored-by: chukfinley <[email protected]> Co-authored-by: Primož Ajdišek <[email protected]> Co-authored-by: benthecarman <[email protected]> Co-authored-by: NaveDanan <[email protected]> Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
* test(relay): remove constant-restating database mode test (pingdotgg#13932) * fix(server): let agents use simctl and adb alongside device tools (pingdotgg#13908) * feat(observability): honor OTEL_*_EXPORTER=none per signal (pingdotgg#13736) Signed-off-by: Yordis Prieto <[email protected]> * fix(clients): hide duplicate Cursor Keychain prompts (pingdotgg#13870) Co-authored-by: Claude Opus 5.5 <[email protected]> * fix(build): validate Linux node-pty prebuilds in Windows artifacts (pingdotgg#13867) * test(usage): assert contract mismatch details (pingdotgg#13861) * fix(usage): identify client version mismatches (pingdotgg#8208) * fix(usage): omit Cursor warning when no login is saved (pingdotgg#13820) * fix(usage): tolerate newer provider variants (pingdotgg#10076) * fix(server): background git status fetches no longer fill the disk with failed repacks (pingdotgg#13812) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * perf(server): cut idle wakeups from the Connect relay and session reaper (pingdotgg#13774) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * perf(clients): saving the thread list cache no longer freezes the UI (pingdotgg#13767) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * perf(server): background sweeps only read threads that can still settle (pingdotgg#13765) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(observability): the renderer trace proxy stops tracing itself (pingdotgg#13761) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * perf(clients): sort projects and settled threads without re-parsing dates per comparison (pingdotgg#13759) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * perf(server): opening Diagnostics no longer loads the whole trace ring into memory (pingdotgg#13763) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * perf(observability): stop writing empty spans on spawns, projected events, and idle polls (pingdotgg#13756) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(server): let Antigravity inspect unsupported files by path (pingdotgg#13339) Co-authored-by: Julius Marminge <[email protected]> Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * Show a focus ring on sidebar thread and draft rows (pingdotgg#13344) * fix(server): bump node-pty to 1.2.0-beta.15 for linux-arm64 prebuild (pingdotgg#13748) * fix(server): prune expired replay-protection files from the secrets directory (pingdotgg#13695) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(server): installed editors no longer vanish when discovery is slow (pingdotgg#13669) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(editors): stop treating the agy CLI as the Antigravity IDE (pingdotgg#7079) * fix(opencode): accept v2 serve ready line when spawning server (pingdotgg#13651) * fix(usage): hide the Cursor keychain prompt when Cursor isn't set up (pingdotgg#13714) * perf(server): stop re-running git for every project each minute (pingdotgg#13689) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * feat(observability): record event loop stalls in the server trace (pingdotgg#13697) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * perf(server): per-thread settlement and PR checks no longer rebuild the whole thread list (pingdotgg#13691) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(client): slow servers finish loading the thread list instead of loading it twice (pingdotgg#13683) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * perf(server): build the thread list snapshot without decoding it twice (pingdotgg#13693) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * feat(observability): write a server heap snapshot on SIGUSR2 (pingdotgg#13694) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * perf(server): pull request sync reads only threads with linked pull requests (pingdotgg#13704) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * feat(cli): summarize the server trace file from the command line (pingdotgg#13698) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(server): the SQLite WAL file shrinks back after large writes (pingdotgg#13684) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(cli): t3 triage points agents at log files that exist (pingdotgg#13685) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * feat(observability): name the command on subprocess spans (pingdotgg#13701) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * perf(server): stop remapping every thread on each thread event (pingdotgg#13720) Co-authored-by: Claude <[email protected]> * refactor(observability): name each service after its application (pingdotgg#13699) Signed-off-by: Yordis Prieto <[email protected]> * fix(usage): price Cursor cache savings by base model (pingdotgg#13731) * perf(server): avoid rereading unchanged files in review previews (pingdotgg#13395) * fix(server): load Cursor keyring with createRequire (pingdotgg#13678) * fix(terminal): settling a thread closes its idle shells (pingdotgg#13673) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * feat(observability): honor the standard OTLP endpoint, headers, and protocol variables (pingdotgg#13492) Signed-off-by: Yordis Prieto <[email protected]> * fix(sqlite): retry failed statement preparations (pingdotgg#10584) Co-authored-by: shivam <[email protected]> * feat(usage): read cursor, opencode, and antigravity history (pingdotgg#10409) Co-authored-by: Yash Singh <[email protected]> * fix(usage): price Claude fast-mode requests at the fast rate (pingdotgg#13599) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(dev): one t3.json setup action that works on every OS (pingdotgg#13589) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * feat(release): ship a Linux .deb that updates itself (pingdotgg#13575) The Linux release build now also makes a .deb in the same electron-builder run as the AppImage, and the release publishes it. electron-builder lists it in latest-linux.yml and writes resources/package-type into it, so the app updates a .deb install through electron-updater, which installs the new .deb with dpkg. The desktop updater now allows that path. The .deb uses xz in threaded mode (XZ_DEFAULTS=-T0): 113 MB in place of 141 MB with gzip. The Linux arm64 release job moves to a 16-vCPU Blacksmith arm64 runner. The download page, README, install guide, and release docs list the .deb. Based on community work in pingdotgg#4071, pingdotgg#5139, pingdotgg#4900, and pingdotgg#4887. Co-authored-by: chukfinley <[email protected]> Co-authored-by: Primož Ajdišek <[email protected]> Co-authored-by: benthecarman <[email protected]> Co-authored-by: NaveDanan <[email protected]> Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * fix(clients): a preview app no longer knocks the desktop's own server offline (pingdotgg#13577) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(mcp): preview errors tell agents what to do instead (pingdotgg#13559) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(mcp): preview snapshots fit in the agent's tool output again (pingdotgg#13558) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(server): newer Codex models get T3 Code's instructions again (pingdotgg#13547) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(clients): sync status no longer flickers when opening running threads (pingdotgg#13551) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * ci(relay): add a forced manual relay deploy (pingdotgg#13550) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(server): report the Grok account email so usage limits merge across environments (pingdotgg#12588) Co-authored-by: Claude Opus 5 (1M context) <[email protected]> Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com> * fix(server): Grok accounts with no usage yet no longer vanish from Limits (pingdotgg#12799) Co-authored-by: Claude Opus 5 (1M context) <[email protected]> * fix(relay): export tunnel cleanup counters to Axiom (pingdotgg#13528) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * feat(grok): offer one-click updates through `grok update` (pingdotgg#13523) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(connect): remove tunnels after hosts go offline (pingdotgg#9386) Co-authored-by: Claude Fable 5.1 <[email protected]> Co-authored-by: Julius Marminge <[email protected]> Co-authored-by: Julius Marminge <[email protected]> * feat(codex): require Codex 0.156 and regenerate its protocol (pingdotgg#13481) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(codex): the protocol generator runs again on Effect rc.115 (pingdotgg#13480) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(antigravity): keep Windows runtime unpacking under MAX_PATH (pingdotgg#13389) Co-authored-by: javiergusart <[email protected]> Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(acp): keep one answer when a running tool reports progress (pingdotgg#13386) Co-authored-by: adeebahmad01 <[email protected]> Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(marketing): use the official OpenCode and Antigravity logos (pingdotgg#13365) Co-authored-by: Claude Opus 5.5 <[email protected]> * fix(observability): a malformed OTEL_RESOURCE_ATTRIBUTES no longer stops startup (pingdotgg#13469) Signed-off-by: Yordis Prieto <[email protected]> * feat(server): show and redeem Claude banked resets (pingdotgg#13118) Co-authored-by: Julius Marminge <[email protected]> Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> Co-authored-by: Julius Marminge <[email protected]> * chore(ci): use GPT 6 Sol Max for check agents (pingdotgg#13473) * fix(server): keep Codex's reset answer when the re-probe fails (pingdotgg#13363) Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> * fix(server): preserve racy edits in review diff previews (pingdotgg#12613) Co-authored-by: shivam <[email protected]> * feat(observability): honor the OpenTelemetry kill switch (pingdotgg#13355) Co-authored-by: Yordis Prieto <[email protected]> Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]> Signed-off-by: Yordis Prieto <[email protected]> * fix(shared): preserve final quoted empty CSV records (pingdotgg#11425) Co-authored-by: Simone <[email protected]> * fix(server): stop replaying old agent alerts on restart (pingdotgg#13340) * fix(providers): restore compatibility ranges for every harness (pingdotgg#13328) * fix(ci): shard release tests like pull request CI (pingdotgg#13321) * fix(sync): resolve wave1 test/build fallout from upstream rebase After rebase of 78 upstream commits (78 picks, 70 drops) onto c37294d, the following merge-conflict artefacts remained because the rebase strategy kept fork-exclusive V2/Pi source while picking upstream implementations of shared files: - packages/shared/src/usageMerge.test.ts: removed orphan nested it() declaration from commit 9, removed dangling expect+}) from rebase residue, and renamed staleEnvironments -> contractMismatches to match the upstream field that commit 9/11/13 introduced (the fork exclusively uses the contractMismatches field name). - apps/server/src/usage/usagePricing.ts: collapsed the doubly-nested conflict markers left by commits 61 and 75 in cacheSavingsUsd into the upstream clause that resolves to rateModel ?? record.model. - apps/server/src/provider/Drivers/CursorDriver.ts: replaced with the upstream main implementation so the file matches the upstream auth/modelDiscovery shape; the fork V2 Cursor path was already covered by PiAdapterV2.test.ts (61/61 green) and is not touched. - apps/server/src/provider/Layers/CursorProvider.test.ts: restored the fork-main version (252 lines) because the upstream version exercises a CursorProvider path that this fork does not implement (fork ships only the V2 Pi adapter and the legacy Cursor provider layer tests); 7/7 green. Wave1 critical-point verification (vp test): packages/shared/src/usageMerge.test.ts 30/30 apps/server/src/orchestration-v2/Adapters/PiAdapterV2.test.ts 61/61 apps/server/src/usage/UsageService.test.ts 14/14 apps/server/src/provider/Layers/CursorProvider.test.ts 7/7 apps/server/src/provider/cursorCredentialStore.test.ts 1/1 packages/shared/src/usageFormat.test.ts 9/9 packages/client-runtime/src/state/usage.test.ts 9/9 apps/server/src/serverLogger.test.ts 6/6 137/137 --------- Signed-off-by: Yordis Prieto <[email protected]> Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: Julius Marminge <[email protected]> Co-authored-by: Yordis Prieto <[email protected]> Co-authored-by: Yash Singh <[email protected]> Co-authored-by: Claude Opus 5.5 <[email protected]> Co-authored-by: Tristan Knight <[email protected]> Co-authored-by: Theo Browne <[email protected]> Co-authored-by: Bilal Bakr <[email protected]> Co-authored-by: Ryan Ilano <[email protected]> Co-authored-by: Ephraim <[email protected]> Co-authored-by: Bob Fowler <[email protected]> Co-authored-by: Ishaan Kothari <[email protected]> Co-authored-by: Shirish Pothi <[email protected]> Co-authored-by: Guillermo Casanova <[email protected]> Co-authored-by: shivam <[email protected]> Co-authored-by: Aditya Garud <[email protected]> Co-authored-by: maria <[email protected]> Co-authored-by: chukfinley <[email protected]> Co-authored-by: Primož Ajdišek <[email protected]> Co-authored-by: benthecarman <[email protected]> Co-authored-by: NaveDanan <[email protected]> Co-authored-by: Jake Leventhal <[email protected]> Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com> Co-authored-by: Julius Marminge <[email protected]> Co-authored-by: javiergusart <[email protected]> Co-authored-by: adeebahmad01 <[email protected]> Co-authored-by: oliver <[email protected]> Co-authored-by: Simone <[email protected]> Co-authored-by: Simone <[email protected]>
What Changed
Linux releases now publish a .deb alongside the AppImage, built from the same electron-builder run by adding deb to the Linux target list (plus the homepage and maintainer metadata the Debian control file requires) and including *.deb in the workflow's collect and publish steps.
Made with gpt-5.6-sol
Why
The AppImage was the only Linux artifact, so anyone who installs through a package manager had no supported path — no desktop entry, no /usr/bin entry, and no dpkg/apt upgrades — and since the .deb reuses the already-staged app, the release gains it without a second build
UI Changes
None
Checklist
Note
Low Risk
Changes are limited to Linux packaging metadata, release asset globbing, marketing download links, and tests; no auth, server, or updater behavior changes beyond documenting AppImage-only updates.
Overview
Linux desktop packaging now produces a companion
.debfrom the same electron-builder run as the AppImage by extending the Linux target list withdeb, and settinglinux.maintainerplus stagedhomepagemetadata required for Debian control files.The release workflow collects and publishes
*.debwith the other desktop assets. The marketing download page adds a Debian/Ubuntu.debcard, and internal docs describe the new artifact.In-app auto-updates on Linux remain AppImage-only;
.debinstalls are manual viadpkg/apt.Reviewed by Cursor Bugbot for commit a81713a. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Add Linux .deb package to desktop releases
build-desktop-artifact.tsto build adebtarget alongside theAppImageon Linux, settingDESKTOP_LINUX_MAINTAINERandhomepagemetadata required for Debian control files.*.debfiles to GitHub Releases alongside existing artifacts..debartifact..deb; the.debis manual-install only — in-app updates on Linux remain AppImage-only.Macroscope summarized a81713a.