I've been learning Japanese for three years. N5 was fine. N4 was manageable. But N3? The grammar forms started bleeding into each other. ใใใใซใฏใใใชใ versus ใใใใใชใ. ใใใฎใ versus ใใใฎใงใฏใชใ. I could memorize them for the test, but a week later they'd dissolved into mush.
Meanwhile, my Duolingo streak hit 400 days. I was "practicing" daily. But I wasn't learning. The app taught me to recognize patterns, not to understand them. I'd see a grammar question, guess based on repetition, and move on. No explanation of why. No nuance. No connection to the larger system.
I tried Anki. Better retention, but I had to remember to open it. The friction of "I should study now" meant I often didn't. And when I did, it was just flashcards โ no context, no examples, no sense of how a word actually lived in sentences.
What I wanted was something in between. Passive enough that I'd actually do it. Deep enough that I'd actually learn. So I started building Kotoba.
Passive Learning Through Widgets
The core insight: I look at my phone's home screen 50+ times a day. That's 50+ chances to see a word, its reading, its meaning โ without opening an app, without "deciding" to study.
Kotoba's iOS widget shows one vocabulary word or grammar pattern at a time. Short meaning on the surface. Tap it and you're in the full app with detailed explanations, example sentences, usage notes, and โ crucially โ related patterns that commonly get confused.
After you tap and review the full entry, the widget cycles through reinforcement variants throughout the day. Same word, different context. Passive, ambient learning.
Deep Explanations, Not Shallow Drills
Every entry in Kotoba has:
Multiple usage examples with nuance notes. Not just "this means X" but "this means X in this specific situation, with this tone, and here's what you'd say instead if the context were slightly different."
Related patterns with explicit differences. ใใใใซใฏใใใชใ (cannot afford to) lives right next to ใใใใใชใ (no way that), with a clear note: "These look similar but mean OPPOSITE things. This is the #1 confused pair."
Common mistakes section. The errors native Japanese teachers see over and over. The things learners get wrong because they transferred logic from English.
This is the content I wish I'd had. Not dumbed down. Not overwhelming. Just precise.
Technical Architecture
Backend: Go with a dual-database design. PostgreSQL for development flexibility, SQLite for production on my Hetzner VPS. Both supported through a driver abstraction layer โ same code, different deployment targets.
The grammar patterns API is the heart. Each pattern includes conjugation rules, multiple usage examples with Japanese/reading/meaning/nuance/alternative breakdowns, and related patterns with explicit key differences. This is teaching content as structured data.
iOS app: Swift with home screen widget extension. WidgetKit for the passive surface layer, SwiftUI for the detailed drill-down. The widget tracks which entries you've "opened" and shifts to reinforcement mode for those words throughout the day.
Data persistence: SQLite on a persistent Hetzner volume. Performance-tuned with WAL mode, memory-mapped I/O, and aggressive checkpointing. A single file I can back up by copying it. No external database service required.
Why This Matters
Language learning apps are mostly engagement engines. They optimize for daily active users, not actual fluency. Duolingo's business model depends on you continuing to use the app forever โ not on you graduating out of needing it.
Kotoba is built for graduation. Every entry is designed to explain itself so clearly that you won't need it anymore once you've internalized the pattern. The widget is training wheels for recognition speed, not a permanent crutch.
I'm still building it. N3 grammar patterns are the current focus โ the forms I personally struggle with. When it's solid, I'll expand to N2 and N1. The codebase is open source because maybe other frustrated learners can use or improve it.
ๅฐใใใค. Little by little.