What changed?
Web remote sorting & browsing
- Added the desktop's franchise sort pages: Default, Year 1, Year 2, User (custom order), Story, Favorites, Abilities, switchable via a header ‹ badge › switcher.
- Sorts are synced with the desktop (GET/POST /api/sort) and persist to the ini.
- Added the full Abilities browser (ability grid + per-ability roster + section filter chips).
- Added the Story roster and Favorites roster pages.
- Added Special\ folder (custom tag) support: a Special tile in the world grids, custom portraits served, and custom tags loadable.
- Roster grids now flow characters straight into vehicles — removed the separator gap.
Web remote - pads
- Added an ABILITIES button (shows the selected pad's figure's abilities in a popup).
- CLEAR, FAVORITE and ABILITIES are now icon-only, with enlarged logos.
- Centre pad stays a perfect circle at any screen size (was squashing on big TVs/tablets).
- Added a LED mirror toggle in the topbar.
- Fixed LED colour: /api/leds now sends calibrated true colour, so a white LED no longer shows orange.
Desktop app
- Fixed roster up/down navigation on centred partial rows (e.g. Ninjago, Favorites vehicles, Special) — it now tracks the on-screen column.
Desktop ↔ web sync
- Added /api/selection (both ways): the highlighted tile/figure mirrors between desktop and phone.
Build system
- Fixed incremental builds silently ignoring Web/ edits: generate_assets.py now emits a payload fingerprint into resources.rc, forcing the resource compiler to re-run.
- Added kAssetFingerprint and ?v= cache-busting on /img/ URLs, fixing stale/wrong images when resource ids shift between builds.