prototype
The On-Device Tutor That Wasn't
I tried to build an English tutor for my ten-year-old that would run entirely on her iPad. No accounts, no cloud calls, nothing leaving the device — partly principle, partly necessity: Apple’s on-device foundation models are unavailable when your device speaks Polish, so I reached for MLX Swift and a small quantized model running on the Neural Engine.
The pitch went through the classic prototype arc. Version one was camera-first: point the iPad at something, Vision tags it, an AI persona riffs a conversation about the object. That pipeline never survived contact with reality, and the app pivoted to a pure conversational lesson loop — eight themed “mission packs,” each a scripted ten-exchange chat with a tutor persona. (The persona also got renamed along the way, after I noticed the original name sat uncomfortably close to a Polish vulgarity… Ship-to-a-child checklists include things no style guide warns you about.)
The engineering was genuinely fun: small on-device LLMs are chatty and undisciplined, so I built a string-stripping pipeline for leaked markdown, chat-template tokens bleeding through missed stop tokens, and stray <think> blocks surfacing mid-sentence. I swapped models entirely when it turned out an English-tuned model doesn’t become bilingual just because you ask nicely in the system prompt.
And the honest ending: it didn’t work. A model small enough to fit on that iPad produced garbage too often to trust in front of a kid who can’t yet tell confident nonsense from English. An adult can shrug off a hallucinated grammar rule; a ten-year-old will learn it. I shelved the app rather than ship a confidently wrong teacher.
The finding, such as it is: on-device inference is a hard floor, not a vibe. Privacy-first architecture is worthless if the model that fits inside it can’t meet the quality bar your user actually needs — and for a child learning a language, that bar is higher than for almost any adult use case I know.