Repository navigation
Conversation
Linux users can only install T3 Code from an AppImage today, which means no desktop entry, no icon, no dependency resolution, and no package manager integration unless they wire it up themselves. The build script already forwarded `--target` to electron-builder, but a deb build aborted because fpm requires a project homepage and a `Name <email>` maintainer that the generated config never set. Adding those two fields makes `--target deb` work, and the release workflow now repackages the already-compiled Linux app into a .deb and attaches it to the GitHub Release. electron-builder writes update metadata for every fpm target, so the deb build would clobber the AppImage updater manifest. Since Linux auto-update only supports the AppImage, the workflow stashes and restores that manifest around the deb step. Built and verified locally on Ubuntu 24.04: correct control fields, all nine hicolor icon sizes, valid desktop entry, and every declared dependency resolvable. Generated with claude-opus-5 running in opencode.
|
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: Approved a37813e This PR adds .deb packaging to the Linux release workflow without modifying runtime behavior. Changes are additive CI/CD configuration with proper manifest handling to preserve AppImage updates, appropriate constants for fpm requirements, and test coverage. You can customize Macroscope's approvability policy. Learn more. |
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.
|
you can just use gear lever to manage appimages, it has desktop integration & supports auto update: https://github.com/mijorus/gearlever |
|
@masterflitzer Thanks — Gear Lever is definitely a valid option for people who want to manage AppImages. I'm not making any claim about Gear Lever's maintainer or the quality of the project. My concern is that, because of what it does, its Flatpak package currently requires fairly broad permissions, including read/write access to the host filesystem, network access, /tmp, and access to the Flatpak interface. That's also why Flathub marks it as "potentially unsafe." The goal of this PR is to make T3 Code itself integrate natively with the Debian/Ubuntu ecosystem: install/uninstall through the system package manager, dependency resolution, desktop entry/icon integration, and a familiar installation path for users who may not even know what an AppImage manager is. I think that's particularly worthwhile for a project like T3 Code. Making the Linux experience closer to the Windows/macOS experience lowers the barrier for non-developers as well, and gives the project a better foundation for future distro/repository distribution. |
|
@NaveDanan i get your point, but imo time & additional maintenance burden is better invested in more/better cross distro solutions, e.g. something specific for debian/ubuntu won't be useful for someone using fedora etc. another option that comes to mind is to extend homebrew support of t3code from macos only to linux brew as well, that way everybody on linux benefits from a simpler update experience and i guess it'll be much easier to maintain given t3code already supports brew (assuming one is willing to use brew of course, but gh & glab clis for instance which are supported by t3code are also primarily distributed on linux brew, i'd imagine for similar reasons) all this is obviously for the mainteners to decide, i'm just trying to give helpful input as a fan of this project |
|
Note 🤖 GPT-5.6 Sol responding on behalf of Theo Closing this PR after an automated pass over open pull requests. Theo already rejected adding more Linux package formats to release CI. External package mirrors exist. |
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]>

Problem
Linux is the only platform where T3 Code ships a single artifact. The AppImage works, but installing it leaves users without a desktop entry, an icon, dependency resolution, or any package manager integration unless they wire all of it up by hand.
.debcovers the large majority of Linux desktop users and costs one extra packaging pass over an app we have already compiled.What changed
Made
--target debactually work.scripts/build-desktop-artifact.tsalready forwarded--targetstraight through to electron-builder, sodeblooked supported. It was not: fpm aborts unless it can resolve a project homepage and aName <email>maintainer, and the generated config set neither, because AppImage never needed them.Two fields fix it —
homepageon the stagedpackage.jsonandlinux.maintainer, which becomes both the debMaintainerandVendor.Release workflow builds and publishes it. A platform-gated step reruns packaging with
--skip-build, reusing the app the AppImage step already compiled, then.debis added to the collect and publish globs. This deliberately avoids a second Linux matrix leg, which would have duplicated a ~25 minute compile and collided on thedesktop-linux-x64andresource-monitor-linux-x64artifact names.Guarded the updater manifest.
FpmTargetsetsisWriteUpdateInfo: true, exactly likeAppImageTarget, so the deb build overwriteslatest-linux.yml.DesktopUpdates.tsrefuses to install any Linux update unless the app is running from an AppImage, so an unguarded version of this change would publish a manifest pointing at a.debthe app rejects and silently break auto-update for every existing AppImage user. The workflow stashes the manifest and restores it after packaging.Also adds
vp run dist:desktop:linux:debfor local parity withdist:desktop:linux, and documents the artifact plus the update caveat.Verification
Built end-to-end on Ubuntu 24.04 at v0.0.31:
assets/prod/black-universal-1024.png.StartupWMClass=t3code; postinst registers/usr/bin/t3codeand handleschrome-sandboxpermissions.libgtk-3-0andlibatspi2.0-0via thet64packages thatProvidethem).linux.maintaineris removed, so the build break cannot silently return.vp test run scripts/build-desktop-artifact.test.ts(31 passed),scriptstypecheck, lint, andfmt:checkall clean.set -euo pipefail, including the case where no manifest exists.Notes for reviewers
The maintainer address needs your call. The repo has no packaging contact anywhere, so
[email protected]is a placeholder derived from the site. It gets baked permanently into every published package — please replace it if there is a real address.In-app updates are intentionally not enabled for deb. The
.debships bothapp-update.ymland electron-builder'spackage-typemarker, soelectron-updaterwould selectDebUpdater, but T3's own Linux gate blocks it first and deb users will see "Automatic updates on Linux require running the AppImage build." Turning that on means accepting apkexec dpkg -iprompt per update and pointing the feed at the deb, which is a separate decision I did not make here. Most distro-packaged apps leave updates to the package manager.Scope.
.snapwas built and verified alongside this but is deliberately excluded: it needs a Snap Store account, credentials, and manual review for classic confinement, which is a product decision rather than a packaging one. Happy to open it separately if wanted.Per
CONTRIBUTING.mdI recognise this may not be something you want right now — close it freely if so.Generated with claude-opus-5 running in opencode.
Note
Medium Risk
Release workflow changes affect Linux updater metadata and published assets; incorrect manifest handling could break AppImage auto-update, though the backup/restore step mitigates that. Maintainer email is baked into every deb package.
Overview
Adds a Linux
.debto release artifacts so Debian/Ubuntu users can install via the package manager, while in-app auto-update stays AppImage-only.The desktop packager now supplies homepage and
linux.maintainer(fpm requirements fordeb) on the stagedpackage.jsonand Linux build config, plus adist:desktop:linux:debscript and a regression test so deb builds cannot break silently.The release workflow runs a second Linux packaging pass with
--skip-buildafter the AppImage step, backs up and restores*-linux*.ymlupdater manifests (deb packaging would overwrite them with.debmetadata the app refuses to install), and includes.debin collect/publish globs. Docs note the deb vs AppImage update behavior.Reviewed by Cursor Bugbot for commit a37813e. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Publish a Linux .deb package alongside the AppImage in release builds
dist:desktop:artifactwith--target debafter the AppImage is built, stashing and restoring the AppImage update manifest so it isn't overwritten by the.debbuild.maintainerandhomepagemetadata to the Linux build config in build-desktop-artifact.ts, which are required by electron-builder's fpm-backed targets like.deb.dist:desktop:linux:debnpm script inpackage.jsonfor local builds..debpackage; only the AppImage supports update delivery.Macroscope summarized a37813e.