UX Audit
dev toolMain-menu audit + live consent/analytics inspector
Static page intended for the developer to walk through every UX issue surfaced on the main menu / login flow / onboarding, see what's been shipped vs. open, and sanity-check that consent is wired correctly. Linked only from the demos hub footer (not from inside the game).
Main menu — issue tracker
| # | Issue | Status | Where |
|---|---|---|---|
| 1 | Three signed-out auth buttons (Login / Create / Google) ate too much vertical space on the title. | M330 | One Sign In button → unified modal with all three options inside. |
| 2 | Footer / bottom-right corner links spaced too far apart on mobile (Codex / Stats / Feedback / Privacy / Website). | M329 | Centered horizontal row along the bottom of the screen below 600px wide; safe-area padding for iPhone. |
| 3 | "NG+1" subtitle on the title screen was meaningless before a save was loaded. | M330 | Removed from title; surfaced as a yellow pill on Load-Game cards instead. |
| 4 | "Next fame rank at 2,000" copy was leftover from the slot-tier model — the unlock model is per-appearance now. | M330 | Fame chip shows just the number; hidden when fame = 0. Source moved from per-save to global localStorage in M327. |
| 5 | GDPR consent + GA gated load. | M330 | Banner on first paint; localStorage.rsg_consent_v1
decides; GA only injected after Accept; same-origin so the
choice carries between game13 and the hub. |
| 6 | Major-milestone GA events. | M330 | run_started / run_completed_win / run_completed_death / level_up / boss_killed / class_unlocked / fame_threshold_reached. See live log below. |
| 7 | Privacy policy page; cross-link from game + hub. | M330 | privacy.html (this property); also at game13/privacy.html. |
| 8 | Cross-property consent on emberveil.radgh.com. | open | Different origin — needs a second consent banner. Out of scope for M330; flagged for future when prod is wired. |
Live consent + event inspector
Consent state
…
Cookie
…
Recent gtag events on this page
Hooked via window.dataLayer.push. Refreshes when
the page receives a new event. Game-side events show up here when this
tab is opened from inside an Emberveil session (same origin).
— no events yet —
Tracked GA events (reference)
run_started{hero_class,difficulty,hardcore}run_completed_win{max_level,zones_cleared}run_completed_death{max_level,zones_cleared} — fired by hardcore RIP pathlevel_up{hero_class,new_level}boss_killed{boss_id,boss_name,act}class_unlocked{class_id}fame_threshold_reached{threshold,total_fame}
Notes
- GA measurement id is read in this priority order:
window.__RSG_GA_ID(set inindex.htmlat deploy time) →VITE_GA_IDVite env. Until either is set, the consent banner still renders but no GA script ever loads. - Consent decision is also cookie-mirrored
(
rsg_consent_v1, samesite=lax, 1y) so deeply nested pages can boot with the right decision before localStorage is readable.
— rad's game demos · UX audit · M330 —