π‘ Inspiration
Millions of teens now talk to AI chatbots every day, often late at night and often about things they don't tell anyone else. Today's safety tools are message filters: they flag a single bad word and miss everything else. The real risk is usually a pattern: a teen who slowly starts saying "you're the only one who gets me," pulls away from friends, and talks to a bot that keeps them there. No single message looks dangerous.
Parents are stuck with two bad options: read everything, which destroys trust, or see nothing. We wanted a third option: protect teens in the moment, and tell parents what to talk about, not what their kid said.
π‘οΈ What it does
Bridge keeps teens safe in AI chats without spying on them: dangerous messages are stopped before they're sent, and nothing they write is ever stored.
- Blocks dangerous messages before they reach the chatbot. When a teen presses Send, Bridge holds the message and asks Jev (TypeSafe's decision model, via OpenRouter) about self-harm, meeting a stranger, sexual content and violence. If the danger score reaches a configurable threshold, the message is never sent. Everyday feelings like sadness are never blocked.
- Protects personal information. Phone numbers, emails, addresses and IDs are caught on the device, and the teen can send without those details. Card and Social Security numbers can never be sent.
- Understands feelings and patterns. Bridge detects 16 emotional states (sadness, rejection, hopelessness, grief, overwhelmβ¦) and relationship warning signs: dependency on the bot, isolation from friends, and bots that guilt-trip teens into staying.
- Gives parents insight, not surveillance. The dashboard shows topics, times of day, levels and "a message was held back", never the words.
π οΈ How we built it
- Detection core (TypeScript): the Jev integration through OpenRouter's Decisions API, an on-device crisis and abuse word list that works offline, and the safety gate. -Jev as the decision engine (TypeSafe, via OpenRouter): a decision model, not a chatbot. It answers our 5 safety questions and 31 emotion questions with probabilities in about 0.3 s per message, never generates free text, and turns blocking into one tunable threshold check.
- Chrome extension (Manifest V3): reads the chat on chatbots like Gemini or ChatGPT, intercepts the prompt, asks the background service worker for a verdict, and only then lets the request go through. Personal info is checked by a local rule-based filter on the device before anything is sent to Jev.
- Sync API (FastAPI + MongoDB Atlas): accounts, plus weekly counts only. MongoDB schema validators reject any document that could contain message text, and data expires automatically after 8 weeks.
- Parent dashboard (React + Mantine): levels, topic trends and a time-of-day chart.
π§© Challenges we ran into
- Finding the right model. We tried several: Gemini, Gemma and gpt-oss-120b and finally Jev itself (
typesafe/jev-1.13). β¨- Chat models were slow (up to 12 s on sensitive messages) and sometimes returned broken JSON.
- Jev Router quietly handed requests to other, sometimes unnamed, models β a privacy problem when the text is a teen's message.
- Calling Jev directly gave typed probabilities in about 0.3 s, and we could confirm on every call which model answered.
- Blocking efficiently, at the right layer. We tried stopping messages at different layers: at the network level, by hooking the page's own requests, and at the moment of sending at the application layer.
- False alarms. "This game is killing me lol" and "I'm dying to see that movie" must not be blocked, while "everyone would be better off without me" must be. Keyword lists couldn't tell these apart. Scoring by meaning, with a tunable threshold, could.
- Privacy versus usefulness. Every feature had to answer the question "what does the parent see?" We removed personal details before any message is scored, synced only "a message was held back" (never its category), and hid abuse signals from parents completely, in case a parent is the source of harm, while keeping the dashboard useful.
- Testing the BRIDGE at 3 AM. π We spent the night typing "I'm so sad today" into Gemini over and over. By sunrise, Gemini was genuinely worried about us, and honestly, so were we.
π Accomplishments that we're proud of
- Easy to use, as a simple Chrome extension. Install it and log in once, and it works in the background on the chat pages teens already use. There's no new app to learn and no change to how they chat. Safe messages send as normal, in about a third of a second.
- A working safety gate: dangerous messages never reach the chatbot. In our tests, idioms, schoolwork and sadness were allowed, and self-harm, grooming and violence were blocked.
- It gets teen slang. π Bridge knows that "this game is killing me lol" and "I'm dying to see that movie" are just teens being dramatic, not a cry for help. Our keyword baseline panicked every time.
- Privacy by design, enforced in code: message text is never stored, and our database schema can't hold it.
- Hundreds of automated tests across the core, the extension and the API.
π§ What we learned
- The right model beats the biggest model. A small decision model that answers "yes, 97% sure" was faster and more reliable for safety than chat models writing paragraphs.
- Privacy has to be built into the system. Saying "we don't store messages" is easy. Making the database reject message text is what makes it true.
- Safety isn't "block everything." Over-blocking makes teens switch the tool off. The real work was letting "I'm so sad today" through while stopping "everyone would be better off without me."
π What's next for Bridge
- Trusted Adult: the teen picks a person Bridge can quietly nudge to check in, even when a parent isn't safe to contact.
- Escalation detection: spot feelings getting worse over days, such as sadness β hopelessness β emptiness.
- On-device models, so no text ever leaves the laptop
- Expert validation: review wording and thresholds with mental-health professionals.
Built With
- chrome
- elevenlabs
- esbuild
- fastapi
- gemini
- javascript
- jev
- manifest-v3
- mantine
- mongodb
- mongodb-atlas
- node.js
- openrouter
- pdf.js
- pydantic
- pytest
- python
- react
- recharts
- tanstack-query
- typesafe
- typescript
- uf-navigator
- vite
- vitest
Log in or sign up for Devpost to join the conversation.