Back to Projects
ReleasedEducation App

MAJUHAN

Learn Korean on your own, one carefully designed lesson at a time. From Hangul to conversations you can understand and use in real situations.

Platforms
iOS · Android · Web site
Built with
Flutter · Node.js · SQL Server · Firebase
Pricing
Free
App languages
16 languages

Most Korean apps either drill vocabulary or promise fluency, and few teach the layer in between: why a sentence is built the way it is. MAJUHAN is a self-study course for foreign learners that starts at Hangul and moves, one carefully designed lesson at a time, toward Korean you can understand and use. Every lesson ties a real scene to natural dialogue, grammar explained in your own language, guided practice and review.

What it does

Design choices

A spiral curriculum, K0 to K4

Levels run K0 (Hangul) to K4, with an internal model reaching K8. Items are not taught once and dropped: each lesson combines the previous lesson's items and brings back earlier levels. Today K0 (12 units) and K1 (12 lessons) are published; K2 onward is planned and hidden until reviewed.

Fixed recorded audio, not live synthesis

Every Korean line is a reviewed, pre-recorded file at normal and slow speed: 398 utterances, 796 files for K0 and K1. Learners hear the same approved pronunciation every time, and device text-to-speech is kept only as an accessibility fallback.

Reviewed question banks, no generated questions

Questions come from a reviewed bank: 154 for K0 and 360 for K1 at the last README count. The server picks them by blueprint and avoids recently seen ones. Wrong options model predictable learner errors, and explanations say why. No AI writes questions or scores at runtime.

Start at the right level

A 12-question placement test recommends a starting unit, and the course is also open from the first Hangul unit. Handwriting is traced with a finger or stylus and judged on the server. Progress resumes after an interruption, with a weekly plan and daily study-time goal.

How it's built

Stored-procedure-only database

Lesson content, questions, answers and progress live in SQL Server 2016. The Node.js API may only execute approved stored procedures with typed parameters; inline SQL and runtime ORM queries are banned. The Flutter app never touches the database and holds no answer keys.

Server-judged, App Check protected

Answers, handwriting and lesson progress are decided by the server. Firebase Auth ID tokens and App Check (Play Integrity and App Attest) guard the API. Audio is served from a private Cloudflare R2 bucket through the authenticated API. Account deletion is built in.

Sixteen languages, tested for overflow

The app and published lessons support 16 languages, including right-to-left Arabic. The English UI keys match across all language files (302 in the July 2026 status record). Layouts are regression-tested from 320 dp phones to tablets and at 200 percent text size.

Release-gated testing

The September 2026 simulator QA record lists 555 passing Flutter tests and 335 API tests, plus iPhone and Android device walkthroughs. Lessons also pass an education review for level, naturalness and answer-explanation consistency. Version 1.0.3 shipped to both stores.

All Projects Contact