~/work/onestepone

One Step One

An English learning app for Vietnamese learners. Lessons are played as quiz games, an AI role-play room builds speaking reflexes, and wrong answers become flashcards for review. It runs on web and mobile.

Role
Full Stack Engineer · Freelance
Scope
Product · Web · Mobile · API
Platforms
Web · iOS · Android
Web brand
VietLeap English
Login
Login
Home
Home
Lessons
Lessons
AI speaking room
AI speaking room
Review
Review

The problem

Vietnamese learners often know grammar but freeze when they have to speak. The product needed short, game-like lessons, a safe place to practise conversation, and review that brings mistakes back at the right time, free to try before signing up.

What I built

  1. 01
    Lesson gamesQuiz-style lessons by level (Beginner to Intermediate) with audio, Vietnamese explanations and team scores for classrooms.
  2. 02
    AI speaking roomRole-play scenarios such as meeting people, ordering at a café, asking directions, hotel check-in and job interviews, with step-by-step hints and text-to-speech.
  3. 03
    Spaced reviewWrong answers turn into flashcards that come back on schedule, with streaks and points to keep learners going.
  4. 04
    Tests & roadmapsA 9-question placement test, IELTS/TOEIC practice sets, and 1-, 3- and 6-month study plans.
  5. 05
    Guest mode & plansLearners can try the app without an account and keep their progress on signup. Free and Plus plans, with payment approval in an admin panel.

Architecture

Clients
WebNext.js · TypeScript
MobileFlutter · BLoC · TTS
API
Next.js API routesauth · lessons · progress
Adminpayments · backup
Data
VPS storeusers · progress · flashcards
Contentsource & license controls

Hard parts

Guest to account

Progress made in guest mode moves into the new account on signup, so learners never lose a streak or flashcards.

Safe data restore

Backup restore checks the whole export first and rejects duplicates or records that point to missing users or lessons.

Stack

Next.js 16TypeScriptFlutterflutter_blocflutter_ttsSecure storageREST API