nihongo.futari
By Daniel Chiwuzoh
A Japanese learning app, built for two learners rather than for a market — futari is "two people". It teaches a grammar point, quizzes you on it immediately, then brings the same material back on a spaced-repetition schedule until it sticks.
The corpus is the substance of it: 8,240 words, 2,004 kanji, the full kana syllabary, 355 grammar topics and 129 scripted conversations. Every one of the 129 N5 grammar topics has four hand-written example sentences with their own audio, and every question a learner sees — word order, dictation, cloze — is derived from those sentences rather than authored twice.
Lessons that explain a pattern and then ask about it, with the questions you got wrong served first next time.
Review on an FSRS schedule, counted in items rather than cards so the number on the badge matches the number of things to do.
Conversations with fixed scripts and known replies, so a wrong choice can name the mistake — the thing a chatbot cannot reliably do.
A dictionary where every word in every sentence is tappable, with furigana, romaji or nothing at all depending on how much you can already read.
Writing-system lessons, because furigana is kana and every other lesson quietly assumes you can read it.
The hard part was reading Japanese at all. Text is segmented by longest match against the published vocabulary, which works until it meets the things a dictionary does not list: です and ます are not words to JMdict, 三時 is generated from 三 and 時 on demand, and ありがとうございます is two entries a beginner meets as one. Each of those shredded into single characters and took its lesson down with it — a topic cannot teach a pattern its own example sentences pull apart. Grammar patterns, number-and-counter forms and fixed expressions are now indexed as units, read from the lesson data itself so a new topic is covered without anyone remembering to.
TypeScript throughout, in a pnpm and Turborepo monorepo: Vue 3 with Vite and Tailwind on the front, Hono with Drizzle and PostgreSQL behind it, better-auth for invite-only sign-in by email code, password or Google. Audio for every word, character, sentence and dialogue turn is generated ahead of time and served from Cloudflare R2. Installable as a PWA, self-hosted on Hetzner with Docker Compose and Caddy.









