feat(linux): ship a Flatpak bundle with each release - #957
Closed
AalmanSadath wants to merge 3 commits into
Closed
Conversation
The .deb/.rpm/.pkg.tar.zst cover the distributions that use them, and leave out the ones that use neither: the immutable distributions especially, where Flatpak is simply how software is installed. This adds a single-file .flatpak bundle per architecture to the release assets, beside the packages already there. A bundle is a one-time install rather than a subscription, since there is no remote for `flatpak update` to check. That is the deliberate limit of this change: closing it needs a repository to host and sign, which is a bigger decision than adding a build artifact, and it can be taken later without undoing any of this. The build is its own leg rather than part of linux-packages. It compiles the workspace again inside the Flatpak SDK, where the runner's rust-cache cannot reach, so folding it in would tie a thirty-minute job to an hour-long one and lose the .deb whenever the Flatpak build failed. It rides the same best-effort path as the Windows and Linux package legs: a failure costs the bundle, not the release. AppStream is stamped from the tree being built, never from an input. The version comes from the workspace and the date from the commit, so a rebuild of an old tag cannot claim to have been released the day it was rebuilt, and the label cannot drift from the binaries it names. Verified locally end to end: flatpak-builder and build-bundle both exit 0, and the resulting 23 MB bundle imports with all four binaries, the stamped version, the udev rules, every icon size and the runtime repo embedded.
The Linux section listed the three package formats and nothing for the distributions that use none of them, which is the gap the bundle exists to fill. Host setup is one command rather than the usual block. The rules are read out of the installed application, so it needs no checkout and no cloned repository, and nothing extra is needed for /dev/uinput: the rules already create its node with static_node=uinput and opening it loads the module, which is why no packaging here ships a modules-load.d entry either. Also says what the bundle is not. There is no remote behind it, so `flatpak update` has nothing to check, and the agent is launched by the application rather than by a user service — so the systemctl line below it does not apply. Verified the one-liner against an installed bundle: it reproduces the tracked rules file byte for byte.
Greptile SummaryThe PR adds amd64 and arm64 Flatpak bundles to the Linux build and release pipeline.
Confidence Score: 5/5The PR appears safe to merge. No blocking failure remains; the previously omitted Flatpak signature is now generated and verified before release publication.
|
| Filename | Overview |
|---|---|
| .github/workflows/build.yml | Adds native amd64 and arm64 Flatpak builds, artifact uploads, and reusable-workflow result reporting. |
| .github/workflows/release.yml | Integrates Flatpak bundles into checksum generation, minisign signing, R2 upload, and conditional GitHub Release publication. |
| packaging/linux/flatpak/org.openlogi.OpenLogi.yml | Defines the Flatpak runtime, permissions, complete application payload, and desktop integration. |
| README.md | Documents bundle installation, lack of automatic updates, and required host udev setup. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart LR
S[Tagged source tree] --> B[Flatpak build matrix]
B --> A[Architecture-specific bundles]
A --> D[Release artifact download]
D --> C[SHA256SUMS]
D --> M[Minisign signing and verification]
C --> R[GitHub Release and R2]
M --> R
Reviews (2): Last reviewed commit: "fix(ci): sign the Flatpak bundles like e..." | Re-trigger Greptile
The minisign loop covers the DMGs, the Windows zip/msi and all three Linux package formats, and its own comment says why: manual verification today, and the future auto-updaters need a detached signature to exist for every shipped version. The bundle was left out of it. That mattered in two places, not one. It is attached to the GitHub Release, and the R2 step copies dist/ wholesale, so the bundle was already being published to both without a .minisig beside it — the one installer a user could not verify. The signatures themselves need no further wiring: dist/*.minisig is already listed unconditionally in the release assets and R2 excludes only latest.json and the exes. Reported by Greptile on AprilNEA#957.
Collaborator
|
Duplicate of #767 closing. |
AalmanSadath
added a commit
to AalmanSadath/OpenLogi
that referenced
this pull request
Aug 25, 2026
The minisign loop covers the DMGs, the Windows zip/msi and all three Linux package formats, and its own comment says why: manual verification today, and the future auto-updaters need a detached signature to exist for every shipped version. The bundle was left out of it. That mattered in two places, not one. It is attached to the GitHub Release, and the R2 step copies dist/ wholesale, so the bundle was already being published to both without a .minisig beside it — the one installer a user could not verify. The signatures themselves need no further wiring: dist/*.minisig is already listed unconditionally in the release assets and R2 excludes only latest.json and the exes. Reported by Greptile on AprilNEA#957.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a
.flatpakbundle per architecture to the release assets, beside the.deb/.rpm/.pkg.tar.zstalready there. One new job in the existing buildmatrix, and four small edits to
release.ymlto attach what it produces.It deliberately stops there. A bundle is a one-time install: there is no remote
behind it, so
flatpak updatehas nothing to check. Closing that needs arepository to host, sign and keep alive, which is a bigger decision than adding
a build artifact, #767 proposes exactly that, and this PR is the subset that
does not commit you to any of it.
Changes
packaging/linux/flatpak/(new)org.openlogi.OpenLogi.yml— freedesktop 25.08 runtime,llvm20SDKextension (openlogi-camera pulls
v4l2-sys-mit, whose build script runsbindgen and dlopens libclang; the base SDK ships none), and rustup rather than
Sdk.Extension.rust-stable, because the extension trailsrust-versionandcargo refuses outright when it does. Source is
type: dirof the checkout, soa release builds exactly the tagged tree.
org.openlogi.OpenLogi.metainfo.xml— AppStream, required for softwarecentres to list the app. There is none in the tree today.
org.openlogi.OpenLogi.desktop— Flatpak requires the entry to be named forthe application ID, which
packaging/linux/desktop/openlogi.desktopis not.Permissions worth reviewing:
--device=allis the only one covering both/dev/hidraw*and/dev/uinput—--device=inputcovers neither. It grants apath to those nodes, not DAC permission; the host still needs
70-openlogi.rules, exactly as the.debdoes.--share=networkis for thedevice render images. Solaar carries the same
--device=allon Flathub for thesame reason.
.github/workflows/build.ymllinux-flatpakjob, matrixamd64/arm64on the same runners aslinux-packages, wired intoresultsand theworkflow_calloutputs.linux-packageson purpose: it compiles the workspace againinside the Flatpak SDK, where the runner's rust-cache cannot reach, so folding
them together would lose the
.debwhenever the Flatpak build failed.commit — never from an input, so a rebuild of an old tag cannot claim to have
been released the day it was rebuilt.
.github/workflows/release.ymlDownloads
OpenLogi-linux-flatpak-*, adds*.flatpaktoSHA256SUMS, addsflatpakto the best-effort detection loop, and adds the conditional entry tosoftprops'
files. It rides the existing degradation path:publishgates onlyon
macos_result, so a failed Flatpak leg costs the bundle, not the release.README.md— the Flatpak bundle in the Linux section, with the host udevsetup as one command.
Testing
Dispatched
Releaseon the branch (publish skipped,ref_type != 'tag'):linux-flatpak (amd64)— passlinux-flatpak (arm64)— passlinux-packages— pass; macOS/Windows legs fail in a fork for want of signingsecrets, which is expected and unrelated
Locally, from the repository root:
Both exit 0 in ~10 minutes; metainfo and desktop validate. Re-imported the
bundle and confirmed the contents: all four binaries, the stamped version,
70-openlogi.rules, every icon size, and the runtime repo embedded.Installed the amd64 CI artifact on Fedora 44 —
flatpak listshows it at0.7.10. device access depends on the host udev rules, which that machine already had.
The
release.ymlhalf is not exercised by any of the above, becausepublishneeds a tag and a successful macOS leg, which a fork cannot produce. I ran its
shell against a fabricated
dist/instead: with bundles present both land inSHA256SUMSandflatpak=true; with the leg failed, checksums still generateand
flatpak=false, sofail_on_unmatched_filesdoes not trip.Notes for review
should-buildreturnsfalseforpull_requestwithout theneeds: buildlabel, so a green check here has notrun the new job. Worth labelling before judging it.
publishhasneeds: build, so a release now waits for the Flatpak legs eventhough it does not depend on them. Measured ~15 minutes cold on
ubuntu-latest;timeout-minutes: 45is a hang bound, not an estimate.user-visible in
flatpak list, not only on the release page.Fix #371