Inspiration

What it does

How we built it

Challenges we ran into

Accomplishments that we're proud of

Bouncer

Inspiration

Teenagers almost never tell anyone they're being harassed online. Not because they don't know how — because telling someone means admitting it got to them. So they keep it private, act like it rolls off, and let it pile up on their own phone. The messages don't stop, and neither does re-reading them.

That silence is the actual problem. It compounds invisibly, and by the time a parent, a teacher, or a friend finds out, the damage has already happened — and there's no record of any of it, because the only witness was the person it happened to.

We kept coming back to the same barrier: every existing solution requires the victim to speak up first. Report it. Screenshot it. Tell an adult. All of that asks a teenager to do the one thing shame makes hardest.

So we built something that doesn't require disclosure at all.

What it does

Bouncer is a digital guardian that sits across all your chats — Discord, iMessage, SMS, email — running privately on your own machine. Nobody has to be told. Nothing gets shared.

It reads what comes in. When someone's pattern starts escalating, it stops handing you their messages and gives you a calm summary instead, so you're not absorbing every insult to stay informed. It recognizes the same person when they come back under a new number or account, and says why. It tells you where a situation is heading before it gets there.

It also watches the other direction. If you're firing back at 1am, it says so — not "you seem upset," just: three messages in two minutes to someone we're tracking, want to pause? It notices something is getting to you without making you announce it.

And the entire time, it's building the record. So the day you do decide to tell someone — a parent, a school, the police — the evidence already exists and you never have to go back and read it again to prove it happened.

How we built it

A TypeScript server ingests every channel and runs each message through one pipeline. Five judgments are made by deepseek-v4-flash:cloud on Ollama Cloud with structured JSON output: severity, cross-platform identity linkage, escalation and forecast, summaries, and reply drafting — each returning a written rationale that ends up in the app and the exported report. Messages are stored in SQLite where every row's SHA-256 hash includes the previous row's, so the log re-verifies from entry one and can't be quietly edited. A React console runs on the Mac; a SwiftUI iPhone app pairs over local Wi-Fi via Bonjour, streams events over WebSocket, and raises lock-screen alerts you can act on without opening the app.

Challenges we ran into

The model wouldn't hold its output schema — we got bare numbers and markdown back — so we probe-tested it and moved to format: "json" with the schema in the prompt plus validation and retries. Disabling thinking made it worse, not better.

Venue-style Wi-Fi with client isolation meant the phone couldn't reach the Mac at all, so we ran the whole system over the USB cable with Bonjour discovery.

The bug that taught us the most: when the phone lost the Mac, our app displayed "All quiet." A safety tool had just told a scared user everything was fine because it couldn't see. We rewrote it to say plainly: "Can't see your channels — this is not an all-clear."

What we learned

Trajectories, not messages. One cruel message never quarantines anyone — we deliberately kept a friend's "I'm going to kill you, you can't leave me on that cliffhanger 😭" in our test data to make sure it never escalates.

And this: the reason kids don't report isn't a lack of tools. It's that every tool starts by asking them to say it out loud. Build something that acts before that moment, and you reach the people the current options never do.

What we learned

What's next for Bouncer

Built With

  • health
  • mental
Share this project:

Updates

Submission history