Linux release archive and FlatPark packaging
Vixen publishes one official x86_64 Linux archive on GitHub Releases. FlatPark repackages those unchanged, checksum-pinned bytes as a signed Flatpak. Vixen no longer builds or hosts its own OSTree repository.
Priority gate: this document is a deferred release runbook. Keep the official archive reproducible, but do not submit, review, or publish through FlatPark until the Linux Flutter shell passes the basic-browser gate defined in
../ROADMAP.md(visible navigation/rendering, scrolling, text/IME, core navigation controls, find/zoom, and bounded recovery).
This deliberately separates two responsibilities:
- Vixen CI builds and tests
vixen-linux-x86_64.tar.gzfrom the tagged source revision. - FlatPark pins that public release asset by URL, size, and SHA-256, adds the minimal wrapper/metadata/permissions, and signs and hosts the Flatpak.
FlatPark is an independent community repository, not Flathub. Its runtime dependencies are supplied through Flathub.
Pinned build inputs
The release archive uses:
- official Flutter stable
3.47.1from the checksum-pinned Linux x64 archive declared in.mise.toml; - Flutter revision
6655482ec06e547f90abf8ae7590466f4415978d; - engine revision
5d531788691ec3404cac0cee66ead4007b177363and engine content hash11d79658c444477b06513d32b52c8c4ccb7276b0; - SDK archive SHA-256
a1d8166c0309267cb7dc99f1424eecf08b86946ad3b50723c6f59945964aea45; - GNOME 50 Linux builder image digest
sha256:a2b78890f165cd5b5c6a8629c5f6cb293e64d1bf523ca6662fac8ca8e247f8b0; - Rust
1.96.1; Cargo.lockandflutter/vixen_shell/pubspec.lock; and- rusty_v8
v149.4.0archive SHA-256aa30f198b6e7be2188df6498f95053c4c052f212037a01f2c31414d7aca84b53.
The Linux runner explicitly enables Impeller and links
libflutter_linux_gtk.so; archive validation requires GTK3 linkage and rejects
debug/JIT artifacts. A version string alone is not runtime evidence.
Local build and smoke
On a host with the native packages from mise.md (or inside the
optional Ubuntu 24.04 Distrobox), install the Mise tools, ensure Docker is
reachable, pull the GNOME builder image, stage locked inputs, then build the
exact release archive:
mise install
just docker-builder-pull
just linux-release-prefetch
just linux-release-smoke
The host needs Docker plus Cage with wlroots' headless backend; the packaged
Linux GUI supports native Wayland only. The script pulls/inspects/runs the
existing image and does not build a custom image. Prefetch is network-capable;
the release build runs with --network=none from workspace-local caches.
linux-release-smoke:
- builds Flutter in release/AOT mode;
- builds the BrowserCore-backed
libvixen_ffi.sothrough the Flutter runner; - verifies GTK3 linkage and the expected release bundle structure;
- creates a deterministic archive with normalized ownership and timestamps;
- extracts that exact archive into a clean directory;
- launches it under Cage's headless Wayland backend on the Linux host;
- requires survival to the bounded timeout; and
- requires
Using the Impeller rendering backend (...)in the engine log.
Generated assets are:
.tmp/release/vixen-linux-x86_64.tar.gz
.tmp/release/vixen-linux-x86_64.tar.gz.sha256
The archive has one top-level vixen/ directory containing the Flutter runner,
AOT app, Flutter engine, ICU/assets, and libvixen_ffi.so. It excludes source,
build tools, caches, JIT snapshots, and debug payloads.
CI and tagged releases
The Linux release archive CI job invokes the same digest-pinned, offline
Docker build recipe as local development. Ubuntu 24.04 owns only the host smoke
environment. CI creates the archive twice and byte-compares the outputs,
extracts and launch-smokes the exact archive, and uploads it as a workflow
artifact. On a tag, the release job attaches the archive and checksum to the
GitHub Release.
A release is not ready merely because the archive exists. The framework and engine revisions, native layout, deterministic archive, bounded launch, and Impeller log must all pass.
FlatPark submission
This section is intentionally inactive while the basic-browser gate is open.
The FlatPark registry entry uses extra-data and an immutable GitHub Release
asset URL. Its update resolver reads Vixen's latest GitHub Release and selects
vixen-linux-x86_64.tar.gz; FlatPark computes and reviews the new size and
SHA-256 before publishing.
The package may install wrapper, desktop, icon, and AppStream files around the archive, but it must not patch or replace Vixen's binaries. Permissions stay at the minimum needed for browser operation: the Wayland socket (without X11 or fallback-X11), GPU, IPC, network, and the explicit download directory grant. Optional broader host access is not enabled.
Before submitting an update:
- install and launch the release archive locally;
- cut and verify the GitHub Release;
- update the FlatPark registry entry to that immutable asset;
- run FlatPark's descriptor validator and
publish.sh --verify; - install from the isolated test repository and exercise startup/navigation;
- record tested and untested behavior in the pull request.
FlatPark's publishing and review requirements are authoritative: https://flatpark.org/contributing/.
Evidence boundary
FlatPark simplifies packaging and signed repository maintenance; it does not build Vixen or prove browser correctness. GitHub Releases remain the authoritative upstream bytes. Platform parity, portals, complete accessibility/native AT, IME, performance, and accepted size baselines remain separately gated.