Publish OrcaSlicer to the Snap Store (classic confinement) on channels matching the release tiers: stable / candidate / beta / edge. The Linux build (both arches) repackages the AppImage AppDir into a snap; nightly builds go to edge, and tagged releases publish to the matching channel. Stacked on the Linux ARM64 AppImage change.
Snap packaging
OrcaSlicer ships a snap built by repackaging the AppImage
build output (build/package) — the compiled binary, bundled private libraries and resources
are reused as-is.
The snap uses classic confinement: like the AppImage, it runs in the host namespace and
resolves the desktop stack (GTK / WebKitGTK / GStreamer / GLU) from the host. Classic is required
for full hardware/filesystem access — notably the 3D mouse (3Dconnexion SpaceMouse via the host
spacenavd socket at /run/spnav.sock), which no strict-confinement interface can reach.
snapcraft.yaml— the manifest (plugin: dumpofbuild/package, classic confinement).local/launcher— the runtime wrapper (setsLD_LIBRARY_PATH,LC_NUMERIC=C,SPNAV_SOCKET).
CI flow
| Trigger | Where | Snap action |
|---|---|---|
push to main |
build_orca.yml (amd64 + aarch64) |
build both arches + publish to edge |
| PR | (none) | snap is not built on PRs (the AppImage build still runs) |
| release (manual) | publish_release.yml |
push the build run's .snap artifacts to the channel below |
The snap is Store-only — unlike the AppImage/Flatpak it is not attached to GitHub releases
(a downloaded .snap is useless without snap install). Both arches go through the same
build_orca.yml Linux build, reusing the AppDir (build/package) it just produced for the snap.
build_all.yml's build_linux job matrixes over amd64 and aarch64 on every event; aarch64 always
uses a GitHub-hosted arm runner (amd64 honors the self-hosted runner when configured).
Channel mapping (tag suffix → Snap Store channel)
| Tag | Channel |
|---|---|
vX.Y.Z (release) |
stable |
-rc / -rcN |
candidate |
-beta / -alpha |
beta |
nightly (push to main) |
edge |
One-time maintainer setup
snapcraft loginthensnapcraft register orcaslicer(the name must be free; if not, changename:insnapcraft.yamland the asset names in the workflows).- Request classic confinement for
orcasliceron the snapcraft forum (Store Requests category). Justification: a desktop slicer needs the hostspacenavdsocket (/run/spnav.sock) for 3D mice plus arbitrary user/network filesystem paths that strict interfaces cannot provide. Until this is granted, uploads to every channel are held for manual review, so the automated publish below will not go live yet. - Export CI credentials:
snapcraft export-login --snaps orcaslicer --channels stable,candidate,beta,edge --acls package_push,package_release exported.txt - Add the file contents as the GitHub Actions secret
SNAPCRAFT_STORE_CREDENTIALS.
Notes
- Cross-distro library behavior matches the AppImage (relies on host libs): the host must provide the GTK/WebKitGTK/GStreamer/GLU/OpenGL stack (the same packages the AppImage documents).
- The
classic/librarysnapcraft linters are silenced insnapcraft.yamlbecause they assume a self-contained snap and would flag every host-resolved library. Runtime smoke tests are the real check.
Local build / test
sudo snap install snapcraft --classic
sudo snap install lxd && sudo lxd init --auto
./build_linux.sh -dsir -l -L # produces build/package
snapcraft # -> orcaslicer_<ver>_amd64.snap
sudo snap install --dangerous --classic ./orcaslicer_*.snap
snap run orcaslicer
# Smoke test: load an STL, slice, USB/serial printer, network share, and a SpaceMouse if available.