Inspiration
Every Japanese learner knows the tab-juggling routine: a dictionary tab, a stroke-order page, a conjugation chart, a grammar site that doesn't know your level — and still no answer for "what does this sentence mean?" Reikun is the single surface I wanted: search in English or Japanese, watch sentences break down word-by-word with furigana, and get grammar explained at your JLPT level.
What I built
A working Japanese dictionary & reading assistant at reikun.app:
- Hybrid search over ~219k JMdict entries — dense + BM25 vectors fused server-side in Qdrant, with query routing per language and an LLM pivot that rewrites "how do you say hospital?" into the right headword. One gold set (360 queries) benchmarked it end-to-end: 97.3% Hit@1 at ~15 ms median.
- Sentence breakdown — Sudachi tokenizes real text into chips: furigana above, gloss below, full parse on hover. Numerals fuse with counters (2日【ふつか】), names and unresolvable tokens stay honestly bare.
- Kanji cards — animated stroke order (KanjiVG), readings, compounds, plus conjugation tables generated from JMdict's own verb classes.
- Grammar explanations — one tap, calibrated N5–N1, streamed live, powered by NVIDIA Nemotron-3-Nano-30B on the Nebius Token Factory API (the shipped default provider).
Challenges I faced
A hit-list of neckline fixes that only showed up in production:
- Nemotron thinks by default and its reasoning tokens consumed my token
budgets, so calls ran 43–85 s and the actual content got truncated with nothing logged.
reasoning_effortwas silently ignored; the fix was the chat-template off-switch (enable_thinking:false) — the same sentence then finished in 0.9 s warm. - Small-model drift — with thinking off, the model produced 14-bullet essays and repeated fragments. Prompt hardening plus a deterministic post-processor (and the same rules applied live on the SSE stream) got every explanation into shape: ≤ 4 bullets, ~50 words, no garbage.
- Hit@1 regression hunt: after an ingredient fix, my benchmark dropped from 139 to 137 and couldn't be replayed. I decomposed the ranking formula query-by-query and found the canonical prior was answering the wrong question, and a fusion cutoff was collapsing the right answer out of the pool. The fixes shipped worth +12 Hit@1 on the same set.
- Confident wrongness in furigana — a ~4% crash silently swapped a correct Sudachi parse for a well-dressed greedy one. Fixing that meant making degradation explicit, never silent.
What I learned
- Production benchmarks beat vibes: a fixed 360-query gold set turned "understand the score, don't replay it" into my biggest retrieval win of the hackathon.
- Latency, not accuracy, is what smaller models get judged on — thinking off turned a borderline Nemotron into a workflow carry.
- LLM-enforced style never holds; deterministic post-processing does.
Log in or sign up for Devpost to join the conversation.