flatpak: stamp the version and arch in the build script, and name the bundle by arch - #10

Merged
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel
Aug 21, 2026
Merged

flatpak: stamp the version and arch in the build script, and name the bundle by arch#10
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel

Conversation

@Ryanmello07

@Ryanmello07Ryanmello07 commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Stacked PR — depends on #5, #7 and #9 (metainfo).
Opened against main because a cross-fork PR needs its base branch to exist in
this repo, so the diff below currently includes its parent's changes too.
Review after its parent lands.


Three defects in the Flatpak path. All three only show up in a shipped artifact,
never at build time.

1. Every build reported 0.0.0

The committed manifest carries no -Dapp_version, so meson falls back to its dev
sentinel. That is not cosmetic here: the Flatpak is the only artifact that
installs the AppStream metainfo
packaging/lib/common.sh's
assemble_daemon_root() whitelist excludes usr/share/metainfo, and
make-appimage.sh does not package it either — and that file is what GNOME
Software, KDE Discover and the Flathub page read. A 0.0.0 there is valid
AppStream, so nothing rejects it; it just appears on the store page.

make-flatpak.sh now stamps -Dapp_version into a copy of the manifest
before the build, leaving the developer's working tree untouched, and refuses
to continue
if the config-opts anchor it keys off has moved — rather than
silently building an unstamped bundle. It is done in the script rather than in
the release workflow so a local --install and a CI build produce the same
version.

2. No -Dsdk_arch

flatpak-builder builds for the machine it runs on, so the value is derived from
uname -m and stamped alongside the version. Overridable with ARCH= for the
rare cross case, with an explicit error on an unrecognised machine.

3. Both architectures wrote the same bundle filename

URnetwork-<version>.flatpak carries no arch, so the amd64 and arm64 legs
collide and one silently overwrites the other wherever the artifacts are
collected. The bundle is now URnetwork-<version>-<arch>.flatpak, matching what
every other script in packaging/ already does: the build script names its own
output rather than leaving a workflow to rename it.

Manifest header

Updated to say "go through make-flatpak.sh", and to add the third Flathub
prerequisite alongside the two already documented: Flathub builds this manifest
on its own infrastructure, where make-flatpak.sh never runs, so
-Dapp_version has to be written into config-opts before submission or the
listing shows 0.0.0.

The launcher gains a Flatpak fallback

app/packaging/urnetwork-launcher now falls back to flatpak run com.bringyour.network as its last candidate. Last on purpose: the Flatpak
exports its own desktop entry under the same app id, so on a Flatpak machine this
launcher normally loses on XDG precedence and is never invoked at all. It is
reached only when that export is missing or shadowed — and in exactly that case
the old behaviour was to tell the user to download a GUI they already had
installed.

Verified

bash -n on the script and the launcher (also sh -n, since the launcher is
POSIX sh); the manifest parses as YAML before and after the stamping sed is
applied for real, and the stamped config-opts land in the right module.

Why this is split this way

This is the Flatpak's build plumbing, which is a different review than "what
does the store listing say" (PR 4) or "what is the app id" (PR 2). The launcher
change rides along because it is the same question from the other side — how a
machine that has the Flatpak finds it.

The Android and Apple clients ship under `com.bringyour.network`. Linux was
the only platform on a different reverse-DNS id, and every place the id is
written down had to be told which one to use. This makes Linux match, and it
has to be done in one change because the id is a join key: the GTK
application id, the .desktop basename, the AppStream component id, the polkit
action namespace, the icon-theme name and the Flatpak app id must all agree or
the desktop stops recognising the app.
WHAT MOVES, AND WHY IT IS ALL ONE COMMIT
main.cpp Gtk::Application::create() -- the GApplication id
*.desktop filename, Icon=, StartupWMClass=
metainfo.xml filename, <id>, <launchable>
polkit .policy filename + all four action ids, matched in
ControlProtocol.hpp so the daemon asks about the
actions the file actually declares
icons hicolor basenames; Flatpak refuses to export an icon
whose name is not the app id
flatpak manifest filename + id + the desktop-file-edit paths
deb/rpm/tarball/ the installed paths, the conffile entries, and the
AppImage/snap uninstaller's stale-path list
Splitting these would leave an intermediate commit where, for example, the
.desktop names an icon that does not exist, or the daemon checks polkit
actions the shipped .policy does not declare -- both of which fail silently
at runtime rather than at build time.
TWO THINGS THAT ARE NOT PURE SEARCH-AND-REPLACE
1. `UrTheme::kAppIconName`. The icon name was spelled as a literal in two
places -- the by-path load in UrTheme.cpp and the by-name fallback in
MainWindow.cpp. Renaming the packaging alone left both lookups pointing at
a file that no longer existed, and `set_from_icon_name()` renders a blank
image without raising anything, so the title-bar logo simply went empty.
It is now one constant that the packaging and both call sites share.
2. The libsecret keyring attribute in SecretServiceRpcSessionStore.cpp moves
with the id. This is deliberately NOT dual-read: an entry written by an
older build is no longer found, the app falls back to a fresh RPC session
(the same one-time cost as the Flatpak data path moving), and the previous
app identity is not left holding live key material in the user's keyring
with nothing to clean it up.
No behaviour changes beyond those two. `network.ur.urnetwork` no longer
appears anywhere in the tree.
Two separate problems with the shipped icon, both visible on a normal desktop.
TRANSPARENCY. The old artwork had an opaque background baked in, so the icon
rendered as a square tile wherever the shell composites over its own surface
-- the GNOME dash, the app grid, and the window's own title bar. The
replacements are RGBA with a real alpha channel.
SIZES. Only 48 and 256 were installed. The desktop asks for 64 in the app
grid and 128/256 on a HiDPI display, and hicolor's fallback is to scale the
nearest size it has, so those lookups were served an upscale. This installs
48, 64, 128, 256 and 512.
All five are downscales of a single 1024x1024 master, taken from the same
AppIcon artwork the Apple client ships, so they cannot drift apart the way
separately-drawn assets do. The master is committed at
packaging/icons/com.bringyour.network-master-1024.png for regenerating them.
512 IS THE CEILING, DELIBERATELY. Installing the 1024 breaks the Flatpak
build outright: `flatpak build-export` refuses it with "Image too large
(1024x1024). Max. size 512x512" and fails the whole build at export time.
Nothing downstream wants a larger one -- Flathub renders the store page at up
to 512 -- so the master is kept in the tree but not installed.
app/meson.build (the Flatpak's installer) and packaging/lib/common.sh (the
staging tree the .deb, .rpm and tarball are all built from) now list the same
five sizes, and the tarball uninstaller removes all five; a size installed by
one and forgotten by the other is a file left behind on uninstall.
…validate it
Three things the AppStream metadata needed before it could be submitted
anywhere, and one reason nothing caught them.
1. THE RELEASE VERSION WAS HARDCODED, so it was wrong. Nothing wrote it, so
the file said whatever was typed into it last while the pipeline shipped a
different version. This element is not decoration: GNOME Software, KDE
Discover and the Flathub page all read <release version=...> and show it.
The file becomes a configure_file() template. app/meson.build derives both
attributes from -Dapp_version, which the pipeline already passes and which
both binaries already compile in as UR_APP_VERSION, so there is now exactly
one place the release version is written down.
The FULL version is stamped, suffix and all. appstreamcli accepts it, and
truncating would advertise a version matching no artifact -- every other
consumer of $VERSION (both binaries, every package filename, the
release-asset gates) uses the whole string -- and would collapse every
build of the same UTC day into one indistinguishable release element. Only
the date is derived, from the leading <YYYY>.<M>.<D>.
When -Dapp_version is not passed, meson warns loudly. That branch cannot be
caught any other way: a document saying version="0.0.0" is perfectly valid
AppStream, so no validator objects -- it just appears on the store page.
2. NO SCREENSHOT. Flathub requires at least one, and it is the single largest
thing a store listing is judged on. Added as a committed PNG plus the raw
URL Flathub mirrors from; a repo-relative path does not work, because the
mirror step runs on a build host with only the URL. The declared width and
height match the file exactly, which Flathub's linter checks.
3. NOTHING VALIDATED THE FILE. That is how (1) survived. appstreamcli is the
validator Flathub gates submissions on, so it now runs in two places
against the GENERATED file rather than the template: as a meson test
(optional -- not every build host has appstreamcli) and as a CI step in the
gui job, which is the one that always has it.
Verified: `appstreamcli validate --no-net --pedantic` passes on the stamped
output for a real release version and for the 0.0.0 sentinel, and the date
derivation was exercised for zero-padded and unpadded month/day.
… bundle by arch
Three defects in the Flatpak path, all of which only show up in a shipped
artifact rather than at build time.
1. THE BUILD REPORTED 0.0.0. The committed manifest carries no -Dapp_version,
so meson falls back to its dev sentinel. That is not cosmetic here: the
Flatpak is the ONLY artifact that installs the AppStream metainfo
(packaging/lib/common.sh's assemble_daemon_root() whitelist excludes
usr/share/metainfo, and make-appimage.sh does not package it), and that file
is what GNOME Software, KDE Discover and the Flathub page read. A 0.0.0
there is valid AppStream, so nothing rejects it -- it just appears on the
store page.
The script now stamps -Dapp_version into a COPY of the manifest before the
build, leaving the developer's working tree untouched, and refuses to
continue if the config-opts anchor it keys off has moved rather than
silently building an unstamped bundle. It is done here rather than in the
release workflow so that a local `--install` and a CI build produce the same
version.
2. NO -Dsdk_arch. flatpak-builder builds for the machine it runs on, so the
value is derived from `uname -m` and stamped alongside the version;
overridable with ARCH= for the rare cross case.
3. BOTH ARCHITECTURES WROTE THE SAME BUNDLE FILENAME. `URnetwork-<version>.flatpak`
carries no arch, so the amd64 and arm64 legs collide and one silently
overwrites the other wherever the artifacts are collected. The bundle is now
`URnetwork-<version>-<arch>.flatpak`, matching what every other artifact in
packaging/ already does: the build script names its own output.
Also documents the manifest header accordingly -- go through make-flatpak.sh
rather than calling flatpak-builder directly -- and adds the third Flathub
prerequisite: Flathub builds the manifest on its own infrastructure where this
script never runs, so -Dapp_version has to be written into config-opts before
submission or the listing shows 0.0.0.
The `urnetwork` launcher script gains the Flatpak as its last fallback. It is
last on purpose: the Flatpak exports its own desktop entry under the same app
id, so on a Flatpak machine this launcher normally loses on XDG precedence and
is never invoked. It is reached only when that export is missing or shadowed --
and in exactly that case the old behaviour was to tell the user to download a
GUI they already had installed.
@Ryanmello07Ryanmello07 changed the title PR 5 — upstream/flatpak-channelflatpak: stamp the version and arch in the build script, and name the bundle by archAug 21, 2026
@Ryanmello07
Ryanmello07 marked this pull request as ready for review August 21, 2026 15:42
@Ryanmello07
Ryanmello07 merged commit 1659699 into urnetwork:mainAug 21, 2026
3 checks passed
Sign up for freeto 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

@Ryanmello07
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

flatpak: stamp the version and arch in the build script, and name the bundle by arch - #10

Merged
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel
Aug 21, 2026
Merged

flatpak: stamp the version and arch in the build script, and name the bundle by arch#10
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel

Conversation

@Ryanmello07

@Ryanmello07Ryanmello07 commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Stacked PR — depends on #5, #7 and #9 (metainfo).
Opened against main because a cross-fork PR needs its base branch to exist in
this repo, so the diff below currently includes its parent's changes too.
Review after its parent lands.


Three defects in the Flatpak path. All three only show up in a shipped artifact,
never at build time.

1. Every build reported 0.0.0

The committed manifest carries no -Dapp_version, so meson falls back to its dev
sentinel. That is not cosmetic here: the Flatpak is the only artifact that
installs the AppStream metainfo
packaging/lib/common.sh's
assemble_daemon_root() whitelist excludes usr/share/metainfo, and
make-appimage.sh does not package it either — and that file is what GNOME
Software, KDE Discover and the Flathub page read. A 0.0.0 there is valid
AppStream, so nothing rejects it; it just appears on the store page.

make-flatpak.sh now stamps -Dapp_version into a copy of the manifest
before the build, leaving the developer's working tree untouched, and refuses
to continue
if the config-opts anchor it keys off has moved — rather than
silently building an unstamped bundle. It is done in the script rather than in
the release workflow so a local --install and a CI build produce the same
version.

2. No -Dsdk_arch

flatpak-builder builds for the machine it runs on, so the value is derived from
uname -m and stamped alongside the version. Overridable with ARCH= for the
rare cross case, with an explicit error on an unrecognised machine.

3. Both architectures wrote the same bundle filename

URnetwork-<version>.flatpak carries no arch, so the amd64 and arm64 legs
collide and one silently overwrites the other wherever the artifacts are
collected. The bundle is now URnetwork-<version>-<arch>.flatpak, matching what
every other script in packaging/ already does: the build script names its own
output rather than leaving a workflow to rename it.

Manifest header

Updated to say "go through make-flatpak.sh", and to add the third Flathub
prerequisite alongside the two already documented: Flathub builds this manifest
on its own infrastructure, where make-flatpak.sh never runs, so
-Dapp_version has to be written into config-opts before submission or the
listing shows 0.0.0.

The launcher gains a Flatpak fallback

app/packaging/urnetwork-launcher now falls back to flatpak run com.bringyour.network as its last candidate. Last on purpose: the Flatpak
exports its own desktop entry under the same app id, so on a Flatpak machine this
launcher normally loses on XDG precedence and is never invoked at all. It is
reached only when that export is missing or shadowed — and in exactly that case
the old behaviour was to tell the user to download a GUI they already had
installed.

Verified

bash -n on the script and the launcher (also sh -n, since the launcher is
POSIX sh); the manifest parses as YAML before and after the stamping sed is
applied for real, and the stamped config-opts land in the right module.

Why this is split this way

This is the Flatpak's build plumbing, which is a different review than "what
does the store listing say" (PR 4) or "what is the app id" (PR 2). The launcher
change rides along because it is the same question from the other side — how a
machine that has the Flatpak finds it.

The Android and Apple clients ship under `com.bringyour.network`. Linux was
the only platform on a different reverse-DNS id, and every place the id is
written down had to be told which one to use. This makes Linux match, and it
has to be done in one change because the id is a join key: the GTK
application id, the .desktop basename, the AppStream component id, the polkit
action namespace, the icon-theme name and the Flatpak app id must all agree or
the desktop stops recognising the app.
WHAT MOVES, AND WHY IT IS ALL ONE COMMIT
main.cpp Gtk::Application::create() -- the GApplication id
*.desktop filename, Icon=, StartupWMClass=
metainfo.xml filename, <id>, <launchable>
polkit .policy filename + all four action ids, matched in
ControlProtocol.hpp so the daemon asks about the
actions the file actually declares
icons hicolor basenames; Flatpak refuses to export an icon
whose name is not the app id
flatpak manifest filename + id + the desktop-file-edit paths
deb/rpm/tarball/ the installed paths, the conffile entries, and the
AppImage/snap uninstaller's stale-path list
Splitting these would leave an intermediate commit where, for example, the
.desktop names an icon that does not exist, or the daemon checks polkit
actions the shipped .policy does not declare -- both of which fail silently
at runtime rather than at build time.
TWO THINGS THAT ARE NOT PURE SEARCH-AND-REPLACE
1. `UrTheme::kAppIconName`. The icon name was spelled as a literal in two
places -- the by-path load in UrTheme.cpp and the by-name fallback in
MainWindow.cpp. Renaming the packaging alone left both lookups pointing at
a file that no longer existed, and `set_from_icon_name()` renders a blank
image without raising anything, so the title-bar logo simply went empty.
It is now one constant that the packaging and both call sites share.
2. The libsecret keyring attribute in SecretServiceRpcSessionStore.cpp moves
with the id. This is deliberately NOT dual-read: an entry written by an
older build is no longer found, the app falls back to a fresh RPC session
(the same one-time cost as the Flatpak data path moving), and the previous
app identity is not left holding live key material in the user's keyring
with nothing to clean it up.
No behaviour changes beyond those two. `network.ur.urnetwork` no longer
appears anywhere in the tree.
Two separate problems with the shipped icon, both visible on a normal desktop.
TRANSPARENCY. The old artwork had an opaque background baked in, so the icon
rendered as a square tile wherever the shell composites over its own surface
-- the GNOME dash, the app grid, and the window's own title bar. The
replacements are RGBA with a real alpha channel.
SIZES. Only 48 and 256 were installed. The desktop asks for 64 in the app
grid and 128/256 on a HiDPI display, and hicolor's fallback is to scale the
nearest size it has, so those lookups were served an upscale. This installs
48, 64, 128, 256 and 512.
All five are downscales of a single 1024x1024 master, taken from the same
AppIcon artwork the Apple client ships, so they cannot drift apart the way
separately-drawn assets do. The master is committed at
packaging/icons/com.bringyour.network-master-1024.png for regenerating them.
512 IS THE CEILING, DELIBERATELY. Installing the 1024 breaks the Flatpak
build outright: `flatpak build-export` refuses it with "Image too large
(1024x1024). Max. size 512x512" and fails the whole build at export time.
Nothing downstream wants a larger one -- Flathub renders the store page at up
to 512 -- so the master is kept in the tree but not installed.
app/meson.build (the Flatpak's installer) and packaging/lib/common.sh (the
staging tree the .deb, .rpm and tarball are all built from) now list the same
five sizes, and the tarball uninstaller removes all five; a size installed by
one and forgotten by the other is a file left behind on uninstall.
…validate it
Three things the AppStream metadata needed before it could be submitted
anywhere, and one reason nothing caught them.
1. THE RELEASE VERSION WAS HARDCODED, so it was wrong. Nothing wrote it, so
the file said whatever was typed into it last while the pipeline shipped a
different version. This element is not decoration: GNOME Software, KDE
Discover and the Flathub page all read <release version=...> and show it.
The file becomes a configure_file() template. app/meson.build derives both
attributes from -Dapp_version, which the pipeline already passes and which
both binaries already compile in as UR_APP_VERSION, so there is now exactly
one place the release version is written down.
The FULL version is stamped, suffix and all. appstreamcli accepts it, and
truncating would advertise a version matching no artifact -- every other
consumer of $VERSION (both binaries, every package filename, the
release-asset gates) uses the whole string -- and would collapse every
build of the same UTC day into one indistinguishable release element. Only
the date is derived, from the leading <YYYY>.<M>.<D>.
When -Dapp_version is not passed, meson warns loudly. That branch cannot be
caught any other way: a document saying version="0.0.0" is perfectly valid
AppStream, so no validator objects -- it just appears on the store page.
2. NO SCREENSHOT. Flathub requires at least one, and it is the single largest
thing a store listing is judged on. Added as a committed PNG plus the raw
URL Flathub mirrors from; a repo-relative path does not work, because the
mirror step runs on a build host with only the URL. The declared width and
height match the file exactly, which Flathub's linter checks.
3. NOTHING VALIDATED THE FILE. That is how (1) survived. appstreamcli is the
validator Flathub gates submissions on, so it now runs in two places
against the GENERATED file rather than the template: as a meson test
(optional -- not every build host has appstreamcli) and as a CI step in the
gui job, which is the one that always has it.
Verified: `appstreamcli validate --no-net --pedantic` passes on the stamped
output for a real release version and for the 0.0.0 sentinel, and the date
derivation was exercised for zero-padded and unpadded month/day.
… bundle by arch
Three defects in the Flatpak path, all of which only show up in a shipped
artifact rather than at build time.
1. THE BUILD REPORTED 0.0.0. The committed manifest carries no -Dapp_version,
so meson falls back to its dev sentinel. That is not cosmetic here: the
Flatpak is the ONLY artifact that installs the AppStream metainfo
(packaging/lib/common.sh's assemble_daemon_root() whitelist excludes
usr/share/metainfo, and make-appimage.sh does not package it), and that file
is what GNOME Software, KDE Discover and the Flathub page read. A 0.0.0
there is valid AppStream, so nothing rejects it -- it just appears on the
store page.
The script now stamps -Dapp_version into a COPY of the manifest before the
build, leaving the developer's working tree untouched, and refuses to
continue if the config-opts anchor it keys off has moved rather than
silently building an unstamped bundle. It is done here rather than in the
release workflow so that a local `--install` and a CI build produce the same
version.
2. NO -Dsdk_arch. flatpak-builder builds for the machine it runs on, so the
value is derived from `uname -m` and stamped alongside the version;
overridable with ARCH= for the rare cross case.
3. BOTH ARCHITECTURES WROTE THE SAME BUNDLE FILENAME. `URnetwork-<version>.flatpak`
carries no arch, so the amd64 and arm64 legs collide and one silently
overwrites the other wherever the artifacts are collected. The bundle is now
`URnetwork-<version>-<arch>.flatpak`, matching what every other artifact in
packaging/ already does: the build script names its own output.
Also documents the manifest header accordingly -- go through make-flatpak.sh
rather than calling flatpak-builder directly -- and adds the third Flathub
prerequisite: Flathub builds the manifest on its own infrastructure where this
script never runs, so -Dapp_version has to be written into config-opts before
submission or the listing shows 0.0.0.
The `urnetwork` launcher script gains the Flatpak as its last fallback. It is
last on purpose: the Flatpak exports its own desktop entry under the same app
id, so on a Flatpak machine this launcher normally loses on XDG precedence and
is never invoked. It is reached only when that export is missing or shadowed --
and in exactly that case the old behaviour was to tell the user to download a
GUI they already had installed.
@Ryanmello07Ryanmello07 changed the title PR 5 — upstream/flatpak-channelflatpak: stamp the version and arch in the build script, and name the bundle by archAug 21, 2026
@Ryanmello07
Ryanmello07 marked this pull request as ready for review August 21, 2026 15:42
@Ryanmello07
Ryanmello07 merged commit 1659699 into urnetwork:mainAug 21, 2026
3 checks passed
Sign up for freeto 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

@Ryanmello07
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

flatpak: stamp the version and arch in the build script, and name the bundle by arch - #10

Merged
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel
Aug 21, 2026
Merged

flatpak: stamp the version and arch in the build script, and name the bundle by arch#10
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel

Conversation

@Ryanmello07

@Ryanmello07Ryanmello07 commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Stacked PR — depends on #5, #7 and #9 (metainfo).
Opened against main because a cross-fork PR needs its base branch to exist in
this repo, so the diff below currently includes its parent's changes too.
Review after its parent lands.


Three defects in the Flatpak path. All three only show up in a shipped artifact,
never at build time.

1. Every build reported 0.0.0

The committed manifest carries no -Dapp_version, so meson falls back to its dev
sentinel. That is not cosmetic here: the Flatpak is the only artifact that
installs the AppStream metainfo
packaging/lib/common.sh's
assemble_daemon_root() whitelist excludes usr/share/metainfo, and
make-appimage.sh does not package it either — and that file is what GNOME
Software, KDE Discover and the Flathub page read. A 0.0.0 there is valid
AppStream, so nothing rejects it; it just appears on the store page.

make-flatpak.sh now stamps -Dapp_version into a copy of the manifest
before the build, leaving the developer's working tree untouched, and refuses
to continue
if the config-opts anchor it keys off has moved — rather than
silently building an unstamped bundle. It is done in the script rather than in
the release workflow so a local --install and a CI build produce the same
version.

2. No -Dsdk_arch

flatpak-builder builds for the machine it runs on, so the value is derived from
uname -m and stamped alongside the version. Overridable with ARCH= for the
rare cross case, with an explicit error on an unrecognised machine.

3. Both architectures wrote the same bundle filename

URnetwork-<version>.flatpak carries no arch, so the amd64 and arm64 legs
collide and one silently overwrites the other wherever the artifacts are
collected. The bundle is now URnetwork-<version>-<arch>.flatpak, matching what
every other script in packaging/ already does: the build script names its own
output rather than leaving a workflow to rename it.

Manifest header

Updated to say "go through make-flatpak.sh", and to add the third Flathub
prerequisite alongside the two already documented: Flathub builds this manifest
on its own infrastructure, where make-flatpak.sh never runs, so
-Dapp_version has to be written into config-opts before submission or the
listing shows 0.0.0.

The launcher gains a Flatpak fallback

app/packaging/urnetwork-launcher now falls back to flatpak run com.bringyour.network as its last candidate. Last on purpose: the Flatpak
exports its own desktop entry under the same app id, so on a Flatpak machine this
launcher normally loses on XDG precedence and is never invoked at all. It is
reached only when that export is missing or shadowed — and in exactly that case
the old behaviour was to tell the user to download a GUI they already had
installed.

Verified

bash -n on the script and the launcher (also sh -n, since the launcher is
POSIX sh); the manifest parses as YAML before and after the stamping sed is
applied for real, and the stamped config-opts land in the right module.

Why this is split this way

This is the Flatpak's build plumbing, which is a different review than "what
does the store listing say" (PR 4) or "what is the app id" (PR 2). The launcher
change rides along because it is the same question from the other side — how a
machine that has the Flatpak finds it.

The Android and Apple clients ship under `com.bringyour.network`. Linux was
the only platform on a different reverse-DNS id, and every place the id is
written down had to be told which one to use. This makes Linux match, and it
has to be done in one change because the id is a join key: the GTK
application id, the .desktop basename, the AppStream component id, the polkit
action namespace, the icon-theme name and the Flatpak app id must all agree or
the desktop stops recognising the app.
WHAT MOVES, AND WHY IT IS ALL ONE COMMIT
main.cpp Gtk::Application::create() -- the GApplication id
*.desktop filename, Icon=, StartupWMClass=
metainfo.xml filename, <id>, <launchable>
polkit .policy filename + all four action ids, matched in
ControlProtocol.hpp so the daemon asks about the
actions the file actually declares
icons hicolor basenames; Flatpak refuses to export an icon
whose name is not the app id
flatpak manifest filename + id + the desktop-file-edit paths
deb/rpm/tarball/ the installed paths, the conffile entries, and the
AppImage/snap uninstaller's stale-path list
Splitting these would leave an intermediate commit where, for example, the
.desktop names an icon that does not exist, or the daemon checks polkit
actions the shipped .policy does not declare -- both of which fail silently
at runtime rather than at build time.
TWO THINGS THAT ARE NOT PURE SEARCH-AND-REPLACE
1. `UrTheme::kAppIconName`. The icon name was spelled as a literal in two
places -- the by-path load in UrTheme.cpp and the by-name fallback in
MainWindow.cpp. Renaming the packaging alone left both lookups pointing at
a file that no longer existed, and `set_from_icon_name()` renders a blank
image without raising anything, so the title-bar logo simply went empty.
It is now one constant that the packaging and both call sites share.
2. The libsecret keyring attribute in SecretServiceRpcSessionStore.cpp moves
with the id. This is deliberately NOT dual-read: an entry written by an
older build is no longer found, the app falls back to a fresh RPC session
(the same one-time cost as the Flatpak data path moving), and the previous
app identity is not left holding live key material in the user's keyring
with nothing to clean it up.
No behaviour changes beyond those two. `network.ur.urnetwork` no longer
appears anywhere in the tree.
Two separate problems with the shipped icon, both visible on a normal desktop.
TRANSPARENCY. The old artwork had an opaque background baked in, so the icon
rendered as a square tile wherever the shell composites over its own surface
-- the GNOME dash, the app grid, and the window's own title bar. The
replacements are RGBA with a real alpha channel.
SIZES. Only 48 and 256 were installed. The desktop asks for 64 in the app
grid and 128/256 on a HiDPI display, and hicolor's fallback is to scale the
nearest size it has, so those lookups were served an upscale. This installs
48, 64, 128, 256 and 512.
All five are downscales of a single 1024x1024 master, taken from the same
AppIcon artwork the Apple client ships, so they cannot drift apart the way
separately-drawn assets do. The master is committed at
packaging/icons/com.bringyour.network-master-1024.png for regenerating them.
512 IS THE CEILING, DELIBERATELY. Installing the 1024 breaks the Flatpak
build outright: `flatpak build-export` refuses it with "Image too large
(1024x1024). Max. size 512x512" and fails the whole build at export time.
Nothing downstream wants a larger one -- Flathub renders the store page at up
to 512 -- so the master is kept in the tree but not installed.
app/meson.build (the Flatpak's installer) and packaging/lib/common.sh (the
staging tree the .deb, .rpm and tarball are all built from) now list the same
five sizes, and the tarball uninstaller removes all five; a size installed by
one and forgotten by the other is a file left behind on uninstall.
…validate it
Three things the AppStream metadata needed before it could be submitted
anywhere, and one reason nothing caught them.
1. THE RELEASE VERSION WAS HARDCODED, so it was wrong. Nothing wrote it, so
the file said whatever was typed into it last while the pipeline shipped a
different version. This element is not decoration: GNOME Software, KDE
Discover and the Flathub page all read <release version=...> and show it.
The file becomes a configure_file() template. app/meson.build derives both
attributes from -Dapp_version, which the pipeline already passes and which
both binaries already compile in as UR_APP_VERSION, so there is now exactly
one place the release version is written down.
The FULL version is stamped, suffix and all. appstreamcli accepts it, and
truncating would advertise a version matching no artifact -- every other
consumer of $VERSION (both binaries, every package filename, the
release-asset gates) uses the whole string -- and would collapse every
build of the same UTC day into one indistinguishable release element. Only
the date is derived, from the leading <YYYY>.<M>.<D>.
When -Dapp_version is not passed, meson warns loudly. That branch cannot be
caught any other way: a document saying version="0.0.0" is perfectly valid
AppStream, so no validator objects -- it just appears on the store page.
2. NO SCREENSHOT. Flathub requires at least one, and it is the single largest
thing a store listing is judged on. Added as a committed PNG plus the raw
URL Flathub mirrors from; a repo-relative path does not work, because the
mirror step runs on a build host with only the URL. The declared width and
height match the file exactly, which Flathub's linter checks.
3. NOTHING VALIDATED THE FILE. That is how (1) survived. appstreamcli is the
validator Flathub gates submissions on, so it now runs in two places
against the GENERATED file rather than the template: as a meson test
(optional -- not every build host has appstreamcli) and as a CI step in the
gui job, which is the one that always has it.
Verified: `appstreamcli validate --no-net --pedantic` passes on the stamped
output for a real release version and for the 0.0.0 sentinel, and the date
derivation was exercised for zero-padded and unpadded month/day.
… bundle by arch
Three defects in the Flatpak path, all of which only show up in a shipped
artifact rather than at build time.
1. THE BUILD REPORTED 0.0.0. The committed manifest carries no -Dapp_version,
so meson falls back to its dev sentinel. That is not cosmetic here: the
Flatpak is the ONLY artifact that installs the AppStream metainfo
(packaging/lib/common.sh's assemble_daemon_root() whitelist excludes
usr/share/metainfo, and make-appimage.sh does not package it), and that file
is what GNOME Software, KDE Discover and the Flathub page read. A 0.0.0
there is valid AppStream, so nothing rejects it -- it just appears on the
store page.
The script now stamps -Dapp_version into a COPY of the manifest before the
build, leaving the developer's working tree untouched, and refuses to
continue if the config-opts anchor it keys off has moved rather than
silently building an unstamped bundle. It is done here rather than in the
release workflow so that a local `--install` and a CI build produce the same
version.
2. NO -Dsdk_arch. flatpak-builder builds for the machine it runs on, so the
value is derived from `uname -m` and stamped alongside the version;
overridable with ARCH= for the rare cross case.
3. BOTH ARCHITECTURES WROTE THE SAME BUNDLE FILENAME. `URnetwork-<version>.flatpak`
carries no arch, so the amd64 and arm64 legs collide and one silently
overwrites the other wherever the artifacts are collected. The bundle is now
`URnetwork-<version>-<arch>.flatpak`, matching what every other artifact in
packaging/ already does: the build script names its own output.
Also documents the manifest header accordingly -- go through make-flatpak.sh
rather than calling flatpak-builder directly -- and adds the third Flathub
prerequisite: Flathub builds the manifest on its own infrastructure where this
script never runs, so -Dapp_version has to be written into config-opts before
submission or the listing shows 0.0.0.
The `urnetwork` launcher script gains the Flatpak as its last fallback. It is
last on purpose: the Flatpak exports its own desktop entry under the same app
id, so on a Flatpak machine this launcher normally loses on XDG precedence and
is never invoked. It is reached only when that export is missing or shadowed --
and in exactly that case the old behaviour was to tell the user to download a
GUI they already had installed.
@Ryanmello07Ryanmello07 changed the title PR 5 — upstream/flatpak-channelflatpak: stamp the version and arch in the build script, and name the bundle by archAug 21, 2026
@Ryanmello07
Ryanmello07 marked this pull request as ready for review August 21, 2026 15:42
@Ryanmello07
Ryanmello07 merged commit 1659699 into urnetwork:mainAug 21, 2026
3 checks passed
Sign up for freeto 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

@Ryanmello07
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

flatpak: stamp the version and arch in the build script, and name the bundle by arch - #10

Merged
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel
Aug 21, 2026
Merged

flatpak: stamp the version and arch in the build script, and name the bundle by arch#10
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel

Conversation

@Ryanmello07

@Ryanmello07Ryanmello07 commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Stacked PR — depends on #5, #7 and #9 (metainfo).
Opened against main because a cross-fork PR needs its base branch to exist in
this repo, so the diff below currently includes its parent's changes too.
Review after its parent lands.


Three defects in the Flatpak path. All three only show up in a shipped artifact,
never at build time.

1. Every build reported 0.0.0

The committed manifest carries no -Dapp_version, so meson falls back to its dev
sentinel. That is not cosmetic here: the Flatpak is the only artifact that
installs the AppStream metainfo
packaging/lib/common.sh's
assemble_daemon_root() whitelist excludes usr/share/metainfo, and
make-appimage.sh does not package it either — and that file is what GNOME
Software, KDE Discover and the Flathub page read. A 0.0.0 there is valid
AppStream, so nothing rejects it; it just appears on the store page.

make-flatpak.sh now stamps -Dapp_version into a copy of the manifest
before the build, leaving the developer's working tree untouched, and refuses
to continue
if the config-opts anchor it keys off has moved — rather than
silently building an unstamped bundle. It is done in the script rather than in
the release workflow so a local --install and a CI build produce the same
version.

2. No -Dsdk_arch

flatpak-builder builds for the machine it runs on, so the value is derived from
uname -m and stamped alongside the version. Overridable with ARCH= for the
rare cross case, with an explicit error on an unrecognised machine.

3. Both architectures wrote the same bundle filename

URnetwork-<version>.flatpak carries no arch, so the amd64 and arm64 legs
collide and one silently overwrites the other wherever the artifacts are
collected. The bundle is now URnetwork-<version>-<arch>.flatpak, matching what
every other script in packaging/ already does: the build script names its own
output rather than leaving a workflow to rename it.

Manifest header

Updated to say "go through make-flatpak.sh", and to add the third Flathub
prerequisite alongside the two already documented: Flathub builds this manifest
on its own infrastructure, where make-flatpak.sh never runs, so
-Dapp_version has to be written into config-opts before submission or the
listing shows 0.0.0.

The launcher gains a Flatpak fallback

app/packaging/urnetwork-launcher now falls back to flatpak run com.bringyour.network as its last candidate. Last on purpose: the Flatpak
exports its own desktop entry under the same app id, so on a Flatpak machine this
launcher normally loses on XDG precedence and is never invoked at all. It is
reached only when that export is missing or shadowed — and in exactly that case
the old behaviour was to tell the user to download a GUI they already had
installed.

Verified

bash -n on the script and the launcher (also sh -n, since the launcher is
POSIX sh); the manifest parses as YAML before and after the stamping sed is
applied for real, and the stamped config-opts land in the right module.

Why this is split this way

This is the Flatpak's build plumbing, which is a different review than "what
does the store listing say" (PR 4) or "what is the app id" (PR 2). The launcher
change rides along because it is the same question from the other side — how a
machine that has the Flatpak finds it.

The Android and Apple clients ship under `com.bringyour.network`. Linux was
the only platform on a different reverse-DNS id, and every place the id is
written down had to be told which one to use. This makes Linux match, and it
has to be done in one change because the id is a join key: the GTK
application id, the .desktop basename, the AppStream component id, the polkit
action namespace, the icon-theme name and the Flatpak app id must all agree or
the desktop stops recognising the app.
WHAT MOVES, AND WHY IT IS ALL ONE COMMIT
main.cpp Gtk::Application::create() -- the GApplication id
*.desktop filename, Icon=, StartupWMClass=
metainfo.xml filename, <id>, <launchable>
polkit .policy filename + all four action ids, matched in
ControlProtocol.hpp so the daemon asks about the
actions the file actually declares
icons hicolor basenames; Flatpak refuses to export an icon
whose name is not the app id
flatpak manifest filename + id + the desktop-file-edit paths
deb/rpm/tarball/ the installed paths, the conffile entries, and the
AppImage/snap uninstaller's stale-path list
Splitting these would leave an intermediate commit where, for example, the
.desktop names an icon that does not exist, or the daemon checks polkit
actions the shipped .policy does not declare -- both of which fail silently
at runtime rather than at build time.
TWO THINGS THAT ARE NOT PURE SEARCH-AND-REPLACE
1. `UrTheme::kAppIconName`. The icon name was spelled as a literal in two
places -- the by-path load in UrTheme.cpp and the by-name fallback in
MainWindow.cpp. Renaming the packaging alone left both lookups pointing at
a file that no longer existed, and `set_from_icon_name()` renders a blank
image without raising anything, so the title-bar logo simply went empty.
It is now one constant that the packaging and both call sites share.
2. The libsecret keyring attribute in SecretServiceRpcSessionStore.cpp moves
with the id. This is deliberately NOT dual-read: an entry written by an
older build is no longer found, the app falls back to a fresh RPC session
(the same one-time cost as the Flatpak data path moving), and the previous
app identity is not left holding live key material in the user's keyring
with nothing to clean it up.
No behaviour changes beyond those two. `network.ur.urnetwork` no longer
appears anywhere in the tree.
Two separate problems with the shipped icon, both visible on a normal desktop.
TRANSPARENCY. The old artwork had an opaque background baked in, so the icon
rendered as a square tile wherever the shell composites over its own surface
-- the GNOME dash, the app grid, and the window's own title bar. The
replacements are RGBA with a real alpha channel.
SIZES. Only 48 and 256 were installed. The desktop asks for 64 in the app
grid and 128/256 on a HiDPI display, and hicolor's fallback is to scale the
nearest size it has, so those lookups were served an upscale. This installs
48, 64, 128, 256 and 512.
All five are downscales of a single 1024x1024 master, taken from the same
AppIcon artwork the Apple client ships, so they cannot drift apart the way
separately-drawn assets do. The master is committed at
packaging/icons/com.bringyour.network-master-1024.png for regenerating them.
512 IS THE CEILING, DELIBERATELY. Installing the 1024 breaks the Flatpak
build outright: `flatpak build-export` refuses it with "Image too large
(1024x1024). Max. size 512x512" and fails the whole build at export time.
Nothing downstream wants a larger one -- Flathub renders the store page at up
to 512 -- so the master is kept in the tree but not installed.
app/meson.build (the Flatpak's installer) and packaging/lib/common.sh (the
staging tree the .deb, .rpm and tarball are all built from) now list the same
five sizes, and the tarball uninstaller removes all five; a size installed by
one and forgotten by the other is a file left behind on uninstall.
…validate it
Three things the AppStream metadata needed before it could be submitted
anywhere, and one reason nothing caught them.
1. THE RELEASE VERSION WAS HARDCODED, so it was wrong. Nothing wrote it, so
the file said whatever was typed into it last while the pipeline shipped a
different version. This element is not decoration: GNOME Software, KDE
Discover and the Flathub page all read <release version=...> and show it.
The file becomes a configure_file() template. app/meson.build derives both
attributes from -Dapp_version, which the pipeline already passes and which
both binaries already compile in as UR_APP_VERSION, so there is now exactly
one place the release version is written down.
The FULL version is stamped, suffix and all. appstreamcli accepts it, and
truncating would advertise a version matching no artifact -- every other
consumer of $VERSION (both binaries, every package filename, the
release-asset gates) uses the whole string -- and would collapse every
build of the same UTC day into one indistinguishable release element. Only
the date is derived, from the leading <YYYY>.<M>.<D>.
When -Dapp_version is not passed, meson warns loudly. That branch cannot be
caught any other way: a document saying version="0.0.0" is perfectly valid
AppStream, so no validator objects -- it just appears on the store page.
2. NO SCREENSHOT. Flathub requires at least one, and it is the single largest
thing a store listing is judged on. Added as a committed PNG plus the raw
URL Flathub mirrors from; a repo-relative path does not work, because the
mirror step runs on a build host with only the URL. The declared width and
height match the file exactly, which Flathub's linter checks.
3. NOTHING VALIDATED THE FILE. That is how (1) survived. appstreamcli is the
validator Flathub gates submissions on, so it now runs in two places
against the GENERATED file rather than the template: as a meson test
(optional -- not every build host has appstreamcli) and as a CI step in the
gui job, which is the one that always has it.
Verified: `appstreamcli validate --no-net --pedantic` passes on the stamped
output for a real release version and for the 0.0.0 sentinel, and the date
derivation was exercised for zero-padded and unpadded month/day.
… bundle by arch
Three defects in the Flatpak path, all of which only show up in a shipped
artifact rather than at build time.
1. THE BUILD REPORTED 0.0.0. The committed manifest carries no -Dapp_version,
so meson falls back to its dev sentinel. That is not cosmetic here: the
Flatpak is the ONLY artifact that installs the AppStream metainfo
(packaging/lib/common.sh's assemble_daemon_root() whitelist excludes
usr/share/metainfo, and make-appimage.sh does not package it), and that file
is what GNOME Software, KDE Discover and the Flathub page read. A 0.0.0
there is valid AppStream, so nothing rejects it -- it just appears on the
store page.
The script now stamps -Dapp_version into a COPY of the manifest before the
build, leaving the developer's working tree untouched, and refuses to
continue if the config-opts anchor it keys off has moved rather than
silently building an unstamped bundle. It is done here rather than in the
release workflow so that a local `--install` and a CI build produce the same
version.
2. NO -Dsdk_arch. flatpak-builder builds for the machine it runs on, so the
value is derived from `uname -m` and stamped alongside the version;
overridable with ARCH= for the rare cross case.
3. BOTH ARCHITECTURES WROTE THE SAME BUNDLE FILENAME. `URnetwork-<version>.flatpak`
carries no arch, so the amd64 and arm64 legs collide and one silently
overwrites the other wherever the artifacts are collected. The bundle is now
`URnetwork-<version>-<arch>.flatpak`, matching what every other artifact in
packaging/ already does: the build script names its own output.
Also documents the manifest header accordingly -- go through make-flatpak.sh
rather than calling flatpak-builder directly -- and adds the third Flathub
prerequisite: Flathub builds the manifest on its own infrastructure where this
script never runs, so -Dapp_version has to be written into config-opts before
submission or the listing shows 0.0.0.
The `urnetwork` launcher script gains the Flatpak as its last fallback. It is
last on purpose: the Flatpak exports its own desktop entry under the same app
id, so on a Flatpak machine this launcher normally loses on XDG precedence and
is never invoked. It is reached only when that export is missing or shadowed --
and in exactly that case the old behaviour was to tell the user to download a
GUI they already had installed.
@Ryanmello07Ryanmello07 changed the title PR 5 — upstream/flatpak-channelflatpak: stamp the version and arch in the build script, and name the bundle by archAug 21, 2026
@Ryanmello07
Ryanmello07 marked this pull request as ready for review August 21, 2026 15:42
@Ryanmello07
Ryanmello07 merged commit 1659699 into urnetwork:mainAug 21, 2026
3 checks passed
Sign up for freeto 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

@Ryanmello07
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

flatpak: stamp the version and arch in the build script, and name the bundle by arch - #10

Merged
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel
Aug 21, 2026
Merged

flatpak: stamp the version and arch in the build script, and name the bundle by arch#10
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel

Conversation

@Ryanmello07

@Ryanmello07Ryanmello07 commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Stacked PR — depends on #5, #7 and #9 (metainfo).
Opened against main because a cross-fork PR needs its base branch to exist in
this repo, so the diff below currently includes its parent's changes too.
Review after its parent lands.


Three defects in the Flatpak path. All three only show up in a shipped artifact,
never at build time.

1. Every build reported 0.0.0

The committed manifest carries no -Dapp_version, so meson falls back to its dev
sentinel. That is not cosmetic here: the Flatpak is the only artifact that
installs the AppStream metainfo
packaging/lib/common.sh's
assemble_daemon_root() whitelist excludes usr/share/metainfo, and
make-appimage.sh does not package it either — and that file is what GNOME
Software, KDE Discover and the Flathub page read. A 0.0.0 there is valid
AppStream, so nothing rejects it; it just appears on the store page.

make-flatpak.sh now stamps -Dapp_version into a copy of the manifest
before the build, leaving the developer's working tree untouched, and refuses
to continue
if the config-opts anchor it keys off has moved — rather than
silently building an unstamped bundle. It is done in the script rather than in
the release workflow so a local --install and a CI build produce the same
version.

2. No -Dsdk_arch

flatpak-builder builds for the machine it runs on, so the value is derived from
uname -m and stamped alongside the version. Overridable with ARCH= for the
rare cross case, with an explicit error on an unrecognised machine.

3. Both architectures wrote the same bundle filename

URnetwork-<version>.flatpak carries no arch, so the amd64 and arm64 legs
collide and one silently overwrites the other wherever the artifacts are
collected. The bundle is now URnetwork-<version>-<arch>.flatpak, matching what
every other script in packaging/ already does: the build script names its own
output rather than leaving a workflow to rename it.

Manifest header

Updated to say "go through make-flatpak.sh", and to add the third Flathub
prerequisite alongside the two already documented: Flathub builds this manifest
on its own infrastructure, where make-flatpak.sh never runs, so
-Dapp_version has to be written into config-opts before submission or the
listing shows 0.0.0.

The launcher gains a Flatpak fallback

app/packaging/urnetwork-launcher now falls back to flatpak run com.bringyour.network as its last candidate. Last on purpose: the Flatpak
exports its own desktop entry under the same app id, so on a Flatpak machine this
launcher normally loses on XDG precedence and is never invoked at all. It is
reached only when that export is missing or shadowed — and in exactly that case
the old behaviour was to tell the user to download a GUI they already had
installed.

Verified

bash -n on the script and the launcher (also sh -n, since the launcher is
POSIX sh); the manifest parses as YAML before and after the stamping sed is
applied for real, and the stamped config-opts land in the right module.

Why this is split this way

This is the Flatpak's build plumbing, which is a different review than "what
does the store listing say" (PR 4) or "what is the app id" (PR 2). The launcher
change rides along because it is the same question from the other side — how a
machine that has the Flatpak finds it.

The Android and Apple clients ship under `com.bringyour.network`. Linux was
the only platform on a different reverse-DNS id, and every place the id is
written down had to be told which one to use. This makes Linux match, and it
has to be done in one change because the id is a join key: the GTK
application id, the .desktop basename, the AppStream component id, the polkit
action namespace, the icon-theme name and the Flatpak app id must all agree or
the desktop stops recognising the app.
WHAT MOVES, AND WHY IT IS ALL ONE COMMIT
main.cpp Gtk::Application::create() -- the GApplication id
*.desktop filename, Icon=, StartupWMClass=
metainfo.xml filename, <id>, <launchable>
polkit .policy filename + all four action ids, matched in
ControlProtocol.hpp so the daemon asks about the
actions the file actually declares
icons hicolor basenames; Flatpak refuses to export an icon
whose name is not the app id
flatpak manifest filename + id + the desktop-file-edit paths
deb/rpm/tarball/ the installed paths, the conffile entries, and the
AppImage/snap uninstaller's stale-path list
Splitting these would leave an intermediate commit where, for example, the
.desktop names an icon that does not exist, or the daemon checks polkit
actions the shipped .policy does not declare -- both of which fail silently
at runtime rather than at build time.
TWO THINGS THAT ARE NOT PURE SEARCH-AND-REPLACE
1. `UrTheme::kAppIconName`. The icon name was spelled as a literal in two
places -- the by-path load in UrTheme.cpp and the by-name fallback in
MainWindow.cpp. Renaming the packaging alone left both lookups pointing at
a file that no longer existed, and `set_from_icon_name()` renders a blank
image without raising anything, so the title-bar logo simply went empty.
It is now one constant that the packaging and both call sites share.
2. The libsecret keyring attribute in SecretServiceRpcSessionStore.cpp moves
with the id. This is deliberately NOT dual-read: an entry written by an
older build is no longer found, the app falls back to a fresh RPC session
(the same one-time cost as the Flatpak data path moving), and the previous
app identity is not left holding live key material in the user's keyring
with nothing to clean it up.
No behaviour changes beyond those two. `network.ur.urnetwork` no longer
appears anywhere in the tree.
Two separate problems with the shipped icon, both visible on a normal desktop.
TRANSPARENCY. The old artwork had an opaque background baked in, so the icon
rendered as a square tile wherever the shell composites over its own surface
-- the GNOME dash, the app grid, and the window's own title bar. The
replacements are RGBA with a real alpha channel.
SIZES. Only 48 and 256 were installed. The desktop asks for 64 in the app
grid and 128/256 on a HiDPI display, and hicolor's fallback is to scale the
nearest size it has, so those lookups were served an upscale. This installs
48, 64, 128, 256 and 512.
All five are downscales of a single 1024x1024 master, taken from the same
AppIcon artwork the Apple client ships, so they cannot drift apart the way
separately-drawn assets do. The master is committed at
packaging/icons/com.bringyour.network-master-1024.png for regenerating them.
512 IS THE CEILING, DELIBERATELY. Installing the 1024 breaks the Flatpak
build outright: `flatpak build-export` refuses it with "Image too large
(1024x1024). Max. size 512x512" and fails the whole build at export time.
Nothing downstream wants a larger one -- Flathub renders the store page at up
to 512 -- so the master is kept in the tree but not installed.
app/meson.build (the Flatpak's installer) and packaging/lib/common.sh (the
staging tree the .deb, .rpm and tarball are all built from) now list the same
five sizes, and the tarball uninstaller removes all five; a size installed by
one and forgotten by the other is a file left behind on uninstall.
…validate it
Three things the AppStream metadata needed before it could be submitted
anywhere, and one reason nothing caught them.
1. THE RELEASE VERSION WAS HARDCODED, so it was wrong. Nothing wrote it, so
the file said whatever was typed into it last while the pipeline shipped a
different version. This element is not decoration: GNOME Software, KDE
Discover and the Flathub page all read <release version=...> and show it.
The file becomes a configure_file() template. app/meson.build derives both
attributes from -Dapp_version, which the pipeline already passes and which
both binaries already compile in as UR_APP_VERSION, so there is now exactly
one place the release version is written down.
The FULL version is stamped, suffix and all. appstreamcli accepts it, and
truncating would advertise a version matching no artifact -- every other
consumer of $VERSION (both binaries, every package filename, the
release-asset gates) uses the whole string -- and would collapse every
build of the same UTC day into one indistinguishable release element. Only
the date is derived, from the leading <YYYY>.<M>.<D>.
When -Dapp_version is not passed, meson warns loudly. That branch cannot be
caught any other way: a document saying version="0.0.0" is perfectly valid
AppStream, so no validator objects -- it just appears on the store page.
2. NO SCREENSHOT. Flathub requires at least one, and it is the single largest
thing a store listing is judged on. Added as a committed PNG plus the raw
URL Flathub mirrors from; a repo-relative path does not work, because the
mirror step runs on a build host with only the URL. The declared width and
height match the file exactly, which Flathub's linter checks.
3. NOTHING VALIDATED THE FILE. That is how (1) survived. appstreamcli is the
validator Flathub gates submissions on, so it now runs in two places
against the GENERATED file rather than the template: as a meson test
(optional -- not every build host has appstreamcli) and as a CI step in the
gui job, which is the one that always has it.
Verified: `appstreamcli validate --no-net --pedantic` passes on the stamped
output for a real release version and for the 0.0.0 sentinel, and the date
derivation was exercised for zero-padded and unpadded month/day.
… bundle by arch
Three defects in the Flatpak path, all of which only show up in a shipped
artifact rather than at build time.
1. THE BUILD REPORTED 0.0.0. The committed manifest carries no -Dapp_version,
so meson falls back to its dev sentinel. That is not cosmetic here: the
Flatpak is the ONLY artifact that installs the AppStream metainfo
(packaging/lib/common.sh's assemble_daemon_root() whitelist excludes
usr/share/metainfo, and make-appimage.sh does not package it), and that file
is what GNOME Software, KDE Discover and the Flathub page read. A 0.0.0
there is valid AppStream, so nothing rejects it -- it just appears on the
store page.
The script now stamps -Dapp_version into a COPY of the manifest before the
build, leaving the developer's working tree untouched, and refuses to
continue if the config-opts anchor it keys off has moved rather than
silently building an unstamped bundle. It is done here rather than in the
release workflow so that a local `--install` and a CI build produce the same
version.
2. NO -Dsdk_arch. flatpak-builder builds for the machine it runs on, so the
value is derived from `uname -m` and stamped alongside the version;
overridable with ARCH= for the rare cross case.
3. BOTH ARCHITECTURES WROTE THE SAME BUNDLE FILENAME. `URnetwork-<version>.flatpak`
carries no arch, so the amd64 and arm64 legs collide and one silently
overwrites the other wherever the artifacts are collected. The bundle is now
`URnetwork-<version>-<arch>.flatpak`, matching what every other artifact in
packaging/ already does: the build script names its own output.
Also documents the manifest header accordingly -- go through make-flatpak.sh
rather than calling flatpak-builder directly -- and adds the third Flathub
prerequisite: Flathub builds the manifest on its own infrastructure where this
script never runs, so -Dapp_version has to be written into config-opts before
submission or the listing shows 0.0.0.
The `urnetwork` launcher script gains the Flatpak as its last fallback. It is
last on purpose: the Flatpak exports its own desktop entry under the same app
id, so on a Flatpak machine this launcher normally loses on XDG precedence and
is never invoked. It is reached only when that export is missing or shadowed --
and in exactly that case the old behaviour was to tell the user to download a
GUI they already had installed.
@Ryanmello07Ryanmello07 changed the title PR 5 — upstream/flatpak-channelflatpak: stamp the version and arch in the build script, and name the bundle by archAug 21, 2026
@Ryanmello07
Ryanmello07 marked this pull request as ready for review August 21, 2026 15:42
@Ryanmello07
Ryanmello07 merged commit 1659699 into urnetwork:mainAug 21, 2026
3 checks passed
Sign up for freeto 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

@Ryanmello07
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

flatpak: stamp the version and arch in the build script, and name the bundle by arch - #10

Merged
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel
Aug 21, 2026
Merged

flatpak: stamp the version and arch in the build script, and name the bundle by arch#10
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel

Conversation

@Ryanmello07

@Ryanmello07Ryanmello07 commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Stacked PR — depends on #5, #7 and #9 (metainfo).
Opened against main because a cross-fork PR needs its base branch to exist in
this repo, so the diff below currently includes its parent's changes too.
Review after its parent lands.


Three defects in the Flatpak path. All three only show up in a shipped artifact,
never at build time.

1. Every build reported 0.0.0

The committed manifest carries no -Dapp_version, so meson falls back to its dev
sentinel. That is not cosmetic here: the Flatpak is the only artifact that
installs the AppStream metainfo
packaging/lib/common.sh's
assemble_daemon_root() whitelist excludes usr/share/metainfo, and
make-appimage.sh does not package it either — and that file is what GNOME
Software, KDE Discover and the Flathub page read. A 0.0.0 there is valid
AppStream, so nothing rejects it; it just appears on the store page.

make-flatpak.sh now stamps -Dapp_version into a copy of the manifest
before the build, leaving the developer's working tree untouched, and refuses
to continue
if the config-opts anchor it keys off has moved — rather than
silently building an unstamped bundle. It is done in the script rather than in
the release workflow so a local --install and a CI build produce the same
version.

2. No -Dsdk_arch

flatpak-builder builds for the machine it runs on, so the value is derived from
uname -m and stamped alongside the version. Overridable with ARCH= for the
rare cross case, with an explicit error on an unrecognised machine.

3. Both architectures wrote the same bundle filename

URnetwork-<version>.flatpak carries no arch, so the amd64 and arm64 legs
collide and one silently overwrites the other wherever the artifacts are
collected. The bundle is now URnetwork-<version>-<arch>.flatpak, matching what
every other script in packaging/ already does: the build script names its own
output rather than leaving a workflow to rename it.

Manifest header

Updated to say "go through make-flatpak.sh", and to add the third Flathub
prerequisite alongside the two already documented: Flathub builds this manifest
on its own infrastructure, where make-flatpak.sh never runs, so
-Dapp_version has to be written into config-opts before submission or the
listing shows 0.0.0.

The launcher gains a Flatpak fallback

app/packaging/urnetwork-launcher now falls back to flatpak run com.bringyour.network as its last candidate. Last on purpose: the Flatpak
exports its own desktop entry under the same app id, so on a Flatpak machine this
launcher normally loses on XDG precedence and is never invoked at all. It is
reached only when that export is missing or shadowed — and in exactly that case
the old behaviour was to tell the user to download a GUI they already had
installed.

Verified

bash -n on the script and the launcher (also sh -n, since the launcher is
POSIX sh); the manifest parses as YAML before and after the stamping sed is
applied for real, and the stamped config-opts land in the right module.

Why this is split this way

This is the Flatpak's build plumbing, which is a different review than "what
does the store listing say" (PR 4) or "what is the app id" (PR 2). The launcher
change rides along because it is the same question from the other side — how a
machine that has the Flatpak finds it.

The Android and Apple clients ship under `com.bringyour.network`. Linux was
the only platform on a different reverse-DNS id, and every place the id is
written down had to be told which one to use. This makes Linux match, and it
has to be done in one change because the id is a join key: the GTK
application id, the .desktop basename, the AppStream component id, the polkit
action namespace, the icon-theme name and the Flatpak app id must all agree or
the desktop stops recognising the app.
WHAT MOVES, AND WHY IT IS ALL ONE COMMIT
main.cpp Gtk::Application::create() -- the GApplication id
*.desktop filename, Icon=, StartupWMClass=
metainfo.xml filename, <id>, <launchable>
polkit .policy filename + all four action ids, matched in
ControlProtocol.hpp so the daemon asks about the
actions the file actually declares
icons hicolor basenames; Flatpak refuses to export an icon
whose name is not the app id
flatpak manifest filename + id + the desktop-file-edit paths
deb/rpm/tarball/ the installed paths, the conffile entries, and the
AppImage/snap uninstaller's stale-path list
Splitting these would leave an intermediate commit where, for example, the
.desktop names an icon that does not exist, or the daemon checks polkit
actions the shipped .policy does not declare -- both of which fail silently
at runtime rather than at build time.
TWO THINGS THAT ARE NOT PURE SEARCH-AND-REPLACE
1. `UrTheme::kAppIconName`. The icon name was spelled as a literal in two
places -- the by-path load in UrTheme.cpp and the by-name fallback in
MainWindow.cpp. Renaming the packaging alone left both lookups pointing at
a file that no longer existed, and `set_from_icon_name()` renders a blank
image without raising anything, so the title-bar logo simply went empty.
It is now one constant that the packaging and both call sites share.
2. The libsecret keyring attribute in SecretServiceRpcSessionStore.cpp moves
with the id. This is deliberately NOT dual-read: an entry written by an
older build is no longer found, the app falls back to a fresh RPC session
(the same one-time cost as the Flatpak data path moving), and the previous
app identity is not left holding live key material in the user's keyring
with nothing to clean it up.
No behaviour changes beyond those two. `network.ur.urnetwork` no longer
appears anywhere in the tree.
Two separate problems with the shipped icon, both visible on a normal desktop.
TRANSPARENCY. The old artwork had an opaque background baked in, so the icon
rendered as a square tile wherever the shell composites over its own surface
-- the GNOME dash, the app grid, and the window's own title bar. The
replacements are RGBA with a real alpha channel.
SIZES. Only 48 and 256 were installed. The desktop asks for 64 in the app
grid and 128/256 on a HiDPI display, and hicolor's fallback is to scale the
nearest size it has, so those lookups were served an upscale. This installs
48, 64, 128, 256 and 512.
All five are downscales of a single 1024x1024 master, taken from the same
AppIcon artwork the Apple client ships, so they cannot drift apart the way
separately-drawn assets do. The master is committed at
packaging/icons/com.bringyour.network-master-1024.png for regenerating them.
512 IS THE CEILING, DELIBERATELY. Installing the 1024 breaks the Flatpak
build outright: `flatpak build-export` refuses it with "Image too large
(1024x1024). Max. size 512x512" and fails the whole build at export time.
Nothing downstream wants a larger one -- Flathub renders the store page at up
to 512 -- so the master is kept in the tree but not installed.
app/meson.build (the Flatpak's installer) and packaging/lib/common.sh (the
staging tree the .deb, .rpm and tarball are all built from) now list the same
five sizes, and the tarball uninstaller removes all five; a size installed by
one and forgotten by the other is a file left behind on uninstall.
…validate it
Three things the AppStream metadata needed before it could be submitted
anywhere, and one reason nothing caught them.
1. THE RELEASE VERSION WAS HARDCODED, so it was wrong. Nothing wrote it, so
the file said whatever was typed into it last while the pipeline shipped a
different version. This element is not decoration: GNOME Software, KDE
Discover and the Flathub page all read <release version=...> and show it.
The file becomes a configure_file() template. app/meson.build derives both
attributes from -Dapp_version, which the pipeline already passes and which
both binaries already compile in as UR_APP_VERSION, so there is now exactly
one place the release version is written down.
The FULL version is stamped, suffix and all. appstreamcli accepts it, and
truncating would advertise a version matching no artifact -- every other
consumer of $VERSION (both binaries, every package filename, the
release-asset gates) uses the whole string -- and would collapse every
build of the same UTC day into one indistinguishable release element. Only
the date is derived, from the leading <YYYY>.<M>.<D>.
When -Dapp_version is not passed, meson warns loudly. That branch cannot be
caught any other way: a document saying version="0.0.0" is perfectly valid
AppStream, so no validator objects -- it just appears on the store page.
2. NO SCREENSHOT. Flathub requires at least one, and it is the single largest
thing a store listing is judged on. Added as a committed PNG plus the raw
URL Flathub mirrors from; a repo-relative path does not work, because the
mirror step runs on a build host with only the URL. The declared width and
height match the file exactly, which Flathub's linter checks.
3. NOTHING VALIDATED THE FILE. That is how (1) survived. appstreamcli is the
validator Flathub gates submissions on, so it now runs in two places
against the GENERATED file rather than the template: as a meson test
(optional -- not every build host has appstreamcli) and as a CI step in the
gui job, which is the one that always has it.
Verified: `appstreamcli validate --no-net --pedantic` passes on the stamped
output for a real release version and for the 0.0.0 sentinel, and the date
derivation was exercised for zero-padded and unpadded month/day.
… bundle by arch
Three defects in the Flatpak path, all of which only show up in a shipped
artifact rather than at build time.
1. THE BUILD REPORTED 0.0.0. The committed manifest carries no -Dapp_version,
so meson falls back to its dev sentinel. That is not cosmetic here: the
Flatpak is the ONLY artifact that installs the AppStream metainfo
(packaging/lib/common.sh's assemble_daemon_root() whitelist excludes
usr/share/metainfo, and make-appimage.sh does not package it), and that file
is what GNOME Software, KDE Discover and the Flathub page read. A 0.0.0
there is valid AppStream, so nothing rejects it -- it just appears on the
store page.
The script now stamps -Dapp_version into a COPY of the manifest before the
build, leaving the developer's working tree untouched, and refuses to
continue if the config-opts anchor it keys off has moved rather than
silently building an unstamped bundle. It is done here rather than in the
release workflow so that a local `--install` and a CI build produce the same
version.
2. NO -Dsdk_arch. flatpak-builder builds for the machine it runs on, so the
value is derived from `uname -m` and stamped alongside the version;
overridable with ARCH= for the rare cross case.
3. BOTH ARCHITECTURES WROTE THE SAME BUNDLE FILENAME. `URnetwork-<version>.flatpak`
carries no arch, so the amd64 and arm64 legs collide and one silently
overwrites the other wherever the artifacts are collected. The bundle is now
`URnetwork-<version>-<arch>.flatpak`, matching what every other artifact in
packaging/ already does: the build script names its own output.
Also documents the manifest header accordingly -- go through make-flatpak.sh
rather than calling flatpak-builder directly -- and adds the third Flathub
prerequisite: Flathub builds the manifest on its own infrastructure where this
script never runs, so -Dapp_version has to be written into config-opts before
submission or the listing shows 0.0.0.
The `urnetwork` launcher script gains the Flatpak as its last fallback. It is
last on purpose: the Flatpak exports its own desktop entry under the same app
id, so on a Flatpak machine this launcher normally loses on XDG precedence and
is never invoked. It is reached only when that export is missing or shadowed --
and in exactly that case the old behaviour was to tell the user to download a
GUI they already had installed.
@Ryanmello07Ryanmello07 changed the title PR 5 — upstream/flatpak-channelflatpak: stamp the version and arch in the build script, and name the bundle by archAug 21, 2026
@Ryanmello07
Ryanmello07 marked this pull request as ready for review August 21, 2026 15:42
@Ryanmello07
Ryanmello07 merged commit 1659699 into urnetwork:mainAug 21, 2026
3 checks passed
Sign up for freeto 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

@Ryanmello07
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

flatpak: stamp the version and arch in the build script, and name the bundle by arch - #10

Merged
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel
Aug 21, 2026
Merged

flatpak: stamp the version and arch in the build script, and name the bundle by arch#10
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel

Conversation

@Ryanmello07

@Ryanmello07Ryanmello07 commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Stacked PR — depends on #5, #7 and #9 (metainfo).
Opened against main because a cross-fork PR needs its base branch to exist in
this repo, so the diff below currently includes its parent's changes too.
Review after its parent lands.


Three defects in the Flatpak path. All three only show up in a shipped artifact,
never at build time.

1. Every build reported 0.0.0

The committed manifest carries no -Dapp_version, so meson falls back to its dev
sentinel. That is not cosmetic here: the Flatpak is the only artifact that
installs the AppStream metainfo
packaging/lib/common.sh's
assemble_daemon_root() whitelist excludes usr/share/metainfo, and
make-appimage.sh does not package it either — and that file is what GNOME
Software, KDE Discover and the Flathub page read. A 0.0.0 there is valid
AppStream, so nothing rejects it; it just appears on the store page.

make-flatpak.sh now stamps -Dapp_version into a copy of the manifest
before the build, leaving the developer's working tree untouched, and refuses
to continue
if the config-opts anchor it keys off has moved — rather than
silently building an unstamped bundle. It is done in the script rather than in
the release workflow so a local --install and a CI build produce the same
version.

2. No -Dsdk_arch

flatpak-builder builds for the machine it runs on, so the value is derived from
uname -m and stamped alongside the version. Overridable with ARCH= for the
rare cross case, with an explicit error on an unrecognised machine.

3. Both architectures wrote the same bundle filename

URnetwork-<version>.flatpak carries no arch, so the amd64 and arm64 legs
collide and one silently overwrites the other wherever the artifacts are
collected. The bundle is now URnetwork-<version>-<arch>.flatpak, matching what
every other script in packaging/ already does: the build script names its own
output rather than leaving a workflow to rename it.

Manifest header

Updated to say "go through make-flatpak.sh", and to add the third Flathub
prerequisite alongside the two already documented: Flathub builds this manifest
on its own infrastructure, where make-flatpak.sh never runs, so
-Dapp_version has to be written into config-opts before submission or the
listing shows 0.0.0.

The launcher gains a Flatpak fallback

app/packaging/urnetwork-launcher now falls back to flatpak run com.bringyour.network as its last candidate. Last on purpose: the Flatpak
exports its own desktop entry under the same app id, so on a Flatpak machine this
launcher normally loses on XDG precedence and is never invoked at all. It is
reached only when that export is missing or shadowed — and in exactly that case
the old behaviour was to tell the user to download a GUI they already had
installed.

Verified

bash -n on the script and the launcher (also sh -n, since the launcher is
POSIX sh); the manifest parses as YAML before and after the stamping sed is
applied for real, and the stamped config-opts land in the right module.

Why this is split this way

This is the Flatpak's build plumbing, which is a different review than "what
does the store listing say" (PR 4) or "what is the app id" (PR 2). The launcher
change rides along because it is the same question from the other side — how a
machine that has the Flatpak finds it.

The Android and Apple clients ship under `com.bringyour.network`. Linux was
the only platform on a different reverse-DNS id, and every place the id is
written down had to be told which one to use. This makes Linux match, and it
has to be done in one change because the id is a join key: the GTK
application id, the .desktop basename, the AppStream component id, the polkit
action namespace, the icon-theme name and the Flatpak app id must all agree or
the desktop stops recognising the app.
WHAT MOVES, AND WHY IT IS ALL ONE COMMIT
main.cpp Gtk::Application::create() -- the GApplication id
*.desktop filename, Icon=, StartupWMClass=
metainfo.xml filename, <id>, <launchable>
polkit .policy filename + all four action ids, matched in
ControlProtocol.hpp so the daemon asks about the
actions the file actually declares
icons hicolor basenames; Flatpak refuses to export an icon
whose name is not the app id
flatpak manifest filename + id + the desktop-file-edit paths
deb/rpm/tarball/ the installed paths, the conffile entries, and the
AppImage/snap uninstaller's stale-path list
Splitting these would leave an intermediate commit where, for example, the
.desktop names an icon that does not exist, or the daemon checks polkit
actions the shipped .policy does not declare -- both of which fail silently
at runtime rather than at build time.
TWO THINGS THAT ARE NOT PURE SEARCH-AND-REPLACE
1. `UrTheme::kAppIconName`. The icon name was spelled as a literal in two
places -- the by-path load in UrTheme.cpp and the by-name fallback in
MainWindow.cpp. Renaming the packaging alone left both lookups pointing at
a file that no longer existed, and `set_from_icon_name()` renders a blank
image without raising anything, so the title-bar logo simply went empty.
It is now one constant that the packaging and both call sites share.
2. The libsecret keyring attribute in SecretServiceRpcSessionStore.cpp moves
with the id. This is deliberately NOT dual-read: an entry written by an
older build is no longer found, the app falls back to a fresh RPC session
(the same one-time cost as the Flatpak data path moving), and the previous
app identity is not left holding live key material in the user's keyring
with nothing to clean it up.
No behaviour changes beyond those two. `network.ur.urnetwork` no longer
appears anywhere in the tree.
Two separate problems with the shipped icon, both visible on a normal desktop.
TRANSPARENCY. The old artwork had an opaque background baked in, so the icon
rendered as a square tile wherever the shell composites over its own surface
-- the GNOME dash, the app grid, and the window's own title bar. The
replacements are RGBA with a real alpha channel.
SIZES. Only 48 and 256 were installed. The desktop asks for 64 in the app
grid and 128/256 on a HiDPI display, and hicolor's fallback is to scale the
nearest size it has, so those lookups were served an upscale. This installs
48, 64, 128, 256 and 512.
All five are downscales of a single 1024x1024 master, taken from the same
AppIcon artwork the Apple client ships, so they cannot drift apart the way
separately-drawn assets do. The master is committed at
packaging/icons/com.bringyour.network-master-1024.png for regenerating them.
512 IS THE CEILING, DELIBERATELY. Installing the 1024 breaks the Flatpak
build outright: `flatpak build-export` refuses it with "Image too large
(1024x1024). Max. size 512x512" and fails the whole build at export time.
Nothing downstream wants a larger one -- Flathub renders the store page at up
to 512 -- so the master is kept in the tree but not installed.
app/meson.build (the Flatpak's installer) and packaging/lib/common.sh (the
staging tree the .deb, .rpm and tarball are all built from) now list the same
five sizes, and the tarball uninstaller removes all five; a size installed by
one and forgotten by the other is a file left behind on uninstall.
…validate it
Three things the AppStream metadata needed before it could be submitted
anywhere, and one reason nothing caught them.
1. THE RELEASE VERSION WAS HARDCODED, so it was wrong. Nothing wrote it, so
the file said whatever was typed into it last while the pipeline shipped a
different version. This element is not decoration: GNOME Software, KDE
Discover and the Flathub page all read <release version=...> and show it.
The file becomes a configure_file() template. app/meson.build derives both
attributes from -Dapp_version, which the pipeline already passes and which
both binaries already compile in as UR_APP_VERSION, so there is now exactly
one place the release version is written down.
The FULL version is stamped, suffix and all. appstreamcli accepts it, and
truncating would advertise a version matching no artifact -- every other
consumer of $VERSION (both binaries, every package filename, the
release-asset gates) uses the whole string -- and would collapse every
build of the same UTC day into one indistinguishable release element. Only
the date is derived, from the leading <YYYY>.<M>.<D>.
When -Dapp_version is not passed, meson warns loudly. That branch cannot be
caught any other way: a document saying version="0.0.0" is perfectly valid
AppStream, so no validator objects -- it just appears on the store page.
2. NO SCREENSHOT. Flathub requires at least one, and it is the single largest
thing a store listing is judged on. Added as a committed PNG plus the raw
URL Flathub mirrors from; a repo-relative path does not work, because the
mirror step runs on a build host with only the URL. The declared width and
height match the file exactly, which Flathub's linter checks.
3. NOTHING VALIDATED THE FILE. That is how (1) survived. appstreamcli is the
validator Flathub gates submissions on, so it now runs in two places
against the GENERATED file rather than the template: as a meson test
(optional -- not every build host has appstreamcli) and as a CI step in the
gui job, which is the one that always has it.
Verified: `appstreamcli validate --no-net --pedantic` passes on the stamped
output for a real release version and for the 0.0.0 sentinel, and the date
derivation was exercised for zero-padded and unpadded month/day.
… bundle by arch
Three defects in the Flatpak path, all of which only show up in a shipped
artifact rather than at build time.
1. THE BUILD REPORTED 0.0.0. The committed manifest carries no -Dapp_version,
so meson falls back to its dev sentinel. That is not cosmetic here: the
Flatpak is the ONLY artifact that installs the AppStream metainfo
(packaging/lib/common.sh's assemble_daemon_root() whitelist excludes
usr/share/metainfo, and make-appimage.sh does not package it), and that file
is what GNOME Software, KDE Discover and the Flathub page read. A 0.0.0
there is valid AppStream, so nothing rejects it -- it just appears on the
store page.
The script now stamps -Dapp_version into a COPY of the manifest before the
build, leaving the developer's working tree untouched, and refuses to
continue if the config-opts anchor it keys off has moved rather than
silently building an unstamped bundle. It is done here rather than in the
release workflow so that a local `--install` and a CI build produce the same
version.
2. NO -Dsdk_arch. flatpak-builder builds for the machine it runs on, so the
value is derived from `uname -m` and stamped alongside the version;
overridable with ARCH= for the rare cross case.
3. BOTH ARCHITECTURES WROTE THE SAME BUNDLE FILENAME. `URnetwork-<version>.flatpak`
carries no arch, so the amd64 and arm64 legs collide and one silently
overwrites the other wherever the artifacts are collected. The bundle is now
`URnetwork-<version>-<arch>.flatpak`, matching what every other artifact in
packaging/ already does: the build script names its own output.
Also documents the manifest header accordingly -- go through make-flatpak.sh
rather than calling flatpak-builder directly -- and adds the third Flathub
prerequisite: Flathub builds the manifest on its own infrastructure where this
script never runs, so -Dapp_version has to be written into config-opts before
submission or the listing shows 0.0.0.
The `urnetwork` launcher script gains the Flatpak as its last fallback. It is
last on purpose: the Flatpak exports its own desktop entry under the same app
id, so on a Flatpak machine this launcher normally loses on XDG precedence and
is never invoked. It is reached only when that export is missing or shadowed --
and in exactly that case the old behaviour was to tell the user to download a
GUI they already had installed.
@Ryanmello07Ryanmello07 changed the title PR 5 — upstream/flatpak-channelflatpak: stamp the version and arch in the build script, and name the bundle by archAug 21, 2026
@Ryanmello07
Ryanmello07 marked this pull request as ready for review August 21, 2026 15:42
@Ryanmello07
Ryanmello07 merged commit 1659699 into urnetwork:mainAug 21, 2026
3 checks passed
Sign up for freeto 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

@Ryanmello07
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

flatpak: stamp the version and arch in the build script, and name the bundle by arch - #10

Merged
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel
Aug 21, 2026
Merged

flatpak: stamp the version and arch in the build script, and name the bundle by arch#10
Ryanmello07 merged 4 commits into
urnetwork:mainfrom
Ryanmello07:upstream/flatpak-channel

Conversation

@Ryanmello07

@Ryanmello07Ryanmello07 commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Stacked PR — depends on #5, #7 and #9 (metainfo).
Opened against main because a cross-fork PR needs its base branch to exist in
this repo, so the diff below currently includes its parent's changes too.
Review after its parent lands.


Three defects in the Flatpak path. All three only show up in a shipped artifact,
never at build time.

1. Every build reported 0.0.0

The committed manifest carries no -Dapp_version, so meson falls back to its dev
sentinel. That is not cosmetic here: the Flatpak is the only artifact that
installs the AppStream metainfo
packaging/lib/common.sh's
assemble_daemon_root() whitelist excludes usr/share/metainfo, and
make-appimage.sh does not package it either — and that file is what GNOME
Software, KDE Discover and the Flathub page read. A 0.0.0 there is valid
AppStream, so nothing rejects it; it just appears on the store page.

make-flatpak.sh now stamps -Dapp_version into a copy of the manifest
before the build, leaving the developer's working tree untouched, and refuses
to continue
if the config-opts anchor it keys off has moved — rather than
silently building an unstamped bundle. It is done in the script rather than in
the release workflow so a local --install and a CI build produce the same
version.

2. No -Dsdk_arch

flatpak-builder builds for the machine it runs on, so the value is derived from
uname -m and stamped alongside the version. Overridable with ARCH= for the
rare cross case, with an explicit error on an unrecognised machine.

3. Both architectures wrote the same bundle filename

URnetwork-<version>.flatpak carries no arch, so the amd64 and arm64 legs
collide and one silently overwrites the other wherever the artifacts are
collected. The bundle is now URnetwork-<version>-<arch>.flatpak, matching what
every other script in packaging/ already does: the build script names its own
output rather than leaving a workflow to rename it.

Manifest header

Updated to say "go through make-flatpak.sh", and to add the third Flathub
prerequisite alongside the two already documented: Flathub builds this manifest
on its own infrastructure, where make-flatpak.sh never runs, so
-Dapp_version has to be written into config-opts before submission or the
listing shows 0.0.0.

The launcher gains a Flatpak fallback

app/packaging/urnetwork-launcher now falls back to flatpak run com.bringyour.network as its last candidate. Last on purpose: the Flatpak
exports its own desktop entry under the same app id, so on a Flatpak machine this
launcher normally loses on XDG precedence and is never invoked at all. It is
reached only when that export is missing or shadowed — and in exactly that case
the old behaviour was to tell the user to download a GUI they already had
installed.

Verified

bash -n on the script and the launcher (also sh -n, since the launcher is
POSIX sh); the manifest parses as YAML before and after the stamping sed is
applied for real, and the stamped config-opts land in the right module.

Why this is split this way

This is the Flatpak's build plumbing, which is a different review than "what
does the store listing say" (PR 4) or "what is the app id" (PR 2). The launcher
change rides along because it is the same question from the other side — how a
machine that has the Flatpak finds it.

The Android and Apple clients ship under `com.bringyour.network`. Linux was
the only platform on a different reverse-DNS id, and every place the id is
written down had to be told which one to use. This makes Linux match, and it
has to be done in one change because the id is a join key: the GTK
application id, the .desktop basename, the AppStream component id, the polkit
action namespace, the icon-theme name and the Flatpak app id must all agree or
the desktop stops recognising the app.
WHAT MOVES, AND WHY IT IS ALL ONE COMMIT
main.cpp Gtk::Application::create() -- the GApplication id
*.desktop filename, Icon=, StartupWMClass=
metainfo.xml filename, <id>, <launchable>
polkit .policy filename + all four action ids, matched in
ControlProtocol.hpp so the daemon asks about the
actions the file actually declares
icons hicolor basenames; Flatpak refuses to export an icon
whose name is not the app id
flatpak manifest filename + id + the desktop-file-edit paths
deb/rpm/tarball/ the installed paths, the conffile entries, and the
AppImage/snap uninstaller's stale-path list
Splitting these would leave an intermediate commit where, for example, the
.desktop names an icon that does not exist, or the daemon checks polkit
actions the shipped .policy does not declare -- both of which fail silently
at runtime rather than at build time.
TWO THINGS THAT ARE NOT PURE SEARCH-AND-REPLACE
1. `UrTheme::kAppIconName`. The icon name was spelled as a literal in two
places -- the by-path load in UrTheme.cpp and the by-name fallback in
MainWindow.cpp. Renaming the packaging alone left both lookups pointing at
a file that no longer existed, and `set_from_icon_name()` renders a blank
image without raising anything, so the title-bar logo simply went empty.
It is now one constant that the packaging and both call sites share.
2. The libsecret keyring attribute in SecretServiceRpcSessionStore.cpp moves
with the id. This is deliberately NOT dual-read: an entry written by an
older build is no longer found, the app falls back to a fresh RPC session
(the same one-time cost as the Flatpak data path moving), and the previous
app identity is not left holding live key material in the user's keyring
with nothing to clean it up.
No behaviour changes beyond those two. `network.ur.urnetwork` no longer
appears anywhere in the tree.
Two separate problems with the shipped icon, both visible on a normal desktop.
TRANSPARENCY. The old artwork had an opaque background baked in, so the icon
rendered as a square tile wherever the shell composites over its own surface
-- the GNOME dash, the app grid, and the window's own title bar. The
replacements are RGBA with a real alpha channel.
SIZES. Only 48 and 256 were installed. The desktop asks for 64 in the app
grid and 128/256 on a HiDPI display, and hicolor's fallback is to scale the
nearest size it has, so those lookups were served an upscale. This installs
48, 64, 128, 256 and 512.
All five are downscales of a single 1024x1024 master, taken from the same
AppIcon artwork the Apple client ships, so they cannot drift apart the way
separately-drawn assets do. The master is committed at
packaging/icons/com.bringyour.network-master-1024.png for regenerating them.
512 IS THE CEILING, DELIBERATELY. Installing the 1024 breaks the Flatpak
build outright: `flatpak build-export` refuses it with "Image too large
(1024x1024). Max. size 512x512" and fails the whole build at export time.
Nothing downstream wants a larger one -- Flathub renders the store page at up
to 512 -- so the master is kept in the tree but not installed.
app/meson.build (the Flatpak's installer) and packaging/lib/common.sh (the
staging tree the .deb, .rpm and tarball are all built from) now list the same
five sizes, and the tarball uninstaller removes all five; a size installed by
one and forgotten by the other is a file left behind on uninstall.
…validate it
Three things the AppStream metadata needed before it could be submitted
anywhere, and one reason nothing caught them.
1. THE RELEASE VERSION WAS HARDCODED, so it was wrong. Nothing wrote it, so
the file said whatever was typed into it last while the pipeline shipped a
different version. This element is not decoration: GNOME Software, KDE
Discover and the Flathub page all read <release version=...> and show it.
The file becomes a configure_file() template. app/meson.build derives both
attributes from -Dapp_version, which the pipeline already passes and which
both binaries already compile in as UR_APP_VERSION, so there is now exactly
one place the release version is written down.
The FULL version is stamped, suffix and all. appstreamcli accepts it, and
truncating would advertise a version matching no artifact -- every other
consumer of $VERSION (both binaries, every package filename, the
release-asset gates) uses the whole string -- and would collapse every
build of the same UTC day into one indistinguishable release element. Only
the date is derived, from the leading <YYYY>.<M>.<D>.
When -Dapp_version is not passed, meson warns loudly. That branch cannot be
caught any other way: a document saying version="0.0.0" is perfectly valid
AppStream, so no validator objects -- it just appears on the store page.
2. NO SCREENSHOT. Flathub requires at least one, and it is the single largest
thing a store listing is judged on. Added as a committed PNG plus the raw
URL Flathub mirrors from; a repo-relative path does not work, because the
mirror step runs on a build host with only the URL. The declared width and
height match the file exactly, which Flathub's linter checks.
3. NOTHING VALIDATED THE FILE. That is how (1) survived. appstreamcli is the
validator Flathub gates submissions on, so it now runs in two places
against the GENERATED file rather than the template: as a meson test
(optional -- not every build host has appstreamcli) and as a CI step in the
gui job, which is the one that always has it.
Verified: `appstreamcli validate --no-net --pedantic` passes on the stamped
output for a real release version and for the 0.0.0 sentinel, and the date
derivation was exercised for zero-padded and unpadded month/day.
… bundle by arch
Three defects in the Flatpak path, all of which only show up in a shipped
artifact rather than at build time.
1. THE BUILD REPORTED 0.0.0. The committed manifest carries no -Dapp_version,
so meson falls back to its dev sentinel. That is not cosmetic here: the
Flatpak is the ONLY artifact that installs the AppStream metainfo
(packaging/lib/common.sh's assemble_daemon_root() whitelist excludes
usr/share/metainfo, and make-appimage.sh does not package it), and that file
is what GNOME Software, KDE Discover and the Flathub page read. A 0.0.0
there is valid AppStream, so nothing rejects it -- it just appears on the
store page.
The script now stamps -Dapp_version into a COPY of the manifest before the
build, leaving the developer's working tree untouched, and refuses to
continue if the config-opts anchor it keys off has moved rather than
silently building an unstamped bundle. It is done here rather than in the
release workflow so that a local `--install` and a CI build produce the same
version.
2. NO -Dsdk_arch. flatpak-builder builds for the machine it runs on, so the
value is derived from `uname -m` and stamped alongside the version;
overridable with ARCH= for the rare cross case.
3. BOTH ARCHITECTURES WROTE THE SAME BUNDLE FILENAME. `URnetwork-<version>.flatpak`
carries no arch, so the amd64 and arm64 legs collide and one silently
overwrites the other wherever the artifacts are collected. The bundle is now
`URnetwork-<version>-<arch>.flatpak`, matching what every other artifact in
packaging/ already does: the build script names its own output.
Also documents the manifest header accordingly -- go through make-flatpak.sh
rather than calling flatpak-builder directly -- and adds the third Flathub
prerequisite: Flathub builds the manifest on its own infrastructure where this
script never runs, so -Dapp_version has to be written into config-opts before
submission or the listing shows 0.0.0.
The `urnetwork` launcher script gains the Flatpak as its last fallback. It is
last on purpose: the Flatpak exports its own desktop entry under the same app
id, so on a Flatpak machine this launcher normally loses on XDG precedence and
is never invoked. It is reached only when that export is missing or shadowed --
and in exactly that case the old behaviour was to tell the user to download a
GUI they already had installed.
@Ryanmello07Ryanmello07 changed the title PR 5 — upstream/flatpak-channelflatpak: stamp the version and arch in the build script, and name the bundle by archAug 21, 2026
@Ryanmello07
Ryanmello07 marked this pull request as ready for review August 21, 2026 15:42
@Ryanmello07
Ryanmello07 merged commit 1659699 into urnetwork:mainAug 21, 2026
3 checks passed
Sign up for freeto 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

@Ryanmello07