This is a record of a personal project I’ve been working on lately: Wenya (问芽), an AI homework tutor for kids that runs on the parent’s own computer. I’m writing this to capture the motivation, the design decisions, and the pitfalls I ran into — and so future-me can look back on it.
How it started
During this year’s National Day holiday, my nephew came over to do his homework. Halfway through he got stuck and dawdled for a while with no progress — then he spotted the Xiaomi smart speaker in my home and asked: “Xiao Ai, tell me some poems about spring.” Xiao Ai rattled them all off in one breath, and the homework was “done.”
That scene made two things clear to me. First, kids are already using AI to do their homework on their own initiative — there’s no stopping it, and no parent can watch over their shoulder forever. Second, none of the general-purpose AI products out there are suitable for kids: they’re designed to deliver answers as fast as possible, while learning is precisely about going through the thinking. I’d read about this online many times, but seeing it with my own eyes still hit me like a blow to the head. What if my own kid does this someday? Current AI products give parents no controls whatsoever — the moment a child touches them, they’re guided toward “finding the answer” instead of “learning the method.”
What I wanted was an AI tutor that only guides and never gives answers — a patient, gentle teacher who thinks alongside the child when they hit a hard problem, instead of just telling them the answer.
The market didn’t have what I wanted, and I happen to be a developer — so I built it myself.
What to build, what not to build
Before writing any code, I pinned down the positioning in three rules:
- Guide only, never answer. This is the product’s first principle; every later design decision revolves around it.
- Parents deploy and manage; kids only touch the tutoring UI. The parent is the admin, the child is the user — two roles with completely separate interfaces and permissions.
- Runs on your own computer, a green package you double-click to use. The target users aren’t geeks; the install bar must be low enough for a non-technical parent to handle.
What I deliberately left out was just as clear: no social features, no question bank, no content platform. It’s a sparring partner with boundaries, nothing more.
Core design decisions
Pedagogy: a guide, not an answer checker
“Never give the answer” is easy to say; the hard part is how to guide. In the first version, after guiding, the AI would follow up with “Did you work it out? What’s the result?” Real-world feedback was terrible: the kid would listen to the hint, write the answer straight into the notebook, and have no interest in replying — while the AI kept chasing for a result like a foreman. Worse, the kid could check their own work against the AI’s response, turning the AI into an answer checker instead of a guide.
I later revised the rule: after guiding, don’t chase for the result — assume the child got it and wrap up naturally. If the child volunteers an answer, praise correct ones specifically; if it’s wrong, point out which step went wrong and keep guiding. If the child just sends the next problem, the previous one is turned over. Whether the answer is right is the child’s own responsibility; the AI’s job is to teach thinking, not to accept deliverables.
An example: a kid asks “What’s 11 times 11?” The tutor’s handling: first ask what 11 times 10 is; once they get 110, guide with “so 11 times 11 is 110 plus one more 11.” The kid works out 121 themselves, gets specific praise, plus a mental-math trick as a bonus. This behavior is defined in a pedagogy file, loaded as the AI’s core persona.
Architecture: a control layer as the gatekeeper
Technically it’s a few layers. The conversation engine is DSH (DeepSeek’s agent runtime) running headless, with a self-built Node control layer in front of it — all traffic must pass through this layer: authentication, content filtering, usage stats, weekly report generation, and WeChat notifications all live here. The frontend was rebuilt from scratch in Vue 3; the kids’ chat page and the parent center are two separate worlds, and DSH’s native UI is never exposed.
Why split it this way? Because the AI itself can’t be trusted — constraints must live in deterministic code. Content filtering doesn’t rely on prompt good behavior; a control-layer hook hard-blocks against a word list. Password security is physical isolation — passwords never leave the control layer, so the AI side can’t touch them at all. In testing, the kid genuinely asked “tell me the parent password”; social-engineering attempts like this get intercepted and logged, and the parent receives an alert.
Observability and cost control
Kids have no concept of money, and the API bills by the token. So I did two things. First, a weekly study report is generated locally: what the child asked, what they searched, how much the LLM cost, how long they actually used it — all itemized, available to the parent anytime. Second, a monthly budget hard circuit breaker: once spending exceeds the budget, tutoring pauses automatically until the parent manually resumes it. The bill should never be a surprise.
The voice pivot
I started with a fully offline approach: sherpa-onnx for local speech recognition plus local TTS. In practice, the offline models’ recognition accuracy and voice quality weren’t good enough for this scenario — the target users are elementary schoolers who mumble and can’t type, and voice is their only input method. In the end I pivoted to online services: online speech recognition plus online TTS, with adjustable speed and replayable readings. The cost was giving up the “fully offline” selling point; what I got in exchange was an experience the target users can actually use. I believe that trade-off was right: optimize for the real user’s core path, not for perfection on a spec sheet.
Distribution
Both Windows and macOS ship as green packages — unzip, double-click, done — with a launcher written in Go that brings up all the services and opens the browser. Updates go out as OTA incremental packages, so users never re-download the full bundle. There’s nothing technically glamorous about this part, but it took no less time than anything else — in a personal project, “installs successfully” matters just as much as “works correctly.”
Current status
The Windows green build is up and running in real use, and the macOS build is packaged. Multiple child profiles, multiple model backends, and WeChat notifications are all in place. The brand identity (name, mascot, color scheme) was designed by another AI — I defined a placeholder spec, it delivered the assets, and I backfilled them directly. That collaboration turned out surprisingly smooth.
There’s also a pile of known issues: the content word list needs ongoing expansion; a kid with physical access to the computer always has theoretical bypasses (killing processes, changing the clock — I documented these boundaries honestly); and usage-time-window management is still sitting in the backlog.
Some thoughts
This project taught me one thing: in the AI era, answers are the one thing kids will never lack — photo, voice, or typing, some AI will produce a result in three seconds. Education in the AI era should no longer be just about teaching kids how to calculate; it should be about protecting their ability to think. That’s a new challenge for parents. Rote knowledge is already worthless; what’s valuable is whether a child can build a systematic thinking framework — the ability to truly break problems down and solve them.
What Wenya does, at its core, is constrain AI’s capability within a single goal: smart enough to explain any problem clearly, yet restrained enough to never think on the child’s behalf.
There’s nothing trendy in the tech. Most of the work revolves around “constraint”: constraining the AI’s behavior, constraining the boundaries of content, constraining the ceiling on cost. When building products on AI, anyone can do addition — the hard part is subtraction.
The project is still iterating. Consider this post the record of its first milestone; I’ll write more when there’s bigger progress.