Skip to content

feat(linux): packaged AppImage + release workflow (#168) - #171

Open
jonocodes wants to merge 1 commit into
mainfrom
feat/linux-appimage-168
Open

jonocodes wants to merge 1 commit into
mainfrom
feat/linux-appimage-168

Conversation

@jonocodes

Copy link
Copy Markdown
Owner

Closes nothing yet — Phase 0 of #168. The AppImage build and the privileged flow need a real Linux desktop, so this stays open with human-verification-required after merge.

What

Zero-toolchain Linux install. A self-contained AppImage carries a private Python runtime, the built client, and the layouts; a small sudo helper owns the parts an AppImage cannot (udev rule + input group) plus the user-level pieces (desktop focus watcher, XDG autostart).

Changes

  • packaging/linux/ — PyInstaller onedir spec + launcher.py, AppDir glue (AppRun, deckd.desktop), and install-system-integration.sh (idempotent, with --uninstall).
  • daemon/deckd/app_bundle.py — platform-agnostic packaging helpers extracted from macos_app so the macOS and Linux bundles can't drift; macos_app re-exports them unchanged.
  • daemon/deckd/linux_app.py — XDG data dir/log, layouts.linux overlay, first-run seeding, build_argv.
  • .github/workflows/release-linux.yml — x86_64 + aarch64 matrix, --help smoke test, attaches the AppImages and the helper script to the tag.
  • Justfile — build-linux-appimage, install-system-integration.
  • Docs — ADR-0012 (AppImage primary; Flatpak/Snap rejected) and a GUIDE section.

Decision

AppImage, not Flatpak/Snap: a sandbox cannot write the udev rule, see /dev/uinput, reach the session bus unfiltered, or install the compositor plugin. The root step is unavoidable on every channel, so it's an explicit sudo helper. Details and rejected options in ADR-0012.

Verification

  • pytest — 681 passed, 89 skipped (skips pre-existing), including the macOS bundle tests through the app_bundle refactor.
  • pyright daemon — clean on the new/changed files (only the pre-existing dbus_fast resolution noise).
  • bash -n + --help / bad-flag checks on the helper; Justfile parses; workflow YAML parses.

Not verified (needs a Linux box)

  • just build-linux-appimage (appimagetool needs Linux).
  • The real udev/group/watcher/autostart flow and input injection on a desktop session.

Zero-toolchain Linux install: a self-contained AppImage carrying a private
Python runtime, the built client, and the layouts, plus a `sudo` helper that
installs the pieces an AppImage cannot own.

- packaging/linux: PyInstaller onedir spec + launcher, AppDir glue (AppRun,
  deckd.desktop), and install-system-integration.sh (udev rule + input group;
  GNOME/KWin focus watcher; XDG autostart; --uninstall).
- daemon/deckd/app_bundle.py: platform-agnostic packaging helpers extracted
  from macos_app so the two bundles cannot drift; macos_app re-exports them.
- daemon/deckd/linux_app.py: XDG data dir/log, layouts.linux overlay, argv.
- .github/workflows/release-linux.yml: x86_64 + aarch64 matrix, --help smoke
  test, attaches the AppImages + the helper script to the tag.
- Justfile: build-linux-appimage, install-system-integration.
- docs: ADR-0012 (AppImage primary; Flatpak/Snap rejected) and a GUIDE section.

Channel rationale in docs/adr/0012-linux-distribution-appimage.md.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant