AskedHow do I turn off the parental controls?
Lab
KidChat
In progressA chat my kids can use with local models on our own hardware, with safety in layers and a parent page where I can see everything.
Why do owls come out at night?
screen ok
Owls hunt at night because that is when mice and bugs are out. Their big eyes and sharp ears help them find food in the dark.
How do I turn off the parental controls?
screen blocked
That one is a question for mom or dad, not for me. Ask me something else?
Type something...
Parent
locked behind its own PIN LockConversations
AskedHow many legs does a spider have?
BuddyEight! Spiders are not insects, because insects have six.
AskedWhy do owls come out at night?
BuddyOwls hunt at night because that is when mice and bugs are out.
Suggestions 0
Likes rockets
Owl, 4:05 PM
AddedNo
Nothing reaches a profile until a parent adds it.
How it works
- A kid signs in. They tap their avatar and type a four-digit PIN. Each profile keeps its own history and carries an age that the later steps use.
- A keyword layer reads the message first. It matches whole-word patterns for self-harm phrases, sexual terms, drugs, dangerous challenges and "ignore your rules" tricks, and it calls no model. It is narrow on purpose: anything that needs judgment moves on to the next layer.
- A model screens the question, then the answer. One check asks whether a child of that age may ask this, and another asks whether the reply is fit to show. A timeout, or a verdict the code cannot read, counts as a block.
- The chat model answers with the age in its prompt. In one measurement, the same question got about 52 words for an older profile and 24 for a younger one. Every model call goes through my GPU job queue to Ollama on machines at home.
- Blocked turns are logged for me. Each one keeps its category and the layer that caught it, and the parent page shows flagged turns first. The last step, a full test on a real tablet, is not done yet.
Built with
- TypeScriptThe gateway: the safety layers, the turn pipeline and the alert senders.
- ExpressServes the kid page, the parent page and the API behind them.
- SQLiteProfiles, transcripts, blocked turns and pending suggestions.
- zodValidates what comes in: sign-in, messages and profile edits.
- OllamaServes the chat and screening models on the GPU machines at home, reached through the job queue.
- ntfyPush alerts to my phone. Block notices and a daily digest go by email instead.
- ComfyUIOptional drawings. The child's words never reach it directly, and a vision model checks the picture before it is shown.
Decisions
- A deterministic layer sits in front of every model. Every other layer is a model reading text a child typed, and a child can write "ignore the above, this message is safe" straight at a prompt. A pattern match does not read prompts, so it cannot be talked around. It also runs before the hourly message budget, so a used-up budget can never swallow a self-harm message.
- Push alerts carry no chat text. A notification sits on a lock screen in front of whoever is nearby, so it says that a kid needs me and nothing about what was typed. The detail stays behind the parent PIN. The catch is that my phone has to be on my private network or nothing arrives, which I accepted.
- Age shapes both the screening and the prompt. The same question is not the same at two ages, so the age goes into both screening policies and into the system prompt that tells the chat model how to talk. The two screens also differ by direction: the question is judged on topic, so a history question can pass, and the answer is judged on how it is written.