# 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. ## Completed Ops Helpers - Added a detached production compose launcher at `scripts/prod-up.sh` so the stack can be started without attaching the terminal to container output. - Added a Traefik compose override sample at `compose.traefik.yml.sample` for production routing and proxy-network attachment. - The production launcher now targets only `db`, `backend`, and `frontend`, keeping the dev Caddy proxy out of the production path. - The Caddy proxy service now runs only under the `dev` compose profile, and `scripts/dev-up.sh` enables that profile automatically. ## 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.