- 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>
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>