Privacy: what Primary Math Tutor stores

The account holder is a parent or guardian (18 or over) who signs in with Google, agrees to the terms and supervises their child. The built-in example lessons work without an account, and an anonymous lesson stores nothing. Accounts exist so the tutor can remember how each child is doing, pace the next lesson to suit them, and let the child replay their own lessons ("My lessons"); new problems (photos, typed questions) need a signed-in member of a family whose parent has agreed to the terms.

Stored (SQLite, app/db.py; on Modal, a persistent Volume)

TableFieldsNotes
parentsid, google_sub, display_name, created, consent_version, consentedgoogle_sub is Google's stable account id (prefixed google:). display_name starts as the first name Google returns; the parent can change it ("What should we call you?"), and later Google sign-ins don't overwrite it. No email, no photo, no full name. consent_version and consented record which version of the terms (/terms) the parent agreed to, and when.
childrenid, parent_id, nickname, level (P1–P6), avatar (an emoji), code_name, created, pw_hash, pw_verThe nickname is whatever the parent types: we ask for a first name or nickname only, never a surname. code_name is the child's generated hero name ("Thor987"; profiles made earlier keep names like "brave-otter-42"). pw_hash is a salted scrypt hash of the simple password the parent sets for the child, never the password itself; the password is shown to the parent once, when set, and is never logged or returned again. pw_ver counts resets. No birthday, school or photo.
attemptsid, child_id, heuristic, level, checkpoint_key, outcome, seconds, createdOne row per checkpoint in a signed-in child's lesson: the problem type (e.g. before_after), its level (e.g. P5), which step (unit, answer, challenge…), how it went (first try, with hints, shown, early, missed) and how many seconds it took.
masterychild_id, heuristic, rating, n, avg_seconds, updatedOne summary row per problem type: the rating, how many checkpoints it is based on, and the average answer time.
lessonsid, child_id, spec, solved, title, heuristic, level, thumb, steps, status, runs, solved_on, hints, seconds, progress, kept, created, updated"My lessons": one row per lesson a signed-in child starts (a twin included), so they can replay it. spec is the checked bar-model plan, which includes the question text; solved is its worked-out values; thumb is up to four bar lengths for the tile picture. The rest is how it went (finished or not, how far it got, hints given, which try solved it, how long the last run took) and whether the child kept it (★). A replay updates the same row. At most 200 per child (the oldest that aren't kept go first). No photo, audio or transcript.
plan_eventsid, created, parent_id, child_id, source, outcome, heuristic, planner, seconds, question, detailOne row per new problem planned, for the admin dashboard: whether it was verified, declined or failed, the method and how long it took. The question text is kept only when the tutor declined or failed, so it can be improved; a solved question is not kept here.
flagsid, created, parent_id, child_id, lesson_id, reason, note, question, spec, answer, status, admin_note, updated"Report a problem": what went wrong (a fixed choice), the parent's or child's note, the question, the checked plan and the tutor's answer, and the owner's status and note.
badgeschild_id, badge, earned_atOne row per method badge a child has earned (e.g. remainder_ranger, came_back) and when. Badges and the levels shown with them ("Starting" to "Master") are worked out from the attempts and mastery rows above; nothing else about the lesson is kept.

Anonymous lessons can still earn a badge: it is shown at the end of that lesson and in the page for that visit only, and is never sent to the database. "Try one like this" practice problems (twins) are made in server memory from the lesson's own problem and kept in a small in-memory cache while the server runs; a twin is written to disk only as a signed-in child's own lesson in lessons, once they start it.

Never stored

Cookies

Kid sign-in

Deleting

Who can see it

What is sent to AI models

Back to Qimora