An AI platform that turns real Arabic news into complete lessons — live spoken practice over a custom OpenAI Realtime bridge, word-synced audio, XP and streaks, and dual Stripe + RevenueCat billing.

01 — Overview
LinguaLeap ingests real Arabic news articles and YouTube clips, then uses LLMs to generate complete lessons — vocabulary, grammar, comprehension questions, word-timed narration and live spoken practice — across Reading, Listening, Teaching and Speaking modes. It's a NestJS 11 backend (TypeORM + PostgreSQL) with a Next.js 15 / React 19 web app and a Flutter mobile client.
Role
Timeline
Stack
02 — Context
Language learning only sticks with live practice and daily habits, and content has to stay fresh without manual authoring — all while keeping voice low-latency and subscription billing reliable.
I built the flagship real-time speaking agent: a Socket.IO gateway bridging the browser to OpenAI's Realtime model with server-side voice-activity detection, a commit debounce, heartbeats and a transcript hallucination filter. I built the autonomous content pipeline (news scraping → LLM generation → Google TTS with word-level timing → S3) with custom rate limiting and a generation lock that prevents duplicate LLM work, the XP / streak / progress systems, and dual Stripe + RevenueCat billing with correct raw-body webhook handling. The TypeORM schema uses composite and partial indexes, and heavy work runs through Bull queues with exponential backoff — built to scale.
03 — Showcase



04 — Capabilities
05 — Contribution
As Full-Stack Engineer, here is exactly what I owned and delivered on this project.
06 — Engineering
Challenge
Low-latency, full-duplex voice with messy browser audio.
Solution
A Socket.IO ↔ OpenAI Realtime bridge that strips WAV headers on the fly, runs server-side VAD, debounces commits and heartbeats the connection; the client reconnects with capped backoff.
Challenge
Concurrent requests could trigger duplicate, expensive LLM lesson generation.
Solution
An in-process generation lock skips work already in flight, plus a queue-based rate limiter around the OpenAI and Google TTS APIs.
Challenge
Stripe's raw-body webhook signature is easy to break behind a JSON parser.
Solution
Registered the webhook raw-body middleware before JSON parsing and verified every event with constructEvent, with a success-page fallback if the webhook is delayed.
07 — Toolbox
08 — Impact