IELTS Practice
Speaking and Writing practice that pins each mistake to the second. IELTS practice on the web with native Android and iPhone apps: an examiner asks out loud, answers are scored against the band descriptors, and every pause, filler and grammar slip is marked in your own transcript.



- Writing scoreQWK 0.80, mean error 0.52 bands on 41 held-out essays
- Question bank120 cue cards, 799 Part 1 and 3 questions, 220 Writing prompts
- PlatformsWeb, Android (Kotlin), iPhone (SwiftUI)
- TestsAbout 1,000 cases across web, server, Android and iOS
- stackTypeScript, React 19, Hono, Postgres, Drizzle, Kotlin, Jetpack Compose, SwiftUI, Whisper, OpenAI Realtime
- linksLive, GitHub
You record a Speaking answer or write a timed essay. Speech is transcribed with the fillers kept (primed Whisper, or ElevenLabs Scribe), and fluency is measured from the word timings: speech rate, mean length of run, pause ratio, mid-clause pauses, fillers, repetitions and self-corrections. Each mistake is anchored to the word it happened on, so the transcript, the pace chart and the audio line up.
Writing gets a band per criterion, the three fixes that matter most, every error explained and the essay rewritten one band higher. Listening and Reading run as computer-style tests with highlights, notes and timers, and a full mock exam chains all four skills. Mistakes come back as SM-2 review cards. A live examiner can run the Speaking test over OpenAI Realtime or Gemini Live.
Bands come from a descriptor-anchored rater with a fitted calibration map. On a frozen test set of 41 published Cambridge and ielts.org essays, Writing lands at QWK 0.80 and a mean error of 0.52 bands; the Speaking curve, fitted on 66 labelled clips, has a leave-one-group-out error of 0.59. Those sets are small, scores run low at band 7.5 and above, and pronunciation is not judged from audio, so the app shows every band as an estimate with a range.
One TypeScript monorepo: React 19 and Vite on the web, Hono with Postgres and Drizzle on the server, shared scoring and speech logic in a core package, plus native Kotlin (Jetpack Compose) and SwiftUI apps that CI builds but that are not in the stores yet. It ships as one Docker image on Dokploy.