Personal video game collection manager — Windows MSI and macOS PKG installers.
Previous versions (12)
1.12.1 — Environment variable overrides for config paths and credentials (issue #125)
2026-09-02
AppConfigurationHelper.BuildConfiguration() now layers friendly-named environment variables over the JSON config file (highest precedence), so manual/automated testing can redirect the shelf DB and artwork cache — or swap in an entirely separate appsettings.json — without ever mutating the shared config: GAMESHELF_DB_FILE → GameShelf:ShelfDbFile, GAMESHELF_ARTWORK_DIR → GameShelf:ArtworkCacheDir, GAMESHELF_CLIENT_ID/GAMESHELF_CLIENT_SECRET → IGDB:*, and GAMESHELF_CONFIG_PATH to read the whole config from a different file (the value vars still layer on top of it) — covers the CLI and GameShelfApi, which both bootstrap through BuildConfiguration(); unset vars inject nothing so existing behavior is unchanged (issue #125)
SHA-256 (MSI): 9c75f533b4439a05ede0a9c858051a1505c03a27e78e25745598675ef37fd5ff
SHA-256 (PKG): 51fe6749fb308fe66fde731cb9da6f1707d04c2d913e5667706faed14e3ebfde
1.12.0 — Check for Updates in the WPF and macOS GUI apps (issue #127)
2026-09-02
- Added a manual **Check for Updates** action to both GUI apps (WPF: Help menu; macOS: the app menu, under "About GameShelf") that compares the running version against the latest published release and, if newer, shows the changelog and opens the download page in the browser — deliberately notify-and-hand-off, not auto-update, since neither installer is signed/notarized (issue #127)
- Added an opt-out "check for updates on launch" preference to both apps (WPF: a new Settings ▸ Updates tab, persisted in appsettings.json; macOS: Settings ▸ Updates, persisted in
UserDefaults) — the launch check is silent and only surfaces UI when a newer version exists (issue #127)
publish-release.yml now also copies each release's manifest.json to a fixed releases/latest/manifest.json key so the desktop apps have one well-known URL to check; the Cloudflare download page is now split into a prominent "Latest version" block plus a collapsed "Previous versions" archive, with a per-version #v<version> anchor (issue #127)
SHA-256 (MSI): 3abde2cbca83cbc30aa138fd891ec05c30bce8a8d17aa714dfddda5021383e09
SHA-256 (PKG): e0a21c5f88a24a924104ca0e5bbb0ca768bf1f60bc00c78cfd84c12175cfd993
1.11.1 — Remove redundant "Edit Platform Details" dialog from WPF (issue #128)
2026-09-02
- Removed the redundant WPF "Edit > Edit Platform Details..." menu item and its standalone
PlatformManagerDialog/PlatformManagerViewModel — owned-platform editing is fully covered by the inline Details pane (a strict superset: same user fields plus Edition and the IGDB override fields, plus game count and a "View Games" link the dialog lacked); no macOS equivalent existed (issue #128)
SHA-256 (MSI): 8f2e589030f68f28ff2c1674129006697eace1ef05e6df23805a5dc48e7f0fe2
SHA-256 (PKG): e9f7d53f99bcfa6ec9f7d30a3697fdfc21326a9f0d0ea9785fbbf9fdd97ace80
1.11.0 — Track Physical Game Completeness & Condition (issue #88)
2026-09-02
- Added physical
Completeness (Factory Sealed / Complete in Box / Game only / Game and Box / Game and Booklet / Other) and Condition (Mint / Good / Fair / Poor) tracking for shelf games, threaded through the data model, schema migration, CLI (shelf games add/edit/get --completeness --condition, shown in the Details view), GameShelfApi, WPF, and macOS — both fields only apply to MediaType == Physical and read as "not applicable" for Digital copies, mirroring how Media Format already behaves (issue #88)
- Added a Statistics "Completeness" breakdown chart (Physical games only) across Services/API/WPF/macOS, with a new Fugue "box" category-rail icon on macOS; chart slices click through to the filtered game list like every other category
- Enforced the Physical-only rule at the service layer (
ShelfGame.NormalizePhysicalOnlyFields(), called from every add/edit path plus a one-time migration scrub): the CLI and REST API previously persisted a Media Format / Completeness / Condition value on a Digital copy even though the GUIs hid the editors — a pre-existing gap for Media Format since #86, now closed for all three; the Add Custom Game dialog (WPF + macOS) also hides the pickers for Digital copies
SHA-256 (MSI): 3a7a85d0e1df805daf0919e6267b7535ac91ad16662658f960be5c0d9f871c17
SHA-256 (PKG): 0a671246c9a888af65583fc6bf0f4e6b8962ec0eee91d5114ba95cbf8a563839
1.9.0 — Add Game & Platform Edition Tracking (issue #36)
2026-08-16
- Added a freetext
Edition field (Standard, Collector's, GOTY, Deluxe, Steelbook, etc.) on shelf games and owned platforms, defaulting to "Standard" and remembered/reused across entries via an editable combo box (WPF ComboBox, native NSComboBox on macOS) in the Add Game dialog and Edit Details panel; widened the ShelfGames unique constraint to (GameId, PlatformId, MediaType, Edition) so the same game can be owned in multiple editions on the same platform/media type (issue #36)
- Added a gradient top-banner shelf visual for non-Standard editions (a user-approved mockup, styled like a Win98/2000 title-bar fade), globally toggleable, with uniformly-reserved row height so a banner never clips into the shelf row above; added a "Shelf Styles…" dialog (renamed/tabbed from "Platform Spine Styles…") for customizing each edition's banner color/label
- Added Edition filter & sort support and a Statistics category (games only, by design — platform-side filter/sort/stats are out of scope for this issue) and
--edition/-e CLI options across shelf games/shelf platforms add/get/edit
- Fixed a real backup/import bug found via manual QA:
BackupService's conflict-detection and merge-import duplicate-check both compared against the "Standard" default instead of each game's actual Edition, so any non-Standard-edition entry could be silently skipped or incorrectly flagged during backup import
- Fixed
GameShelfApi's /api/shelf endpoint never binding an edition query parameter, so the macOS Edition filter (Filter panel and Statistics chart-click alike) silently returned every game unfiltered
SHA-256 (MSI): 955b40ffb4c1c0cd9c1634d1fc83e3945a814821b24e562e20b30a753f92d4a0
SHA-256 (PKG): c09b4f52e17420e981e67765f877b7e09a59ef2f98297c2cf353842c6270de51
1.8.2 — Add Ownership Tracking (Status, Date Acquired, Purchase Price) for Games and Platforms (issue #23)
2026-08-15
- Added
OwnershipStatus/DateAcquired/PurchasePrice editing, filtering, and sorting across the CLI, Services/EF Core, GameShelfApi, WPF, and macOS; games use Owned/Wishlist/Subscription, platforms get their own Owned/Wishlist enum (issue #23)
- Fixed a macOS "Owner Details" panel bug present since v1.8.0:
DisclosureGroup content that doesn't itself claim full width rendered centered instead of left-aligned — only Owner Details' short label/value rows were narrow enough to expose it, which is why every other section looked fine
- Fixed WPF Purchase Price editing rejecting a typed decimal point and refusing to clear the price back to empty, on both games and platforms; added the missing "Ownership" sort option to WPF's shelf sort dropdown (parity with macOS)
SHA-256 (MSI): 372e5f07a506e2fb42ef29f12d2de5db18787c925217971084c1359f63f1261d
SHA-256 (PKG): 503cd92c92d326be64486b6f9f5b984b4b3e2e51e0cb4e7857026ba140f6dcce
1.8.1 — Prompt for Media Type/Format on Single- and Zero-Platform Game Adds (issue #84)
2026-08-10
- Fixed the add-game panel — the only place Media Type & Media Format get chosen — being skipped entirely for games IGDB lists on 0 or 1 platform, silently leaving Media Type stuck at
Unknown; the panel now always opens, hiding only the platform checklist when there's nothing to disambiguate on the platform side (issue #84)
- WPF (
MainViewModel) and the macOS app (AppState/AddPlatformPickerView) each had an independent copy of this conflated "which platform" / "what media type" flow, so both were fixed identically
SHA-256 (MSI): 524588712bf7b09b726c384662ff782bffc81def1587cfd96a22b9d24bbf42ae
SHA-256 (PKG): dd82e655784384fb87c1638247e5ec92da9f8ba22157499d70270008451bfb8b
1.8.0 — Add Physical Media Format Tracking and Shelf View Format Badges (issues #86, #103)
2026-08-09
- Added a
MediaFormat field (Cartridge, Game Card, CD, GD-ROM, DVD, GameCube Disc, Blu-ray, UMD, SD Card, Floppy Disk, Cassette Tape, Other) tracking the physical format of Physical-media shelf games — only meaningful when Media Type is Physical — threaded through the data model, --media-format CLI options (add/edit/filter/sort), GameShelfApi, WPF, and macOS identically (issue #86)
- Added a toggleable corner-badge overlay on Shelf View cover art showing each Physical game's format at a glance, using real famfamfam-silk (WPF) and Fugue (macOS) icons rather than generated glyphs; View menu → "Show Media Format Badges", on by default (issue #103)
- The Media Format editor (add flow and detail-edit form, both GUIs) only appears once Media Type is set to Physical — showing it unconditionally let a user pick a format for a Digital game with no visible effect anywhere, which read as a no-op save
SHA-256 (MSI): 1a30982570dc8ce11fcf07817b52e6a791261dd45c51587bf2ffa2076c9ab035
SHA-256 (PKG): 5ab2a0698ee2f95f41616b15eb747aa66480a21543731af94a063532b226ac39
1.7.1 — Fix CLI --title/--name Inconsistency, Add --id to Shelf Get Commands (issue #8)
2026-08-09
- Renamed
search games's --title/-t option to --name/-n, matching search platforms and shelf games get — --name is now the only way to search/filter by name anywhere in the CLI (breaking change: scripts using --title must switch to --name) (issue #8)
- Added
--id to shelf games get and --name/--id to shelf platforms get, so a single shelf entry or owned platform can be fetched directly by ID, consistent with search platforms --id and the existing shelf games get --name (issue #8)
- Fixed 4
CommandHelperTests tests that redirected Console.Out via a raw Console.SetOut call without ever restoring it, leaving Console.Out pointed at a disposed StringWriter for the rest of the test run and causing intermittent, hard-to-reproduce failures in unrelated tests — switched them to the existing ConsoleOutput helper, which restores it on dispose (test-only; no production behavior change)
SHA-256 (MSI): 30013cc5908f4fd12c563354cf42495c024b863d6736162bdec227ab6c070703
SHA-256 (PKG): 3288c5bacefefee0ecb887d9e18a32ac0e3a286e30ed7de88fbd641a9a850505
1.7.0 — Prefer Local Artwork Cache Over Remote IGDB URLs Across CLI, WPF, and macOS (issue #7)
2026-08-08
- Added a shared
ArtworkPathResolver (GameShelfServices) so the CLI, WPF, and the macOS app (via GameShelfApi) all consistently prefer already-cached/custom local artwork over remote IGDB CDN URLs once a game or platform is on the shelf, falling back to the CDN only when nothing's cached yet (issue #7)
GameShelfApi's POST /api/shelf/POST /api/platforms now cache cover art/platform logos to disk on add (previously only the CLI cached covers, and only WPF cached logos), and its DTO mappers resolve local files the same way — no macOS client changes were needed, since it already consumed file:// URLs for custom artwork
- Added
shelf games artwork recache --id and shelf platforms logo recache --id CLI commands to force a fresh IGDB download when a cached file is missing or corrupted, and taught shelf platforms add to cache the platform logo to disk (previously only cover art was cached on add)
- Fixed the CLI never reading the configured
GameShelf:ArtworkCacheDir at startup, silently caching/resolving artwork against the default ~/Library/Application Support/GameShelf/artwork instead of the user's configured directory
- Fixed
shelf platforms refresh silently discarding a platform's version-specific logo in favor of the parent IGDB platform's logo, which broke local artwork resolution for any platform originally added under a specific hardware version
SHA-256 (MSI): fc9672c242394f9cc45658c94786aee1d0daf631f9c06f36ab066b28e27f885b
SHA-256 (PKG): 731ce22db17a1b71f16443317e97d7a6b61310cfc26481484f36461762d7eec9
1.6.1 — Fix Twitch Sign-In for All Users via Client Credentials Grant (issue #117)
2026-08-08
- Replaced the broken Authorization Code + PKCE sign-in flow (a single hardcoded Client ID shared by every install, mismatched against each user's own locally-configured Client Secret) with Twitch's Client Credentials Grant — a direct server-to-server credential check with no browser, redirect URI, or "Sign In"/"Sign Out" concept, fixing sign-in for every user except the original developer (issue #117)
- Added a Client ID field alongside the existing Client Secret field across the CLI (
config igdb-client-id, replacing auth login/auth logout), WPF, and macOS Settings/first-run screens, with the resulting pair validated against Twitch immediately on save instead of only failing later at search time
- Rewrote the "Setting Up IGDB API Credentials" Help doc with a full Twitch app registration and two-factor authentication walkthrough plus real screenshots, and removed the now-obsolete "Signing In (OAuth Login Flow)" topic
SHA-256 (MSI): d3bedec8200bf3f424132f3de3dc4d1924b392cdb5e47ee5f6b1ceb87831a407
SHA-256 (PKG): cbbb6f09c76dc903fabb432b3ed0c89cb41dec0941f14c66206930792ae2fb91
1.6.0 — Complete macOS App Feature Parity: Filtering, Full Field Editing, and Installer (issue #37)
2026-08-03
- Added a full filter panel to the macOS app (Genre/Platform/Notes/Ownership/Loan Status/Play Status/Media Type/Release Year/Rating), matching WPF's filter fields, with Apply/Clear and a "Filter Active" indicator; added client-side Sort (9 fields) and Group By (All Games/Platform/Genre) toolbar controls plus View-menu equivalents, and made List view's column headers clickable to sort, mirroring WPF
- Expanded the macOS detail pane from a handful of editable fields to full parity with WPF's 19 revertable fields per game/platform, organized into the same collapsible sections (Credits, Ratings, Classification, Style & Modes, Owner Details, Storyline & Related Titles, Media for games; Classification, Owner Details, Hardware Specs for platforms), and added editable "Owned On" platform and a Summary field to the always-visible section
- Added a first-run onboarding sheet prompting for an IGDB Client Secret on first macOS launch, with a help link into the in-app Help viewer
- Added a genuine macOS Installer
.pkg wizard (Introduction/Destination Select/Installation Type/Install/Summary) as an alternative to the drag-to-Applications .dmg, bundling both the GUI app and a gameshelf CLI binary installed to /usr/local/bin
- Fixed several install-time bugs found via real-device testing on a genuinely fresh machine: the bridge and CLI failing to bootstrap a shared config file when none exists yet anywhere on the machine (previously silently swallowed into a generic "did not become ready in time"/silent CLI exit); the embedded bridge and CLI binaries only ever being published for whichever architecture built them rather than a universal (x86_64 + arm64) binary; a default database path resolving inside the installed, read-only app bundle instead of the shared, always-writable app-data directory; and Help content (Markdown/CSS/icons) never actually being copied into the packaged app bundle
SHA-256 (MSI): b40901b0fe6dbe07f3e68dec3d2c2aaf9fc8d7a3e1bdcc6b68a1e4555acf5270
SHA-256 (PKG): f161897f3fe13c7b4f56c7412b020d1726185b2e0e985ee0341d9543b3393441