Skip to content

Add sqgipkg release packaging#141

Open
supercamel wants to merge 14 commits into
elly-code:mainfrom
supercamel:main
Open

Add sqgipkg release packaging#141
supercamel wants to merge 14 commits into
elly-code:mainfrom
supercamel:main

Conversation

@supercamel

Copy link
Copy Markdown

Summary

This PR adds optional sqgipkg packaging for Jorts.

The goal is to provide a repeatable release path for Linux AppImages and Windows installers while leaving the existing Meson/Flatpak/AppCenter workflow intact.

With the added sqgipkg.json manifest and GitHub Actions workflow, release tags can build:

  • Linux x86_64 AppImage
  • Linux aarch64 AppImage
  • Windows x86_64 NSIS installer

The workflow only runs on version tag pushes or manual dispatch, so normal development pushes are not affected.

Why

I noticed the README mentions that Windows bundling/testing is a hassle. This is an attempt to make that path more repeatable by moving the packaging into a documented manifest and CI workflow.

sqgipkg handles the packaging setup, dependency staging, AppImage generation, Windows runtime bundling, and NSIS installer generation from the same release workflow.

Release flow

If you choose to use this workflow for releases, it can be triggered with a normal version tag, for example:

git tag v0.1.0
git push origin v0.1.0

The workflow will then build the AppImages and Windows installer and attach them to the GitHub release.

Notes

This PR is intended as an optional packaging path. It does not replace the existing build system or distribution flow.

The Windows target uses the MinGW/MSYS2 environment and bundles the required GTK/Granite/runtime dependencies into the installer.

This PR also adds a small Jorts.Bin wrapper for Granite 7.4 compatibility.

The current code appears to rely on API available in newer Granite versions, but the Ubuntu 24.04/Noble CI environment provides Granite 7.4. The wrapper is intended as a minimal compatibility shim so the packaging workflow can build cleanly against the reference CI stack.

Testing

I ran sqgipkg --target all locally and verified that the expected artifacts were generated:

dist-linux-x86_64/Jorts.AppImage
dist-linux-aarch64/Jorts.AppImage
dist-windows-x86_64/Jorts-Setup.exe

I have tested the Windows installer and the application ran from the start menu as expected, but I am not completely certain that all resources are properly included.

I also ran the GitHub Actions workflow on my fork and verified the generated artifacts where possible.

Happy to adjust the packaging setup if you’d prefer it handled differently.

supercamel and others added 5 commits June 10, 2026 10:26
Add adwaita-icon-theme-legacy and elementary-icon-theme packages and
stage the app hicolor icon set (incl. @2 HiDPI and scalable.svg) for the
Windows build, matching the Linux file mappings.
The Windows block pins gtk_icon_theme so the staging writes a
settings.ini that lets GTK resolve bundled symbolic icons. The
AppImage path reads the top-level gtk_icon_theme via
write_linux_gtk_settings, but it was only set inside the windows
block, so the AppImage pinned no icon theme and UI icons went
missing. Set a top-level gtk_icon_theme=Adwaita to mirror the
Windows behaviour.
The app forces gtk_icon_theme_name = "elementary" at runtime
(Application.vala). Toolbar icons (list-add, open-menu, etc.) are
compiled into GTK4 so they always render, but the emoji button uses
random face-*-symbolic emotes which are not built in and only exist
in the elementary icon theme. The Linux AppImage only bundled
adwaita/hicolor, so those emotes could not be resolved and the
button appeared blank. Add elementary-icon-theme to both Linux deb
package lists and pin the top-level gtk_icon_theme to elementary to
match what the app actually uses (mirrors the Windows build, which
already bundles mingw-w64-x86_64-elementary-icon-theme).
The 'new emoji' button cycles through face-*-symbolic icons that only
exist in the elementary icon theme. In distributed builds (AppImage,
Windows) where that theme may be absent or not resolved, the button
rendered blank.

Vendor the 21 emote symbolics into the app's own GResource under
icons/scalable/emotes/. GtkApplication automatically registers
<resource_base_path>/icons as a resource icon path, so GTK resolves
these icons by name regardless of the active icon theme. Verified the
icons resolve to resource:///... even with no icon theme present.

Icons sourced from elementary-icon-theme (GPL-3.0-or-later), compatible
with Jorts' license.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have some questions about this
Jorts forces the elementary icons and theme, because everytime it did not i would end up with a savage mess that doesnt really look good

icons missing is fine-ish, that kind of workaround works peachy, but i now worry about the app not being consistent by platform, and if icons are missing then the theme is, too?...

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have realised some icons were missing and I have resolved that in the latest commit.
I will look into the theme. I don't see any reason why theme could not be staged and packaged for both AppImage and Windows NSIS builds.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

elementary OS theme is packaged, normally, for msys2

Comment thread .github/workflows/release.yml Outdated
on:
push:
tags:
- 'v*'

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

versioning doesnt use a 'v' prefix. It is always x.y.z

Comment thread sqgipkg.json
Comment thread src/meson.build Outdated
Comment thread data/meson.build
'gresource',
gresource_file,
source_dir: '.'
glib_compile_resources = find_program('glib-compile-resources', native: true)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this block confuses me. Is it to avoid using gnome.compile_resources? Why?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, this one is to avoid gnome.compile_resources. it breaks in the sqgipkg mingw cross-build.

what happens is meson’s gnome module tries to find glib-compile-resources via gio-2.0.pc. in the windows cross environment, that resolves through the msys2 gio-2.0.pc, which points at glib-compile-resources without .exe. msys2 actually ships glib-compile-resources.exe, so meson falls over during setup.

for gresources we only need the build-machine tool anyway. it generates gresource.c, then that c file is compiled for the windows target.

so this uses:

find_program('glib-compile-resources', native: true)

to explicitly use the host tool and avoid the broken mingw pkg-config tool path.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahhhhh thank you

@teamcons

Copy link
Copy Markdown
Collaborator

This is a really big PR at once, and i did not know you had your eyes on this repo???

there were windows installers a few versions back, but i broke it to overhaul how these are done (and because of not wanting to spin up a VM)

@supercamel

Copy link
Copy Markdown
Author

This is a really big PR at once, and i did not know you had your eyes on this repo???

there were windows installers a few versions back, but i broke it to overhaul how these are done (and because of not wanting to spin up a VM)

It is a big PR. I was hoping to make this as non-invasive as possible and to just add an optional release path, however during the course of troubleshooting I've touched more than necessary. I'm going to revert all the unnecessary changes and clean up the history.

@teamcons

Copy link
Copy Markdown
Collaborator

The stuff to make it compatible with Ubuntu 24.04 like Jorts.Bin, the meson plumbing changes, maybe the icons failsafe,

if all these do not break anything i would really appreciate if you can submit them in a separate PR? The Bin wrapper and granite versioning id like to add some stuff to the branch

@supercamel

Copy link
Copy Markdown
Author

The stuff to make it compatible with Ubuntu 24.04 like Jorts.Bin, the meson plumbing changes, maybe the icons failsafe,

if all these do not break anything i would really appreciate if you can submit them in a separate PR? The Bin wrapper and granite versioning id like to add some stuff to the branch

I’ve reworked this since the earlier version.

I no longer need the Jorts.Bin compatibility changes, because I’ve added the required GTK/Granite versions as native projects in the packaging manifest and build them from source for the release build.

That keeps the app-side changes much smaller. The remaining Meson changes are only there to support the Windows cross-compilation path.

Would you still like those Meson/build changes split into a separate PR, or is it okay to keep them together with the optional sqgipkg packaging work?

@supercamel

Copy link
Copy Markdown
Author

I have come across one issue that required code to touched. The elementary theme icons are broken on Windows. The SVG images are not properly rendered and I'm not sure why. The Adwaita icons work properly, and so forcing that theme on Windows builds seem like a fair work around.

I have verified all builds, and all icons and themes work correctly.

@teamcons

Copy link
Copy Markdown
Collaborator

Would you still like those Meson/build changes split into a separate PR, or is it okay to keep them together with the optional sqgipkg packaging work?

Nah should be fine you can leave it in

I have come across one issue that required code to touched. The elementary theme icons are broken on Windows. The SVG images are not properly rendered and I'm not sure why. The Adwaita icons work properly, and so forcing that theme on Windows builds seem like a fair work around.

I have verified all builds, and all icons and themes work correctly.

Ive banged my head so hard on those damn icons believe me. Had to do some crazy shenanigans by hand just to get 90% of it working. Lets just use the adwaita for now ugh

note that in 4.22 currently even on linux the elementary icons are broken, because some symbolics use functions that the gtk 4.22 svg renderer dont support yet. It'll be fixed but not yet

(i suspect, same thing for the gnome meson module, when i built installers for windows, the gschema had to be built by hand in the deploy...)

@teamcons

Copy link
Copy Markdown
Collaborator

Tried the Appimage. Works great!
A tiny nitpick, translations does not seem loaded?

@teamcons

Copy link
Copy Markdown
Collaborator

Tried the nsis installer

Of note:
-The font is not installed, so the scribbly mode is broken. The custom nsis that was there previously had a couple things to add and register the font without requiring admin (the installer was made to not need admin at all).
-the Inter font is not installed either? Windows font is very alien
-The installer uses the wrong icon... i did an icon for installer. Minor issue though

the new installer is much faster in theres just one page. I like that. It is very ugly though

Comment thread sqgipkg.json
],
"files": [
"build-windows-x86_64/data/io.github.elly_code.jorts.gschema.xml=share/glib-2.0/schemas/io.github.elly_code.jorts.gschema.xml",
"windows/loaders.cache=lib/gdk-pixbuf-2.0/2.10.0/loaders.cache",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"windows/loaders.cache=lib/gdk-pixbuf-2.0/2.10.0/loaders.cache",

this was when i was doing some epic manual tattling to get icons to render, we can drop it

Comment thread sqgipkg.json
"files": [
"build-windows-x86_64/data/io.github.elly_code.jorts.gschema.xml=share/glib-2.0/schemas/io.github.elly_code.jorts.gschema.xml",
"windows/loaders.cache=lib/gdk-pixbuf-2.0/2.10.0/loaders.cache",
"data/fonts/RedactedScript-Regular.ttf=share/fonts/RedactedScript-Regular.ttf",

@teamcons teamcons Jun 11, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since we are not working on an nsis script, how could we handle the installation for windows?
I dont think Meson can do this, since it is then all bungled into an exe?

Comment thread sqgipkg.json
"installer_name": "Jorts-Setup.exe",
"install_dir": "$LOCALAPPDATA\\Programs\\io.github.elly_code.jorts",
"request_execution_level": "user",
"icon": "windows/icons/icon.ico",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"icon": "windows/icons/icon.ico",
"icon": "windows/icons/install.ico",

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants