10 KiB
10 KiB
Changelog
All notable changes to DeckyVault will be documented in this file.
[2026.0.100] - 2026-05-10
Added
- Screenshot upload during benchmark submission (Review step), gated on settings presence
- Best FPS and performance badges on games list cards
- Game version info and anti-cheat context in preset detail modal
- Auto-computed battery life estimate in submit wizard Review step
Changed
- Screenshot upload moved from post-submission interstitial into wizard Review step
- Preset detail modal shows game version/build and game-level anti-cheat info
Removed
- Manual
estimatedBatteryMinfield; all battery estimates now auto-computed from TDP + watt-hours
Technical
- Dropped
estimated_battery_mincolumn fromperformance_entries - Listing API returns
bestFps,isRawPerformer,isPoorPerformance - Updated all component interfaces to remove deprecated battery field
[2026.0.99] - 2026-05-09
Added
- Screenshot uploads (1–2 per benchmark entry) with server-side compression and EXIF stripping
- YouTube video linking on performance entries (privacy-enhanced embed)
- Auto-pinning: entries with ≥10 votes and ≥80% approval auto-pin
- Hardware watt-hours (battery capacity) and max TDP fields for battery life estimation
- TDP tracking per performance entry (user-set TDP cap)
- Auto-computed battery life estimates on performance cards and detail view
- Battery Life vs TDP chart on game statistics dashboard
- Mobile filter drawer: slide-out overlay on games list for narrow viewports
- Mobile game cover hero: full-bleed background image with gradient overlay
Changed
- Performance cards now show TDP/Wh/battery quick-look bar on handheld devices
- Game details hero renders as full-bleed background on mobile (<md) viewports
- Games list filter panel now uses a slide-out drawer on screens below
lg estimatedBatteryMinfield deprecated in favor of auto-computed values from TDP + device watt-hours
Fixed
- Games list filter panel no longer overflows the page on mobile
Technical
- Added
entry_screenshotsdatabase table - Added
tdpWattsandyoutubeVideoIdcolumns toperformance_entries - Added
wattHoursandtdpMaxcolumns tohardware - Added
sharpimage processing dependency for screenshot compression - Added on-vote auto-pin trigger in performance vote handlers
- Added
BatteryLifeChartECharts component
[2026.0.98] - 2026-05-09
Added
- Cloudflare R2 storage integration with upload, delete, and tracking
- Profile photo upload, customization, and deletion (stored in R2)
- Modular daily cron system at
/api/cron/dailywith storage cleanup and sitemap regeneration tasks - Public data dashboard (
/dashboard) with trending games, best new releases, and most tested/reported charts - Advanced search filters on the search page (device, FPS, FSR, Proton, anti-cheat, playability) with saved filter presets
- Admin-only sitemap regeneration endpoint
POST /api/sitemap/regenerate
Changed
- Game details page layout restructured: metadata moved inline with hero, system requirements expanded by default
- Improved game details controller navigation (gamepad focusable attributes) and mobile responsiveness
- Switched from dynamic (
force-dynamic) sitemap generation to build-time static XML files
Technical
- Added
storage_objectsdatabase table - Added R2 client module (
lib/storage/) - Added
CRON_SECRETandR2_*environment variables; deprecatedS3_*variables - Added
build:sitemapscript topackage.json
[2026.0.971] - 2026-05-09
Fixed
- Submit
can't access property "id", (intermediate value).data is undefined - Game Card Height in view extending, not fitting actual content.
[2026.0.97] - 2026-05-06
Fixed
- Sitemap.xml used ISR caching (
revalidate = 3600) which poisoned the cache with empty responses on DB hiccups; switched toforce-dynamicfor 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
syncStatuswere 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.infoJSON - 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=coveranduser-scalable=nofor 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 tolib/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 withforce-dynamic) - Added
@serwist/next,@serwist/precaching,@serwist/sw,@serwist/strategies,@serwist/expiration,@serwist/routing, andserwistdependencies - Build script updated to use
--webpackflag for@serwist/nextcompatibility
[2026.0.96] - 2026-05-01
Added
- Updates page listing all version release notes
- Update viewer with auto-extracted chapter navigation and reading progress bar
- Markdown-based content pipeline (gray-matter + remark/rehype)
- First update post converted from existing changelog
[2026.0.95] - 2026-04-30
Added
Anti-Cheat Tracking
- Per-game anti-cheat status display on game details page
- Anti-cheat badges on games list and search results
- Anti-cheat filter in games list
- Anti-cheat awareness step in benchmark submission wizard
- Anti-cheat is game-level property (not per-device)
Steam Reviews Integration
- Steam review score badge in game details hero section
- Steam review score display on games list cards
- Steam review score display on search results
- Steam review score and sentiment stored on game records
- Steam review fetching integrated into game sync flow
- Embedded Steam review snippets on game details page
- Steam review score filter in games list (min %)
- Steam review score sort option in games list
Playability Indicators
- Auto-calculated playability status (Plays Great / Playable / Needs Tweaks / Unplayable)
- Per-device playability with aggregate game-level status
- Manual override capability for admins/contributors
- Color-coded playability badges across all game views
- "Plays Great" quick-filter in games list
- Auto-recalculates on benchmark submission and Steam sync
Games List Revamp
- FPS range filter (min/max)
- FSR support filter
- Proton/Native runtime filter
- Anti-cheat status filter
- Playability status filter
- Steam review score minimum filter
- Free-to-play filter
- Multiplayer filter
- New sort options: Best Performance, Most Popular, Release Date, Steam Reviews
- Saved/bookmarked filter presets
Community Suggestions
- "Suggest Edit" button on game details page (non-Steam games only)
- Community suggestion submission for editable fields
- Moderation queue for pending suggestions
- Approve/reject workflow with review notes
- Discord webhook notifications for new suggestions
Manage Dashboard
- Overview dashboard replacing simple redirect
- Total games, benchmarks, and users stats cards
- Pending reports and suggestions counters
- 30-day activity metrics
- Top contributors leaderboard
- Playability distribution chart
- Steam sync health overview
Benchmark Peer Review
- Enhanced report system for flagging incorrect presets
- Report status tracking (open/reviewed/dismissed)
- Verified badge on peer-reviewed benchmarks
Preset Detail Modal
- Added load times (SSD/SD) display
- Added battery life estimate display
- Added custom system indicator
Changed
- Sync All now processes games in parallel (5 concurrent) instead of one-by-one
- Removed 100-game limit for Sync All (now syncs all Steam games)
- Sync Selected now uses bulk endpoint for faster processing
- Manage page now shows dashboard by default instead of redirecting to users
- Games list now supports 12 filter dimensions and 7 sort options
- Game details page now shows anti-cheat, playability, and Steam reviews prominently
- "Suggest Edit" only appears for non-Steam games (manual, GOG, Epic sources)
- Anti-cheat step in wizard now shows game-level status, not per-device
- Steam sync now sets
syncStatus: "error"on failure (was missing before) - Steam sync now handles HTTP 429 rate limiting with Retry-After support
- Steam sync now rejects non-game types (DLC, soundtracks, demos)
Fixed
- Steam reviews now display correctly (fixed pagination issue with Steam API cursor)
- Steam reviews component now handles missing/error data gracefully
- Anti-cheat badge no longer shows for games without anti-cheat
- Playability calculation only considers anti-cheat if game actually uses it
- API routes registered correctly (removed duplicate
/apiprefix) - Dashboard and saved-filters routes now accessible
- Sync logic extracted duplicated retry/backoff code into reusable helper
Technical
- Added
steamReviewScore,steamReviewSentiment,steamReviewCountto games table - Added
playabilityStatus,playabilityOverride,playabilityCalculatedAtto games and gamePlatformSupport tables - Created
community_suggestionstable for moderation workflow - Created
saved_filterstable for user filter presets - Added playability auto-calculation engine with
recalculatePlayability()export - Added Steam reviews caching API
- Added admin dashboard stats API
- Extracted
recordSyncFailure()helper for consistent sync error handling