--- title: "R2 Storage, Profile Photos, Dashboard, and UX Overhaul" date: "2026-05-09" version: "2026.0.98" summary: "Cloudflare R2 storage with daily cleanup cron, profile photo uploads, public data dashboard, game details UX improvements, advanced search filters, and static sitemaps." --- ### Added - **Cloudflare R2 Storage**: Full R2 integration for file uploads with storage tracking, orphan detection, and daily cleanup cron - **Profile Photos**: Upload, customize, and delete custom profile photos (stored in R2) - **Daily Cron System**: Modular `/api/cron/daily` endpoint with task registry for storage cleanup, sitemap regeneration, and future tasks - **Public Dashboard**: New `/dashboard` page with trending games, best new releases, and most tested/reported visualizations - **Advanced Search Filters**: Full filter panel on search page (device, FPS range, FSR, Proton/Native, anti-cheat, playability) with saved filter presets - **Admin Sitemap Regeneration**: `POST /api/sitemap/regenerate` for on-demand sitemap updates ### Changed - **Game Details Page**: Restructured layout — metadata now inline with hero section, system requirements expanded by default, improved controller navigation and mobile responsiveness - **Static Sitemaps**: Replaced dynamic per-request sitemap generation with build-time static XML files for zero-latency serving - **Search Page**: Added collapsible filter panel with save/load filter presets ### Technical - Added `storage_objects` database table for R2 object tracking - Added `@aws-sdk/client-s3` R2 integration (S3-compatible API) - Added `CRON_SECRET`, `R2_ACCOUNT_ID`, `R2_ACCESS_KEY_ID`, `R2_SECRET_ACCESS_KEY`, `R2_BUCKET_NAME`, `R2_PUBLIC_URL` environment variables - Deprecated `S3_*` environment variables (replaced by `R2_*`) - Removed dynamic sitemap generation in favor of `npm run build:sitemap`