Chief of Learning.
Chief of Learning turns a long-term Mandarin goal into a daily plan, then uses tutoring feedback and study history to change the plan instead of repeating generic lessons.
01 · THE PROBLEM
Language apps kept me on a streak, not in a conversation. None of them remembered what I studied yesterday or heard what I got wrong today, so every session started from zero and I was quietly doing two jobs, the student and the teacher. I wanted to keep the student job and hand the rest to something with a memory that changes the plan when I improve, miss a week, or keep making the same mistake.
02 · HOW IT WORKS
It is one study coach you reach three ways: a Telegram chat, a morning brief, and a private dashboard. All three share one reasoning pipeline that never forks, so the coach behaves the same wherever you talk to it and a fix reaches every surface at once. Notion is its memory. Every lesson, correction, and plan lives in plain Notion documents I can read and edit by hand, and the code treats those as the source of truth. A separate program on my own machine records lessons, transcribes them locally, and files the notes back.
03 · ENGINEERING DECISIONS
Every call is routed by role, quick chat, heavier reasoning, classification, long context, and vision, to the cheapest model that can do that job, with a fallback if the first one fails. Vision runs on Gemini and falls back to OpenAI when the Google key is absent, so a homework photo still gets read. Swapping a model or a whole provider is a one-line edit in a single file.
On top of Notion sits a derived semantic index in Neon Postgres with pgvector, a one-way copy that Notion always overrules. It fails open: if the index is missing, empty, or unreachable, Chief of Learning answers from Notion anyway. The ranking is unit tested against an in-memory copy of the index, so the math is proven without a live database.
With no backups, every write path assumes a crash. A Notion update writes the new version before removing the old, so a failure mid-write cannot blank a document. Each lesson transcript is keyed by a hash of its contents, so the same lesson never lands twice, and a push that fails is parked and replayed instead of dropped. The card queue only gives up on work that can never succeed, so closing Anki just leaves the cards waiting.
Lesson audio never leaves my laptop. It is transcribed locally with whisper.cpp and only the text is sent up. A recording that fails to process is quarantined, never deleted, because it is the only copy.
04 · WHERE IT STANDS
It runs as a working template for a single user, me, not a public product. There is no growth chart here, and that is the point. The hardest part of teaching yourself a language is building the plan and grading yourself every day, and that part now happens without me. The codebase carries 276 tests across 40 files, because a personal system with no backups has to be something you trust.
05 · STACK
TRY IT — A CHECK-IN THAT REWRITES THE PLAN
This is the shape of a real Chief of Learning exchange: a quick quiz over Telegram, a miss, and that miss folded straight into tomorrow's plan, the same night it happens.
One more before you sign off: how do you say ‘I’ve already eaten’?
我已经吃 (wǒ yǐjīng chī)
So close, you need 了 to mark it as finished. 我已经吃了 (wǒ yǐjīng chī le) is ‘I’ve already eaten.’ That’s the third time this week 了 has slipped after 已经.
TOMORROW’S PLAN — UPDATED
A 5-question warm-up on 了 as a completion marker, before any new vocabulary.
Turn on JavaScript to watch this exchange play out and replay it.