About the project

Inspiration

Every language app gives you the translation for free, and that is exactly why the word never sticks. Retention comes from need, search and evaluation — the Involvement Load Hypothesis — and a one-tap translation removes all three. Flashcards fail the other way, drilling words stripped of every context that gave them meaning.

Krashen's comprehensible input — material slightly above your level — is the pedagogy almost everyone agrees on and almost nobody implements. "Slightly above your level" is not a number you can compute, so products fall back to a fixed syllabus and hope.

We wanted to find out whether that idea could be made computable, and whether a bot could stay honest about the friction instead of optimizing it away.

What it does

Lexio is a Telegram bot (@LexioDayBot, lexio.day) that writes you one Japanese article a day at your level.

  1. Onboarding — target language (Japanese), your explanation language (English or Traditional Chinese), and your interests (Business, AI, International).
  2. Placement — 12 adaptive questions drawn from a reviewed 120-item bank built on the BCCWJ corpus across five frequency bands, with an online Elo update after each answer.
  3. The daily lesson — a planner turns your ability score into a spec (five new knowledge components, each of which must appear in at least two different sentences), a model writes the article, the code locates every content word, and an estimator scores how much of it you already know. Off-target drafts get revision hints and go around again, at most twice. It always publishes — a learner never gets nothing.
  4. Reading — every taught word is tappable. The first tap gives a Japanese explanation. Only if you are still lost does a second tap give you English or Chinese. Nothing is pre-translated.
  5. The quiz — one question per taught word, and 「わからない」 is always the last option. "I don't know" is a clean signal, not a failure.

Every lookup, exposure and answer becomes an append-only evidence row. Mastery is a fold over that log, so we can replace the learner model later by replaying history instead of losing it.

How we built it

Most of this codebase was written with Codex, and GPT-5.6 is the model inside the product. Codex wrote the Telegram bot and onboarding, the database schema, the placement engine, the generation pipeline and the reader. GPT-5.6 writes each morning's article, tags the vocabulary and grammar, answers every lookup, and writes and grades the quizzes.

  • Next.js on Vercel, Neon Postgres, the OpenAI Responses API. One deployment, no other infrastructure.
  • The BCCWJ corpus frequency list is the vocabulary spine — the external ground truth every coverage estimate is computed against.
  • The evidence log is append-only, enforced by the database. That is what lets us replace the learner model later and replay history rather than lose it.

Challenges we ran into

We first asked the model to judge the learner's level. It answered fluently, and we had no way to check it. Nothing told us whether one article was harder than the last, or closer to this reader.

"Slightly above your level" holds two undefined quantities — what the reader knows, how hard the text is — with no shared unit between them. JLPT and CEFR look like that unit but describe an average learner. A real vocabulary has holes and spikes.

So we changed it to a question that counts: what share of a text's words does this reader already know? That made comprehensible input measurable, and pulled in the rest — knowledge components per word, a rule-based prior for new users, and Bayesian Knowledge Tracing to update it from behaviour.

Accomplishments that we're proud of

We turned "level" into a number the generator can actually optimize against. Every word and grammar point is tracked as its own knowledge component with a familiarity estimate and a confidence; a 12-question adaptive placement sets the starting value in about a minute.

Every stage of the loop refers to that same number, so the material follows the learner instead of a syllabus. Plan, write, measure, revise, read, quiz, record — running end to end against the real database and model. Each reading sits as close to a learner's actual ability as we can currently measure, which is the condition the research attaches learning to.

The teaching constraints survived engineering. Every one was easier to break than to keep: nothing is pre-translated, lookups answer in Japanese before English or Chinese, and 「わからない」 is a real answer rather than a wrong one.

What we learned

A fluent answer is not a measurement — and it is the failure mode you are least likely to notice. Everything the model told us about difficulty was plausible, which is exactly why it took us a while to see that none of it was checkable.

When a task has no defined quantity, the quantity has to come from outside the model. Reading research already had one. No amount of prompting would have produced it.

The constraints that make this work were the ones under constant pressure to remove. Handing over the translation, skipping the Japanese-first lookup, scoring 「わからない」 as wrong — each was the cheaper path, and each would have quietly deleted the reason the product exists.

What's next for Lexio

Close the feedback loop. Quiz answers already become evidence; nothing reads it back yet. Folding that into mastery — so the planner weights new words by what you actually know and schedules review by time decay — is the highest-value change left.

Automated source collection. Today's articles are grounded in manually curated sources. Collecting them automatically, with a provenance and licensing policy, is what makes a daily lesson sustainable.

Short-answer questions with model grading. Recognition is the easy half. Moving the quiz mix toward retrieval is where the testing effect actually lives.

More languages, then more skills. The loop is language-agnostic; Japanese is just where we proved it. Listening, speaking and writing are the same measurement problem in a different channel.

Built With

Share this project:

Updates