Added
- Snapshots — versioned settings history (Settings → Advanced). Rolling backups of the settings file at
settings/deck-shelves/backups/settings-<ts>.json(storage.py+SnapshotsSection.tsx). Automatic snapshots are throttled to one per 24 h (AUTO_BACKUP_CAP= 12, oldest pruned); user-created (manual) andimportsnapshots carry an origin icon. Per-row restore / export / delete plus delete-all; restore is itself undoable. Backend RPCslist_backups/restore_backup/create_backup/export_backup/import_backupare path-traversal guarded. Renamed from "Backups" to avoid clashing with the file export/import "Backup" area. - Cache management (Settings → Advanced). Per-key size readout + Clear (empty groups disabled) for the persisted localStorage caches, plus a confirmed clear-all (
cacheRegistry.ts); the smart-shelf memo cache folds into clear-all rather than its own row. - System information panel (Settings → Advanced, formerly "Diagnostics"). Read-only runtime detection — version, generic OS + Steam version, active theme (heuristic + CSS-Loader style count) and co-loaded plugins (TabMaster / UnifiDeck / Non-Steam Badges) — plus a summary of the active Deck Shelves configuration (counts, core toggles, the Additional-features section, and the Global-visual toggles + values). Copy button and individually gamepad-focusable rows (
diagnosticsInfo.ts+DiagnosticsSection.tsx). - Developer mode + Developer tab. A
devModeEnabledtoggle at the end of Advanced reveals a Developer tab (DeveloperDetail.tsx) hosting the on-home debug-overlay controls, the source-resolver inspector, the reactive focus chain and the diagnostic log viewer. - On-home debug overlay (
DebugOverlay.tsx). fps / frame ms, shelf / node / focusable counts, per-shelf node counts, a reactive focus readout (ancestor path + the focused element's full CSS class list + theds-*classes applied along the focus chain), and weight-coloured render outlines swept across every Steam document. Live-configurable corner / orientation / transparency / content. Mounted only when enabled (zero overhead off),pointerEvents:none, rAF cleaned up on unmount. Gated by Developer mode (or the legacyds-debug/?debug=1escape hatch). - Source-resolver inspector (
SourceResolverInspector.tsx). Live-evaluates a shelf and lists the resolved app ids per filter step. - Adjustable description text size — a global + per-shelf
descriptionScaleslider (100–200 %), replacing the old description-large boolean. - Statistics → Library trends. A KPI/numbers row plus additional, more varied chart types in the Statistics tab (
StatisticsDetail.tsx).
Changed
- Standardised iconography across Settings and the QAM. Export uses an up-arrow, import a down-arrow, delete a trash can and restore its own icon (replacing the floppy); collapsible sections carry icons in every settings tab, and the QAM import/export icons match the config pages.
Fixed
- Quick Search: the on-screen keyboard now closes when a game is found. On a match the focused text input is blurred across every Steam document and the keyboard is dismissed via all known close methods (
SearchOverlay.tsx). - Card decorations no longer float over the search keyboard / Side Nav. The portaled "new/discount" badge and the friends-playing avatars now hide while an ambient overlay (Quick Search / Side Nav) is open — the overlay-active detector treats a present
.ds-search-overlay/.ds-sidenav-overlayas covering the home (overlayState.ts,BadgeFocusOverlay.tsx,FriendsAvatarOverlay.tsx). - Unit tests resolve the workspace packages from source.
vitest.config.tsnow aliases@deck-shelves/host/@deck-shelves/apito theirsrc(mirroring thetsconfigpaths and the build config), so CI — which runs the tests before any package is built todist— no longer fails withERR_MODULE_NOT_FOUND. - Coexistence checks stop flagging false positives. The UnifiDeck check no longer treats importing our own guarded
integrations/registryhelper as a hard dependency, and the TabMaster try/catch-guard scan now excludes test files (mocks aren't runtime access) (checks/plugins/tabmaster.sh,diagnosticsInfo.ts).