Skip to content

Releases

Service file and GUI separation

Choose a tag to compare

@bobbycomet bobbycomet released this 31 Oct 08:10
45ea323

Changed

  • Scheduled checks now run independently of the GUI
    systemd --user service units no longer depend on the Griffin Updater process (or tray) being open. Timers fire and notify-send notifications still work after the window is closed or the app is fully quit.

  • Robust ExecStart resolution
    Units are generated with the best available invocation, in this order:

    1. Current AppImage path ($APPIMAGE) — the same .AppImage acts as the CLI
    2. Installed griffin-updater-cli console script
    3. python -m griffin_updater.cli (dev / editable installs)
  • Main binary accepts CLI subcommands
    griffin-updater / the AppImage can now be invoked as:

    • check --id <app>
    • check-all
    • install-timers
      so systemd units can call them directly without starting the GUI.
  • Changed the Icon to match the Griffin Branding

Added

  • Update Scripts toolbar button
    Regenerates every service + timer for the current install method. Use after moving the AppImage, reinstalling via pip, or upgrading to 2.2.0 so existing units pick up the independent style. Shows a summary of successes/failures.

v2.1.1 multi-launch fix

Choose a tag to compare

@bobbycomet bobbycomet released this 30 Aug 22:44
900b24d

Scheduled checks launched multiple GUI instances instead of running the CLI.

When Griffin Updater was running as an AppImage, config.python_executable() returned the AppImage path. That path was written into the per-app systemd --user oneshot units as:text

ExecStart=/path/to/Griffin-Updater.AppImage -m griffin_updater.cli check --id <id>

The AppImage entry point () always started the GUI and ignored the CLI arguments, so every timer fire opened a new Griffin Updater window. Manual “Check Now” / “Check All Now” were unaffected because they call the checker in-process.

The frozen entry point now inspects sys.argv and, when invoked with -m griffin_updater.cli … (or the equivalent cleaner forms), dispatches to griffin_updater.cli.main instead of the GUI. Existing unit files continue to work after the AppImage is rebuilt and Regenerate Timers is run.

v2.1.0

Choose a tag to compare

@bobbycomet bobbycomet released this 21 Jul 19:30
9602c06

This release rolls in everything originally slated for the skipped v2.0.6 release. Other application updates were briefly delayed while getting Fan Hub sorted out, but everything is now back on schedule!

Read the CHANGELOG.md

v2.0.5

Choose a tag to compare

@bobbycomet bobbycomet released this 07 Jul 21:54
5a77734

v2.0.5 New Features and Fixes

Added

  • "Regenerate Timers" button in the toolbar (also available as
    griffin-updater-cli install-timers, which now does the same thing).
    Previously, if an app's .service/.timer files under
    ~/.config/systemd/user/ were deleted or corrupted by anything other
    than Griffin Updater's own Remove button, there was no way to get them
    back short of opening Edit and re-saving that one app manually. This
    regenerates every configured app's units from scratch in one pass.
  • Orphaned unit cleanup, folded into the same action. If a
    .service/.timer pair exists on disk with no matching app in Griffin
    Updater's config at all (e.g., removed some way other than the GUI, or
    left over from an older version), Regenerate Timers now finds and
    removes those too, instead of leaving them to linger forever. Reports
    how many orphaned units were cleaned up alongside the regenerate result.

Fixed

  • Removing an app didn't clear its stored state. The systemd units
    were already being cleaned up correctly on Remove, but the app's
    installed-version/log history in state.json was left behind. Re-
    adding the same app later could silently inherit that stale state and
    report "already up to date" even though nothing had actually been
    installed since the re-add. Removing an app now clears its state too,
    so a full remove-and-re-add always starts genuinely fresh.

Clarified (no code change needed)

  • Double-checked whether Griffin Updater has an equivalent to the old
    standalone appify-updater.sh's deb-vs-AppImage auto-detection bug
    (where having both installed for testing caused it to always assume
    .deb, even when AppImage was the one that should've been checked).
    It doesn't: appimage_installer.py and archive_installer.py never
    call dpkg-query at all, under any circumstance - app category is
    fixed by what you explicitly picked in Add/Edit, with no runtime
    auto-detection heuristic to get confused by having both installed
    side by side.

Fixed

  • A malformed regex in asset_pattern or version_regex could crash
    the entire check, uncaught.
    Both fields are user-editable (per-app, or
    via the shared catalog), and an easy typo like an unbalanced parenthesis
    previously caused a raw re.error to propagate straight out of version
    resolution instead of a clean, readable error - this surfaced while
    debugging an unrelated standalone script, and turned out to apply here
    too. Both resolve_static_url's version_regex and
    resolve_github_release's asset_pattern now compile/match inside a
    try/except and raise a normal VersionResolutionError with the actual
    regex problem spelled out, instead of an uncaught exception.
  • One app's check could silently abort the rest of a Check All/
    check-all batch.
    Before this fix, any unexpected exception during
    one app's check (the regex bug above, or anything else not already
    anticipated) would kill the whole run: in the CLI/systemd-timer path,
    every app after the failing one in that batch would simply never get
    checked, with no log entry explaining why; in the GUI, the background
    QThread would silently die mid-batch, leaving "Checking N apps..." and
    disabled buttons stuck forever, since the completion signal would never
    fire. Both the CLI's check-all and the GUI's Check All Now now isolate
    each app's check individually - a crash on one app is logged clearly
    and the rest of the batch still runs to completion.

Also

  • Confirmed (via a standalone script for a different, unrelated app that
    hit a parallel bug) that Griffin Updater's own GitHub-release asset
    matching already raised a clean error for "no asset matched," rather
    than the bash-specific footgun that prompted this investigation
    (a grep -o | sed pipeline returning nonzero under set -e when zero
    lines match, killing the script one line before it would have logged
    its own friendly error message - worth knowing about if you maintain
    similar bash tooling elsewhere.

v2.0.4

Choose a tag to compare

@bobbycomet bobbycomet released this 07 Jul 01:33
8ed4e26

Added

  • Notify-first consent for background .deb installs. When a .deb
    update is found by an unattended systemd --user timer (as opposed to
    clicking Check Now in the GUI); Griffin Updater no longer goes straight
    to the pkexec password prompt. It sends a plain desktop notification
    with an "Install Now" action first, and nothing privileged happens
    unless that's actually clicked. Dismissing/ignoring it just means the
    update doesn't happen this round - the next scheduled check asks again.
    GUI-triggered checks (Check Now/Check All) are unaffected and still go
    straight to the prompt, since you just explicitly asked for that.
  • Optional Ed25519 catalog signing. apps.json can now be signed, and
    Griffin Updater will refuse to accept a catalog update at all unless the
    signature matches a hardcoded public key - a missing, stale, or
    tampered signature is a hard failure, not a warning. Off by default
    (leave config.CATALOG_PUBLIC_KEY_HEX blank to keep the old plain-HTTPS
    behavior). See packaging/sign_catalog.py to generate a keypair and
    sign a catalog, and SECURITY.md for the full writeup of what this
    does and doesn't protect against.

Fixed

  • Status bar and table truncating long check results. Long messages
    (e.g., the deb package-name-mismatch/version-drift notes added recently)
    were getting visually cut off in both the status bar and the table's
    Status column, with no way to see the rest. Status column cells now
    carry a full-text tooltip on hover, the column itself gets a fairer
    share of the window width, and finishing a check now auto-selects that
    app's row so the complete message is immediately visible in the
    Activity Log panel below - the status bar itself now truncates long
    messages with an explicit "see Activity Log below" pointer instead of
    just spilling off the edge of the window.
  • Catalog fetch failures right after a push now explain themselves.
    If Update Catalog fails, the error now notes that a freshly pushed
    apps.json can briefly fail to fetch simply because GitHub's
    raw-content CDN hasn't caught up yet, not because the file is actually
    broken, and suggests waiting a moment and trying again before assuming
    something's wrong.
  • Corrected the "Features" wording for the archive category, which
    oversold executable detection as fully automatic. In practice, most real
    archives (anything with more than one file inside, like Godot's .NET
    build) need an explicit executable pattern set; the same-file-with-exec-
    bit fallback only covers the simple single-file case.
  • Source-install instructions now lead with a --system-site-packages
    venv as the recommended path, rather than --break-system-packages
    against the system Python (still documented as a fallback, with its
    tradeoffs spelled out, for anyone who specifically wants that instead).

v2.0.3

Choose a tag to compare

@bobbycomet bobbycomet released this 06 Jul 10:48
0e1c419

Godot support

This should work with any tar.xz and zip, as long as it follows a similar structure.

How it handles Godot's two-flavor problem: standard and .NET builds are tracked as two completely separate app entries (godot-standard, godot-mono), each with its own schedule/install location, since you may only want one. I confirmed the real GitHub asset naming first (Godot_v4.7-stable_linux.x86_64.zip / Godot_v4.7-stable_mono_linux_x86_64.zip, repo godotengine/godot) rather than guessing, and since those filenames embed the version number just like OpenTabletDriver's did, both use GitHub Repo mode so they keep tracking "latest stable" indefinitely instead of going stale after one release.

How extraction works: downloads the zip/tar.xz, extracts into / (you can choose this in the edit screen), then locates the actual binary with a regex ("executable pattern"), necessary because the standard build is one bare file at the zip root, while the .NET build extracts to a folder with the binary and a GodotSharp/ runtime folder alongside it. I tested both layouts directly (synthetic zips mimicking each), plus the no-pattern fallback (which picks the file with the executable bit set if there's exactly one).

The install location is just a path, so any drive or mount point works (/mnt/games/Engines/Godot, an external drive, whatever). There's also an optional stable symlink (e.g., godot) that always points at the current version, so a taskbar shortcut never needs updating when 4.8 ships, and a toggle for whether new versions overwrite in place or get kept side-by-side as Godot-4.7-stable, Godot-4.8-stable, etc. (tested both modes).

I added both Godot entries to resources/apps.json already, so I pushed that file, and hitting Update Catalog will surface them immediately.

v2.0.2

Choose a tag to compare

@bobbycomet bobbycomet released this 06 Jul 01:38
beedb1a

Security update

Added optional SHA-256 pinning. Each app entry now has an optional sha256 field (in the Add/Edit dialog and the catalog schema). If set, the download is hashed, and the install is refused on mismatch.

One caveat worth remembering: this only makes sense for a fixed release you don't intend to keep auto-updating; every new upstream version has a different hash by definition, so leave it blank for apps you want tracking "latest" indefinitely (which is the normal case here).

v2.0.1

Choose a tag to compare

@bobbycomet bobbycomet released this 05 Jul 23:25
f663f91

Bug Fixes

Fixed a bug where a deb or appimage has the wrong version number (supposed to be 3.1.0 but the control file says 3.0.0, for example), it will now alert you that it is downloaded, but it is in a loop of it is installed again, but didn't because it is already there will have to be fixed on the next update upstream by those developers.

v2.0.0

Choose a tag to compare

@bobbycomet bobbycomet released this 05 Jul 20:16
2ae6300

Griffin Updater. Check the README.

v1.0.0

Choose a tag to compare

@bobbycomet bobbycomet released this 05 Jul 13:44
d191432
Update README.md