- Fix game-entry-wizard.tsx: API returns flat { id } not { data: { id } }
- Add update posts for v2026.0.96, v2026.0.97, v2026.0.971
42 lines
2.9 KiB
Markdown
42 lines
2.9 KiB
Markdown
---
|
||
title: "PWA Support, Gamepad Navigation & Sitemap Reliability"
|
||
date: "2026-05-06"
|
||
version: "2026.0.97"
|
||
summary: "PWA with offline caching, gamepad navigation hook, sitemap reliability fixes, multi-genre filtering, and shareable filter URLs."
|
||
---
|
||
|
||
# Hello everyone!
|
||
|
||
This release is a big one for reliability and quality-of-life. We've added PWA support so you can install DeckyVault on your device and use it offline, gamepad navigation for controller users, and a bunch of fixes around sitemap generation and filtering that should make the experience a lot more consistent.
|
||
|
||
As always, if you run into any issues, feel free to visit the [contact page](https://deckyvault.xyz/contact) to submit a report!
|
||
|
||
> Adrian Bonpin
|
||
|
||
## Fixed
|
||
- Sitemap.xml used ISR caching (`revalidate = 3600`) which poisoned the cache with empty responses on DB hiccups; switched to `force-dynamic` for per-request fresh generation
|
||
- DB errors during sitemap generation were silently caught and returned as empty arrays (no games indexed); errors now propagate to observability with structured logging
|
||
- Games with NULL `syncStatus` were excluded from sitemap due to SQL `<> 'failed'` returning NULL (not TRUE) for NULL values
|
||
- Multi-genre selection in games filter panel only applied the first selected genre; now supports comma-separated OR-matching
|
||
- FPS range filter included results from non-active devices; now scoped to the selected device filter when present
|
||
|
||
## Added
|
||
- PWA service worker with offline caching for game pages and images (stale-while-revalidate for HTML, cache-first for Steam CDN images)
|
||
- Offline fallback page (`offline.html`) when navigating without network
|
||
- Gamepad navigation hook (D-pad/left stick focus, A/B/X/Y buttons, context-aware actions)
|
||
- Structured logging for sitemap generation metrics (games, devices, timestamps) via `console.info` JSON
|
||
- Filter state synchronized to URL query parameters for shareable/bookmarkable filtered views
|
||
- WCAG 2.1 AA touch targets (44×44px) on all games page filter controls
|
||
|
||
## Changed
|
||
- Web manifest icons now declare explicit 192px (maskable) and 512px (any) sizes
|
||
- Viewport meta tag added with `viewport-fit=cover` and `user-scalable=no` for installed PWA feel
|
||
- Apple mobile web app meta tags added for iOS home screen support
|
||
- Loading a saved filter now auto-collapses the filter panel for visual feedback
|
||
- Sitemap generation flattened into a single function in `app/sitemap.ts` (removed delegation to `lib/sitemap/`)
|
||
|
||
## Technical
|
||
- Removed `lib/sitemap/fetch-dynamic-entries.ts`, `lib/sitemap/build-static-entries.ts`, `lib/sitemap/validate-image-url.ts`
|
||
- Removed `app/api/revalidate-sitemap/` route (no longer needed with `force-dynamic`)
|
||
- Added `@serwist/next`, `@serwist/precaching`, `@serwist/sw`, `@serwist/strategies`, `@serwist/expiration`, `@serwist/routing`, and `serwist` dependencies
|
||
- Build script updated to use `--webpack` flag for `@serwist/next` compatibility |