Added
- Sort for collection, tab and external shelves: the sort dropdown (alphabetical, last session, total playtime, release date, size on disk, Metacritic, Steam review score, recently added, random) is now available for all shelf source types, not only filter shelves. Sort is shown in the source tab of the shelf editor and saved per shelf. Default remains alphabetical (no extra field stored).
- Random sort: new
randomsort option available for all shelf types — games are shuffled via Fisher-Yates on every resolve. - Surprise Me slider count: the slider label in the QAM now shows the current count in parentheses when it is greater than zero (e.g. "Surprise Me (3)"), making the configured value readable without opening the slider.
- Select shelf for native recents replacement: when "Use shelf as Recents" is enabled, a new dropdown lets you pick any specific shelf instead of always using the first visible one. Defaults to "First visible shelf" when no shelf is selected.
- SteamOS 3.9 compatibility check (
checks/steamos/steamos-3.9.sh): new validation script covering ES2020+ target,@decky/apiv3, no legacyServerAPI, duck-typing patterns,FocusNavController/GamepadUIusage,vgp_*events,afterPatch/findInReactTree,DECKY_PLUGIN_SETTINGS_DIR, Python 3.10+ patterns, and no hardcoded SteamOS version strings.steamos-gamepadui.shupdated to cover 3.5–3.9. - GitHub issue templates: added
[BUG],[FEATURE], and[ENHANCEMENT]issue templates under.github/ISSUE_TEMPLATE/, each with a "Related PRs" field for linking 0–n pull requests. - Native recents
showFeaturedItemrespects shelf toggles: when a shelf is used as native recents replacement,showFeaturedItemis now set based onshelf.highlightFirst/globalHighlightFirstinstead of always defaulting to the nativetrue. Disabling both toggles hides the hero-sized first card; enabling either shows it.
Fixed
- Collections not loading in shelf editor:
listCollectionsnow reads fromcollectionStore.m_mapCollectionsFromStorage(a MobX ObservableMap with.keys()/.get()) as a fallback whenuserCollectionsis unavailable or throws. Collection objects from this map lack a top-levelidfield — the map key (m_strId) is injected explicitly before passing tonormalize. - Non-Steam apps in native recents replacement: shelves containing non-Steam shortcuts (app type
1073741824) are now passed through to the native recents component instead of being pre-emptively blocked. If the native component crashes, the existing error trap still triggersmarkReplaceFailedand the error banner is shown. Fully native (no non-Steam apps) shelves continue to work as before. - Hero art bottom fade regression: restored
maskImage/WebkitMaskImageon the outerds-hero-backgroundcontainer, which was removed in v1.4.0. The native-style subtle 10% bottom fade (to page background over the last 5px) is back; the previous overlay-only approach covered 30% of the image. - Hero art envelope below shelf: increased hero height to extend 60px below the first shelf (in addition to 60px above), matching the original native behavior where the art visually envelopes the shelf row from both sides.
- Playtime not shown for non-Steam shortcuts: removed the
isSteam !== falseguard inGameCardthat gated the entire status/playtime block — non-Steam apps have playtime data available and it is now displayed normally. - Sort not applied on non-filter shelves:
ShelfViewwas callingresolveShelfAppIdswithout passing thesortfield, andsourceKeydid not include sort — so changing sort on collection, tab, or external shelves had no effect and did not trigger a re-resolve. Both are now corrected. - Non-Steam duplicate apps:
deduplicateNonSteamis now platform-aware — same-named shortcuts from different Unifideck platforms (e.g. "Adios" from GOG and "Adios" from Epic) are kept as separate entries; only same-named shortcuts on the same platform (true duplicates) are merged to a single entry. - Shelf cache missing sort key: the per-shelf localStorage cache is now keyed by
shelf.id + sort, so changing sort on a non-filter shelf immediately shows the correctly-ordered result instead of briefly flashing the previously-cached order. shelfKeyignoring sort in recents replacement: the cache key used to decide whether to re-resolve the active shelf for native recents substitution now includes thesortfield, so changing sort on the selected shelf correctly invalidates the cache and triggers a fresh resolve.