0.20.0 (2026-06-05)
⚠ BREAKING CHANGES
The JSON→SQLite migration and the rebuilt ROM launcher both require a re-sync
after updating, and old Steam shortcuts must be removed. Please read before
upgrading.
Your data is safe: downloaded ROM files and on-disk save files are untouched,
and nothing on the RomM server changes. Only the plugin's local tracking state
resets and the Steam shortcuts are recreated (the launcher's path changed, so
every shortcut gets a new app ID).
Upgrade steps — in order:
- If you use save sync: in the QAM, open Settings and press Sync All
Saves Now, so your latest saves are on RomM before the local state resets. - In the QAM, open Data Management and press Remove All RomM Shortcuts —
do this on the current version, before upgrading, so the old shortcuts are
cleaned up properly. - Upgrade the plugin, then open Settings and confirm your configuration is
correct. - Re-sync your library from RomM. This recreates the shortcuts and rebuilds the
plugin's tracking state; save-sync baselines re-establish on this sync.
Playtime is restored automatically — opening a game's detail page pulls its
total back from RomM (per game, on first view). Not restored: per-game session
counts and "last played" timestamps, and any playtime that was never synced to
RomM.
The old JSON files (state.json, metadata_cache.json, firmware_cache.json,
save_sync_state.json) are silently ignored and can be deleted by hand from the
plugin's data directory.
Features
- auth: add RomM Client API Token authentication (#849) (67a2e96), closes #163
- domain: add mid-tier aggregates for #788 (#816) (8f9e2bc)
- domain: add RomSaveState and SyncRun aggregates for #788 (#817) (3b563ce)
- domain: aggregate enforcement infrastructure for #788 (#814) (53a4868)
- domain: simple aggregates (Device, SyncSettings, Playtime) for #788 (#815) (cbc4fc0)
- persistence: add SQLite migration framework (user_version) for #781 (#819) (84b5f3d)
- persistence: add SQLite repository adapters + sync Unit of Work (#826) (a8334e2), closes #783
- persistence: define Repository Protocols (#782) (#825) (3955af6)
- persistence: SQLite schema DDL + table layout for #780 (#818) (a9fea00)
- playtime: reconcile playtime from RomM notes on game-detail open (#905) (2e25eaf)
- saves: single-token memory-card extensions, keyed by RetroDECK system (#904) (040defd)
Bug Fixes
- ci: skip docs-check on release-please file changes (#800) (451217d)
- docs: exclude adr/ from published MkDocs site (#809) (ad5c510)
- downloads: key multi-file detection on total file count, not has_multiple_files (#857) (c49aac6), closes #855 #837
- persistence: upsert roms registry so re-sync keeps per-ROM children (#888) (5b65fde), closes #887
- saves: allow null tracked_save_id for hash-only baselines (#873) (7de822a)
- saves: register device with /etc/machine-id fingerprint (#880) (494f73b)
- saves: serialize StatusService save-status RMW under rom_lock (#874) (86d4fc7)
- types: make @decky/ui + callable boundary types honest (#858) (9f1e270)