Learn kanji through common vocabulary, with N5 → N1 study stages and explicit on’yomi, kun’yomi and whole-word reading examples.
python3 -m http.server 4173 --bind 127.0.0.1Open http://127.0.0.1:4173. No application build or package installation is needed. Core styling and study data are local; Google Fonts provides the optional web fonts with system fallbacks.
Choose a practice level and start a six-recall round. Meet up to three new
words, then recall their readings after other cards. Type the complete answer
in romaji or kana and press Enter or Check. Keep long vowels (gakkou)
and syllabic-n separators (shin'you). Common Kunrei spellings are also
accepted. The meaning remains visible to distinguish homographs.
Correct unaided answers earn 10 XP. First sound, Show answer, and the Kanji guide provide support; assisted answers do not advance review dates. Feedback explains reading segments and offers related common words. Press Continue when ready; there are no automatic transitions or speed scores.
Two unaided recalls make a card ready for spaced review, satisfying the curriculum gate. Later due reviews expand from 1 to 3, 9, 27, and at most 30 days. Remembered across days requires two successful due reviews on later days, at least 24 hours apart. This is a simple scheduling heuristic, not a guarantee of mastery. A round can end early to give remaining cards space.
Pause keeps the current round. Finish round shows a recap. Switching levels preserves all card history, while Review only avoids introducing new material. Sound is optional and off by default. The rounded Japanese font is M PLUS Rounded 1c, with Noto Sans JP as a fallback.
Sound uses original, locally generated plucks, wooden taps, and glassy bells. Correct-answer chimes rise with the recall combo; finishing a round and remembering a reading across days have their own flourishes. Hints and misses use gentler cues. There are no audio downloads. Muting stops lingering sounds, and unavailable browser audio never blocks play.
Progress stays in this browser's local storage. Existing version-one progress migrates automatically, retaining the original key as a backup; old mastery scores are not treated as evidence of recall across days. A save failure is shown in the interface. There is no account sync or learning-event analytics.
See UX_REVIEW.md for the detailed design review, implemented
changes, known limits, and a proposed user/retention study. A readable copy is
also available at ux-review.html in the app.
- Enter starts/resumes a round, advances Meet a word, checks the typed answer, and continues after feedback. On the recap, Enter chooses Done for now; use Tab to choose Another small round instead.
- Tab / Shift+Tab move between controls. Enter activates the focused control, including hints, the kanji guide, reading connections, and settings.
- Escape pauses a round or closes the kanji guide. Pausing preserves a partially typed answer, including across reloads.
Introductions focus their Ready to remember button; recall focuses the answer field; feedback focuses Continue. Shortcuts are shown in the interface. Native selects and dialogs retain their keyboard behaviour. Held Enter is suppressed to prevent skipping cards; IME confirmation is guarded separately from answer submission. Physical Japanese IME/browser combinations still need device QA.
Phone rounds fit the visible viewport, including the area above the software keyboard. Start a round and tap through its introductions. Once recall begins, the same input stays focused through feedback: the keyboard’s Next key checks an answer, then advances to the next card. The visible Check / Next button does the same thing. Japanese IME confirmation remains separate from submission, and pausing preserves the typed draft.
The phone home screen keeps level selection and starting a round in view. Progress opens in a separate panel. Recaps show one word at a time with previous and next controls. Tap the meaning or Reading details & connections for long definitions and explanations. These reference panels can scroll; the normal game loop does not need page scrolling. Landscape uses two columns.
Viewport changes use the browser’s Visual Viewport API, with a window-height fallback and safe-area padding. Browser QA covers widths down to 320 pixels and keyboard-sized viewports down to 320 pixels high. These are viewport and focus tests, not physical iOS/Android keyboard or IME certification.
The reference contains 2,211 kanji from the modern Waller N5–N1 study lists. Kanji and vocabulary levels are separate. Harder support characters receive furigana and later get their own recall cards. Readings and definitions come from JMdict/KANJIDIC2; examples prioritise commonness, frequency and reading coverage. These are study estimates: the JLPT does not publish an exhaustive official list.
See DATA_SOURCES.md for pinned sources, licensing, selection rules and limitations, and data/coverage.json for exact counts and remaining gaps. The generated data is CC BY-SA 4.0.
Requires Node.js 22+ and Python 3.11+:
npm test
python3 scripts/build_curriculum.py
git diff --exit-code -- data/curriculum.js data/coverage.json
python3 scripts/verify_sources.pyThe tests cover data integrity, irregular readings, kana-to-romaji conversion, per-stage mastery, independent support-character cards, queue uniqueness, alternative readings, and reachability of every practice card. The source builder verifies every downloaded input against its pinned SHA-256 checksum.
GitHub Pages deploys only the static application assets. work/, source
downloads, scripts and tests are not included in the deployed site.