TellMom Start building

TellMom

Let them play. TellMom quietly watches their game chat for signs of grooming and tells you early. It runs on a Raspberry Pi in your home, and the relay in the middle is built to know nothing.

A group of children laughing as they play a circle game outdoors, holding hands.
Two boys on a couch, wide-eyed and absorbed in a video game.
A girl lying in the grass, laughing.

The Leesin protocol

Lee Sin fights blindfolded, and so does our proxy. Every message between your Pi and your screen travels in a locked box. The proxy carries the box, but only your home and your screen have the key.

Your screen

Opens the box

D Leesin proxy

Only carries it

A Your Pi

Locks the box

What the proxy sees

An alert, as the proxy sees it

  • Which home server a box is going to
  • How big each box is, and when it's sent
  • The pairing code you type when you first connect

What it never sees

The same alert, as you see it

53%

mia_builds on Roblox

“send me a pic of you, just for me”

  • What your child types or receives
  • Alerts and risk scores
  • Your children's game accounts
  • Your dashboard password
  • The key that opens the box
How a session gets locked For the technically curious
  1. 1

    Pair

    You enter your Pi's server ID and pairing code in the dashboard. The proxy uses the ID to find your Pi and passes the code along.

  2. 2

    Exchange

    Your browser and your Pi each pick a secret number and swap only the public halves: Diffie-Hellman over the 2048-bit group from RFC 3526.

  3. 3

    Derive

    Both ends turn the shared secret into the same AES-256 key and nonce base with HKDF-SHA256. The key itself never travels.

  4. 4

    Seal

    Every request, reply and live alert is sealed with AES-GCM and numbered. Your requests count up from 1 and your Pi's replies from 252, so a nonce is never reused.

What the proxy stores

Your server's ID, its username and a bcrypt hash of its password, and which session belongs to which server (in memory only, dropped after three hours). Your Pi dials out, so your home router stays closed.

Known limits

Besides routes, sizes, timing and the pairing code, the proxy sees your dashboard login token in request headers; it only unlocks replies the proxy can't open. The key exchange isn't authenticated yet, so a proxy that actively swapped keys could read traffic.

Build it in five steps

Hover over a step to watch it. Commands run from the repository root unless a step says otherwise.

Recording of step 1 coming soon

1. Get your server

A Raspberry Pi with a 64-bit OS, or any Linux machine that stays on at home. Install Docker, git, the psql client and uv, then clone TellMom onto it.

git clone https://github.com/hawlermathew2007/TellMom.git
cd TellMom
cp .env.example .env            # Postgres settings
cp backend/.env.example backend/.env
# In backend/.env: set JWT_SECRET, CLASSIFIER_PASSWORD and GROQ_API_KEY

Everything the dashboard shows is stored on this machine.

Try the classifier

Watch TellMom read a made-up chat, one message at a time, with the same model that runs on your Pi. It waits for seven messages before it judges a conversation.

    What TellMom thinks

    Press Play to start

    A made-up chat between a stranger and a child on Roblox.

    Risk

      This is an early prototype model and it does make mistakes. Try a normal chat of your own and see.

      Build yours

      One Raspberry Pi, and your child's chats are stored in your home. Already built? Open the dashboard and connect with your server ID and pairing code.

      A prototype

      TellMom is a working prototype, not a finished service. Test it on your own setup before you rely on it.

      What it detects today

      Grooming patterns in text chat on Roblox, Discord and Minecraft. Bullying, scams and oversharing family details aren't covered yet.

      What's next

      An Android app, and screen analysis that sees what happens in the game, not only what's typed.