Speaking-training web app. You practise real conversations out loud with an AI partner, built around reusable conversational patterns — phrase frames like "I see what you mean, but ___" — rather than grammar rules.
- Roleplay (home): pick a situation (or write your own) and talk it through by voice with an AI partner. When you end the call you get your transcript back with a line-by-line check, a short review, and the patterns you could have used at the moments you fumbled — save any into your library.
- Pattern library (
/patterns,/idioms): browse patterns and idioms by communicative function. Each has a read-aloud scripted-dialogue drill and a fast AI "substitution drill". Patterns you save (seed or AI-suggested) live at/patterns/saved. - Practice a pattern (
/pattern/[id]): short AI voice conversations grounded in a generated situation where the pattern fits. - Dashboard (
/dashboard): a per-browser language profile built from your roleplay transcripts.
No accounts — all progress is per-browser localStorage.
npm install
cp .env.local.example .env.local # fill in LiveKit + Groq keys
npm run devThe voice roleplay needs the LiveKit Agents worker running in a second terminal:
cd agent && npm install && npm run devWithout keys, the AI routes fall back to deterministic stubs; without the worker, the voice call can't connect (the read-aloud drill still works — it uses the browser's own speech recognition).
Next.js (App Router) + React 19. Server-side AI calls to Groq
(src/app/api/ai/*). Voice roleplay runs over LiveKit with a separate LiveKit
Agents worker (agent/); STT/TTS via LiveKit Inference, the LLM via Groq. Tests:
npm run test (Vitest, node env — session/store/route logic).