Context
S — A vocational program ran separate mini-apps (Cyber Defenders, OSI Adventure, Pitch Studio) with inconsistent branding and zero shared analytics. Instructors spent days duplicating content for each cohort. T — Consolidate the experiences into a single portal with reusable engines, live telemetry, and non-technical authoring tools so instructors can ship new scenarios overnight.
Threats
- Legacy pages mixed vanilla JS and jQuery, making accessibility fixes painful.
- No centralized auth or persistence, so progress could not travel across modules.
- Course authors lacked a safe way to tweak copy or scoring logic.
- n8n automations for onboarding stored secrets in plaintext.
Approach
- Refactored everything into a Next.js monorepo with shared design tokens, layout primitives, and motion choreography that matched the neon portfolio aesthetic.
- Built simulation engines (drag-and-drop OSI, scenario cards, pitch timers) as headless React hooks so they can power future modules.
- Persisted progress + leaderboards through Supabase, exposing sanitized APIs for instructors to export cohort insights.
- Added feature flags + theme packs so instructors spin up new flows per class without cloning code.
- Integrated n8n workflows for onboarding, badge issuance, and follow-up emails with scoped API keys stored in Doppler.
- Layered analytics using PostHog events + Vercel Web Analytics to surface friction points (drop-off questions, time per puzzle).
- Shipped accessibility sweeps: semantic controls, reduced-motion variants, audio transcripts, and color contrast utilities to keep gamification inclusive.
Outcome
Instructors now assemble new learning paths in hours, not days. Learner dwell time rose 42%, completion jumped 28%, and bug reports fell by 70% because modules share the same hardened components. The portal became the flagship asset shown to partner schools when negotiating new curricula.
Lessons Learned
Gamified education still needs boring fundamentals: design systems, telemetry, and safe automation. By treating each mini-app like a microservice inside a monorepo, we gained velocity without sacrificing whimsy.
