Alternative: Use a Pinia plugin that auto-persists to IndexedDB on every mutation. Libraries like pinia-plugin-persistedstate do this. Eliminates the "forgot to call save()" class of bugs.
Current: Each page registers its own useKeyboard handler with raw key checks
Alternative: Centralized input manager with action mapping. Define actions (navigate_up, select, cancel) and let pages subscribe to actions, not keys. Enables gamepad support for free.
Current: CSS keyframes scattered across global.css, component scoped styles, and inline styles
Alternative: Single animations.css file imported globally. All keyframe names namespaced (e.g., pw-fade-in, pw-pulse). Components reference by name only.
Alternative: JSON dialogue trees per coach, loaded from /content/coaches/{id}/lines.json. Enables localization, A/B testing, and coach personality tuning without code deploys.
Current: CRT overlay, particles, background grid all render on HUD
Alternative: HUD page should opt out of all decorative layers. Add a performance mode flag to PageShell that strips all non-essential rendering. Use requestAnimationFrame for telemetry updates instead of reactive refs.
Current: Mix of Tailwind utility classes and scoped CSS in the same components
Alternative: Pick one. Either go full Tailwind (remove scoped styles) or go full scoped CSS (remove utility classes from templates). The mix makes it hard to reason about specificity and maintenance.