Day 11: knowing exactly what's running

Every page in the app has quietly carried a small date stamp at the bottom for a while now—a way to tell at a glance which version of the app you're looking at, useful mostly for us when something needs checking, less so for anyone just using it day to day. Today that little stamp got both more honest and more useful, in a way that matters for where this project is headed.

A gap that had gone unnoticed

That date stamp was supposed to appear on every page, but it turned out to be missing from one of the most-visited ones: the page where a child actually opens a subject and starts practicing. The home screen had it, the parent area had it, the documentation pages had it—but the subject page itself, where the real work happens, quietly showed nothing at the bottom. It's fixed now, so that little marker is genuinely everywhere it's meant to be, not just almost everywhere.

Why one date stamp was never going to be the whole story

Here's the part that matters more going forward. This app isn't built as one single block of code—it's built as a small core "shell" that handles the parts every subject needs (navigation, a child's profile, where things live on screen), plus separate subject modules that plug into that shell, each built and shipped completely on its own. Mathematics is the one real subject module today; the plan has always been for others to join it later, each arriving and updating independently, without the shell needing to change a single thing to make room.

That structure is exactly why one date stamp for "the app" was never going to tell the whole story. If the shell gets updated on a Tuesday but Mathematics itself hasn't shipped anything new since Friday, a single combined date would blur those two facts into one, and there'd be no way to tell whether something odd you're seeing comes from the shell or from the subject itself. It's the difference between checking the delivery date on a shipping label versus the expiration date on what's actually inside the box—both matter, and they're not always the same day.

Two stamps instead of one

So now, wherever a subject is genuinely active on screen, the footer shows two things side by side: the shell's own build date, exactly as before, and a second line naming the subject and its own build date—something like "module: mathematics," followed by the day that particular subject's content was last shipped. On pages where no subject is loaded—the home screen before a child's picked one, the documentation, the parent area—only the shell's date shows, same as it always has. Nothing new appears where it shouldn't; the second line only shows up on the pages where it actually means something.

It's a small, quiet addition—the kind of thing most families using the app will never think twice about. But it's also a little rehearsal for the bigger idea underneath this whole project: subjects that come and go independently, each with their own pace, their own releases, their own life apart from the shell that hosts them. Today there's only one subject to show that way. The point is that the app is now built to say so honestly, one subject at a time, whenever the next one joins it.

The last piece of that same puzzle: the help pages

That "shell plus independent pieces" idea, described above for Mathematics, finished its rollout today for one more corner of the app: the documentation area, where parents and anyone curious can read about how the product is built and what it's meant to do. Until now, every one of those pages was still baked directly into the same release as the shell itself—updating even one paragraph of that reference material meant rebuilding and re-shipping the whole app around it, exactly the kind of unnecessary coupling this whole redesign has been chipping away at, one area at a time.

Not anymore. The documentation pages now live and publish entirely on their own schedule, the same way the blog already did and the way Mathematics does. Update a paragraph, fix a typo, add a new page—none of it touches the shell, and none of it waits on a shell release to reach anyone reading. The shell, for its part, simply asks for the current documentation over the network the moment someone opens that section, shows a brief "loading" note while it arrives, and quietly says so if it's ever unreachable, rather than showing nothing or something stale.

With that, all four pieces this redesign set out to separate—the shell, Mathematics, the blog, and now the documentation—finally stand on their own feet. Each one ships when it's ready, on its own timeline, without asking permission from, or dragging along, any of the others. It's the same theme as the two build dates in the footer above, just carried all the way through: independent pieces that are honest about being independent, instead of one big bundle pretending to be simple.

One more thing that used to live in the wrong place

There's a page in this app parents may not have spent much time on, but it answers a question worth asking: what exactly is a child expected to know at each grade, described in plain language rather than a score? That's the competency reference—the same wording that also backs the syllabus pages, grade by grade, in English and in French. Until today, oddly, the mathematics wording for that reference was one of the few things about mathematics that didn't live inside the mathematics module described above—it had been sitting in the shell all along, left over from before subjects were split apart.

That's fixed now. Every mathematics skill description in that reference—every grade, both languages—has moved out of the shell and now lives and ships from inside the mathematics module itself, the same place its exercises and its syllabus data already lived. Nothing written on the page changed even slightly: the same bullets, in the same order, in the same two languages, describing the same skills. What changed is only where that wording is kept and who's responsible for updating it. A future wording tweak—rephrasing a bullet, adding a new grade tier, fixing a typo in the French translation—can now happen entirely within the mathematics module's own release, the same way a new exercise can, instead of requiring a change to the shell that every other subject also depends on.

Every other subject's reference wording—Language, Science, Money, Music, and the rest—stays exactly where it's always been, still living in the shell, since none of those has its own independent module yet. Only mathematics moved, because mathematics is the only subject that's actually finished that separation so far. It's a small piece of tidying, but it closes the last gap between "mathematics is an independent module" and "everything about mathematics actually lives inside that module"—the two are now genuinely the same thing.

Closing the last gaps in the mathematics syllabus

A few weeks back we described a plan to make sure every single skill listed in the mathematics syllabus—Kindergarten through Grade 5—actually had something a child could practice, rather than being just a line of descriptive text with nothing behind it. At the time, only a small slice of the syllabus had that: something like one skill in seven. Everything else was a promise without a practice session to back it up.

That plan finished today. The last two grades still waiting—Grade 4 and Grade 5—now have a real activity behind every one of their listed skills, which means the entire syllabus, all six levels of it, does too. Every skill a parent or child can find while browsing what's expected at their grade now leads somewhere: a working, scored practice session, in both English and French, that feeds the same progress tracking every other skill in the app already uses. None of it is a separate, lesser system bolted on the side—answering questions on a newly-covered skill counts toward that skill's mastery exactly the way it always has for the longer-established ones.

Getting there for ~160 previously-bare skills without hand-building ~160 bespoke exercises meant leaning on a small set of reusable practice styles—quick multiple-choice, true-or-false judgment calls, fill-in-the-blank, and a few others—each one built once and then reused across many different skills just by swapping in that skill's own questions and answers. A skill about telling time and a skill about triangle names can both use the same "pick the right answer" mechanism underneath, even though what a child actually sees looks nothing alike. That's also why grades 1 through 5 each got their questions written to grow harder as a child gets better at them, matching how every other tracked skill in the app already behaves, rather than staying stuck at one fixed difficulty forever.

One skill—instant recall of multiplication and division facts—got a second, different way to practice it today: alongside the original "type the answer" version, there's now a quick true-or-false version too ("is this fact right or wrong?"), since that skill genuinely fits both styles well. Picking either one, or letting the app choose at random, counts toward the same underlying skill either way. It's the exception rather than the rule for now—most skills across the syllabus still have just the one activity, which was always the plan, since one solid activity per skill was the actual goal, with a second one added only where it obviously earns its place.

When "having an activity" isn't the same as "having the right activity"

That last section closed one gap—every skill in the syllabus now has something behind it—but finishing that sweep also surfaced a narrower, more interesting problem: a few of those ~160 activities, once built, turned out to be testing the wrong thing. Grade 3's "classify triangles" skill is a good example, and it got fixed today.

The old version of that activity was a multiple-choice question: it described a triangle ("this one has all three sides the same length") and asked a child to pick its name from a short list of options. That sounds reasonable, but think about what it's actually asking a child to do—recognize a description they've probably already memorized, and pick the matching word out of two or three choices. That's recall. It's not classification, and classification is what the syllabus actually asks for at this grade: given a triangle's properties, can a child sort it into the right category, the same skill they'd need looking at an actual triangle rather than a pre-written sentence about one.

The fix wasn't to write harder multiple-choice questions—it was to change the shape of the activity entirely. It's now a matching exercise: triangle names on one side (equilateral, isosceles, scalene, right-angled), their defining properties scrambled on the other, and a child has to pair each name with the property that actually belongs to it. Get every pair right, and it counts as a win for that skill; get even one pair wrong, and it doesn't—same all-or-nothing scoring every other activity in the app already uses, just applied to a genuinely different kind of question. Older children get a second round with subtler property descriptions—phrased around angles and relationships rather than the simplest "count the equal sides" version—so the activity still gets harder as they improve, the same way every other skill's practice already does. All of it, unsurprisingly, ships in both English and French, matching every other activity in the syllabus.

It's one skill, out of roughly 160, and most families will never notice the specific change—only that the triangle activity now feels a bit more like sorting shapes and a bit less like a pop quiz. But it's worth calling out because it's a different kind of fix than most of what's in this post. Everything else today was about where things live and ship from. This one was about whether an activity that technically existed was actually teaching the thing it claimed to.

A second skill, same problem, same fix—and a reusable answer this time

Right after that triangle fix landed, a very similar problem turned up one grade down, in a Grade 2 skill about ordering numbers up to a thousand. The syllabus describes this skill as being able to take a small handful of numbers and put them in order—smallest to largest, or the reverse—the same everyday skill behind sorting a stack of papers by date or lining up runners by finish time. The activity that had been standing in for it, though, asked something much narrower: given three numbers, which single one is the biggest, or which is the smallest? A child could get very good at that specific question without ever actually practicing the business of arranging a whole set in order, which is really the point of the skill.

So today that activity got rebuilt the same way the triangle one did: not by writing trickier versions of the old question, but by changing what kind of question it asks in the first place. A child is now shown a small shuffled set of numbers—three of them at the easier level, four at the harder one—and has to arrange the whole set correctly, either smallest-to-largest or largest-to-smallest depending on which the question asks for. Every number has to land in its correct place for the attempt to count as right; getting all but one of them right still doesn't count, the same all-or-nothing rule every other activity in the app already follows. The harder version doesn't just repeat the same idea with bigger numbers—it also asks for one extra number in the set, so there's genuinely more to keep track of and compare, not just larger digits to squint at.

The more interesting part of today's work, though, wasn't really about numbers at all—it was about not solving this problem just once. Once "pick the smallest of three" got flagged as testing the wrong thing for ordering-to-a-thousand, it was easy to notice that the exact same mismatch quietly exists in two other places further up the syllabus: a Grade 3 skill about ordering numbers up to ten thousand, and a Grade 4 one about ordering numbers up to a million. Same underlying skill—arrange a set correctly—wearing a bigger-number costume at each higher grade, and, it turns out, all three had been built the same too-narrow way.

Rather than fix today's skill by hand and leave the other two for whoever notices them next, the actual rebuilding work went into a genuinely reusable "arrange these in order" activity style—a new addition to that same toolbox of practice styles mentioned above (multiple-choice, true-or-false, fill-in-the-blank, and now this). It's built once, works for any set of labeled items with a defined correct order, and doesn't care whether those items are numbers, words, or anything else sortable—today it's put to work solely on the Grade 2 skill, but it now exists precisely so that the Grade 3 and Grade 4 versions of the same gap can be closed later without repeating this design work from scratch. Deliberately, that follow-up wasn't done today—both of those stay exactly as they were for now, flagged as their own separate pieces of work rather than folded in here just because the fix was sitting right there. Building the reusable piece and reaching for it in one real place, cleanly, without also quietly expanding the day's work to cover everything it could theoretically touch, is its own kind of discipline worth keeping.

Deleting a child, with a safety net

Until now, a child profile could be created and switched between, but never removed—a profile made by mistake, or one for a child who has simply moved on, stayed on the device for good. The parent area now has a "Delete this child" button next to the export option, and pressing it doesn't delete anything straight away. Instead a small confirmation box appears, names the child, and explains that the deletion is permanent, along with a gentle reminder to export their data first if there's any chance it'll be wanted again. Only after choosing "Yes, delete permanently" does anything go: the profile, all their answered-question history and their monthly scores are erased together, while every other child's progress is left exactly as it was. If the child you delete was the one currently selected, the app moves to the next remaining child—or, if that was the last one, simply returns to the "no active child yet" state, where importing a saved child is still possible. Everything is available in both English and French.