Server:
- GET/PUT /api/v1/sync/presets — upsert with last-write-wins
- DELETE /api/v1/sync/presets/:id
- GET/PUT /api/v1/sync/progress — game progress upsert
Client:
- syncService.js: offline-first sync layer
- localStorage remains primary store
- Pushes to server when logged in
- Merges server data into local on sync
- Auto-sync every 30s + on tab focus
- AuthContext starts/stops sync on login/logout
- Sync runs on session restore (refresh token)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>