- Backend: transform Steam API response to match frontend expectations (games/count structure)
- Frontend: map Steam game fields (appid, name, playtime_forever) to database schema (id, title, playtimeHours)
- Add detailed logging throughout request lifecycle for debugging
- Add 60-second timeout with AbortController to prevent indefinite hanging
- Fix IndexedDB constraint violation by properly transforming game data before save
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed issue where backend was forwarding /steam/refresh to
store.steampowered.com instead of calling the actual Steam Web API.
Now properly calls:
https://api.steampowered.com/IPlayerService/GetOwnedGames/v1/
With parameters from request body (apiKey, steamId).
Fixes 'the string did not match the expected pattern' error.
Co-Authored-By: Claude <noreply@anthropic.com>
Uberspace web backend removes /api prefix before forwarding to Express,
so routes must not include /api. Changed from app.all('/api/*') to
app.all('/*').
/health route is defined first, so it takes precedence.
Fixes 404 errors when calling Steam API from production.
Co-Authored-By: Claude <noreply@anthropic.com>
Removed Cloudflare Worker URL input field and info text from
SettingsDetailPage. Backend URL is now configured via environment
variable VITE_API_URL, not in UI.
Co-Authored-By: Claude <noreply@anthropic.com>
Fix 404 errors on page refresh by redirecting all non-file/non-API
requests to index.html for client-side routing.
Co-Authored-By: Claude <noreply@anthropic.com>
Instead of the complex Cloudflare Worker setup with CORS proxy,
you can now deploy both PWA and backend on Uberspace (~5€/month).
Changes:
- Add Express.js backend server (server/index.js)
- Update ConfigService to support VITE_API_URL env variable
- Make base path configurable via VITE_BASE_PATH
- Add comprehensive Uberspace deployment guide
- Add .env.production.example for configuration
Deployment options:
1. Uberspace (recommended): Simple, all-in-one hosting
2. GitHub Pages + Cloudflare Workers: Free but complex setup
Co-Authored-By: Claude <noreply@anthropic.com>
The Cloudflare API blocks direct browser requests due to CORS.
This setup service acts as a proxy, allowing browser-based
worker deployment.
Changes:
- Create cf-setup-service.js worker for CORS proxy
- Update CloudflareService to use setup service API
- Add deployment instructions in workers/README.md
- Improve token creation guide with Zone field explanation
Next steps:
1. Deploy setup service: npx wrangler deploy workers/cf-setup-service.js --name whattoplay-setup
2. Update CF_SETUP_SERVICE_URL in CloudflareService.ts with your URL
3. Commit and push
Co-Authored-By: Claude <noreply@anthropic.com>
Added detailed 7-step guide with specific button locations and
actions to make the token creation process clearer for users.
Co-Authored-By: Claude <noreply@anthropic.com>
The specific route /settings/cloudflare was being matched by the dynamic
route /settings/:serviceId despite being defined first. IonRouterOutlet
doesn't always respect route ordering for exact matches. Wrapping routes
in Switch ensures the specific route is matched before the dynamic one.
Co-Authored-By: Claude <noreply@anthropic.com>