Korean drills with audio, no romanisation crutch.

Romanisation trains the wrong reflex. HangeulSprint is drill-heavy: listen, repeat, short sessions, closer to ear training than streaks and badges.
Next.js 15 with SST deployment
API Gateway + Lambda backend
S3-hosted audio assets
Cognito authentication
CDK infrastructure stack
Why speechSynthesis for some lines?
Avoids Polly billing for every sentence. Browser speaks Korean when the voice exists; fixed drills use files.
Where do drills come from?
Generated from vocabulary/grammar data so adding a layer is mostly data entry, not writing hundreds of questions by hand.