● in progress2026
Kanji Trainer
An offline kanji PWA with two separate spaced-repetition tracks — recognising and writing — stroke-order checking on a drawing pad, confusion drills and smart multiple-choice distractors.
- role
- Solo developer
- stack
- JavaScript · IndexedDB · Service Worker · KanjiVG · Node.js · GitHub Pages

Problem
Reading a kanji and writing it from memory are two different skills, but most apps track them as one. I wanted an app that schedules them separately and actually checks my handwriting on the iPad, fully offline.
Solution
- Two SRS tracks per character (recognition and writing) with an SM-2 variant, plus a strict "green" definition: a kanji only counts as learned after several good days.
- Writing practice on a pointer-events drawing pad. Strokes are compared with KanjiVG data (matching and stroke-order analysis), with stroke animations as hints.
- Six practice modes, a 5-minute warm-up, confusion pairs (similar-looking kanji) and multiple-choice distractors chosen on purpose, not at random.
- A dashboard with due counts, streaks, a calendar heatmap and statistics. Progress lives in IndexedDB, with export/import and daily rolling backups.
- PWA: a service worker caches the app shell and lazy-loaded data chunks, so it can be installed on the iPad and works offline.
How
- No framework and no build step: ES modules, a hash router and a tiny DOM helper.
- A one-time Node data pipeline (
tools/build-data.mjs) turns KANJIDIC2, JMdict and KanjiVG (CC BY-SA) into compact JSON chunks, simplifying the SVG stroke paths along the way. - The SRS rules are covered by assertion tests (
node tools/test-srs.mjs).