# WalkUp Implementation Plan

## Scope
- React PWA frontend.
- FastAPI backend.
- TeamSnap JavaScript SDK on the client.
- Server-side TeamSnap OAuth code exchange and refresh.
- Backend stores only app-owned data and TeamSnap external IDs.

## Initial Deliverables
- Thin TeamSnap auth/session backend.
- Media upload and clip registration flow.
- Game assignment and gameday APIs.
- Installable React PWA shell with offline-ready game prep scaffolding.
- Docker-based local development stack.

## Completed UI Cleanup
- Home page now acts as a lightweight landing page with direct links to Library and Gameday.
- Removed the old game-list-heavy dashboard content that was not useful as a landing surface.
- Game titles in the UI now include a day parenthetical such as `(sun 5/3)` wherever the shared formatter is used.
- TeamSnap gameday lineup reads now prefer the SDK `bulkLoad` path for `eventLineup` and `eventLineupEntry`, with rel-based fallback for accounts where bulk results are incomplete.

## Completed Offline Cache Work
- Client-side clip and assignment reads now persist locally and revalidate against server ETags.
- Normalized playback media is cacheable for offline clip playback.
- Auth and session responses remain `no-store` so cached data is limited to app-owned clip state.
- TeamSnap read queries now use cached-first stale-while-revalidate behavior on the client.

## Completed V1 Hardening
- Media and gameday mutations now stay within the authenticated session's selected team and player scope.
- Upload and clip-creation failures now clean up orphaned files before bubbling errors back to the client.

## Completed Asset Source Cleanup
- Editable artwork sources now live in `frontend/assets/design/`, while the exported web-ready images remain in `frontend/public/`.
- The splash artwork in `frontend/public/splash-art.svg` still serves as the editable vector source for the startup images in `frontend/public/`.
- The existing `frontend/public/icon.svg` already covers the app icon artwork, so no separate raster-to-vector conversion was needed there.

## Storage Status
- Backend media persists in the `backend-media` named Docker volume.

## Known Constraints
- TeamSnap entities should not be durably mirrored on the backend.
- Gameday lineup changes are local state in v1.
- Browser clip editing is first-class; backend finalizes playback assets.
