Added
- CI: full GitHub Actions CI pipeline (typecheck, build:release, compatibility validations and decky submission checks)
- Tests: Python
pytestsupport alongside Vitest;pnpm run test:allhelper to run both suites - Public plugin API:
window.__DECK_SHELVES_API__for external plugins to register shelf sources (versioned API) - First-run UX: FirstRun banner and templates (Favorites, Recently Played, Installed) to bootstrap new users
- Shelf templates: Preset templates for common shelf types (most-played, recently added, awaiting-update, played-in-last-7-days)
- Shelf refresh emitter: global
ShelfRefreshEmitterto centralize refresh events and reduce per-shelf polling - Suspend/Resume hooks: SteamOS suspend/resume handling to pause timers and revalidate state on resume
- UnifiDeck surfacing: UnifiDeck-managed non-Steam apps are surfaced as sources/tabs in the editor
- Release automation: GitHub Actions release workflow for tag-triggered releases
- Diagnostics: SteamOS version detection added to startup diagnostics
- Atomic settings writes and
settings.json.bakbackup in the Python backend
Changed
- Screenshot automation: i18n-only language switching prior to captures; CDP reachability checks; deferred deletion of screenshots until targets verified
- Tests: moved TypeScript tests from
src/__tests__tosrc/test; CI updated to install and run Pythonpytestalongside Vitest - Polling → event-driven refresh: shelves now subscribe to a global emitter and use a single fallback poll (30s) instead of individual short timers
- Increase tab refresh TTL and home fallback intervals to reduce churn (tabs 30s, homePatch fallback 10s)
- Selector strategy: use ordered candidate selectors (aria-labels, stable substrings) instead of brittle obfuscated classes
Fixed
scripts/build/validate-screenshots.mjswaits for an i18n marker before validating PNGs to ensure English UI is applied- Host/URL normalization for CDP tooling to prefer HTTP/ws endpoints when TLS is not available
resetSettings()now uses a timeout wrapper to avoid blocking the UI when backend is unresponsive- Fixed
focusRestoreinterval leak by clearing previous poll in cleanup - TabMaster import error handling improved with explicit loading/error state in the QAM
- Diagnostic logging for shelves with zero resolved apps surfaced in production diagnostics
- Increased homePatch schedule fallback from 2s to 10s to reduce unnecessary CPU use
- Added nav-tree fallback for gamepad focus when internal APIs are unavailable