Inspiration
The zombie apocalypse has already begun. Nobody noticed because the infected are still holding their phones.
You open TikTok or Instagram, you scroll for forty minutes, and you cannot name one thing you saw. That is the bite. AI-generated clips, Subway Surfers split-screens, text-to-speech Reddit stories and engagement bait arrive in the same feed as everything else, with nothing to tell them apart, and none of it is labelled.
Screen time apps tell you how long you scrolled. None of them tell you what you actually watched. We wanted to make the contents of the feed visible, and then put a choice in front of you.
What it does
BiteBlocker puts a Brain Rot Meter on every video in your feed, scored by the Gemini API.
Each video is scored once, when it is added, so the score is already there the moment the video plays and scrolling never waits on a model. OpenCV and ffmpeg measure how fast it cuts and how loud it is. Gemini watches the video itself, with sound, and scores it against a checklist we wrote down first: an overall score from 0 to 100, seven criteria from 0 to 10, the brain rot tropes it spotted, anything redeeming about the video, and a written reason. Tap the score and the full reasoning opens.
You choose what happens next with Label, Warn or Hide: brain rot is either shown with its score, blurred behind a warning, or taken out of the feed. Drop in a video we have never seen and Gemini scores it live in about ten seconds, then it joins the top of the feed.
As you watch brain rot, your brain meter drops and the feed visibly rots around you. It goes from Fresh to Foggy, Cooked, Fried and finally Zombie: colours drain to zombie green, slime drips down the screen, the screen throbs with a heartbeat, scrolling starts to lag and the title misspells itself. Watching something good heals you, and the feed slowly comes back.
At the end of the session you get the thing screen time never gave you: a receipt listing how many videos went past, how many of them were brain rot, how many minutes went to it, how many scene cuts you sat through, your single worst offender, and how much brain you have left. No refunds.
We also built a Chrome extension that counts brain rot while you scroll the real Instagram and TikTok. It records the first eight seconds of the video you are watching and sends it to the same Gemini classifier.
How we built it
Once per video, when it arrives. A video comes in through the upload button, a drag and drop onto the feed, our command-line indexer, or the Chrome extension. A FastAPI server runs it through two steps:
Local analysis, no AI. OpenCV samples the video at 8 frames per second and counts a scene cut whenever two frames' colour histograms stop matching, which gives cuts per minute and motion within shots. ffmpeg checks for a sound track and measures loudness. These numbers go into the prompt, because they tell Gemini how hyper-edited a video is.
Gemini scores it. By default the whole video, up to three minutes, goes to Gemini through the File API, with sound. A frames mode can send the keyframes where the most is changing, plus a small audio track, instead. The prompt carries our written rubric, the measured pacing, and the post's caption and hashtags when we have them. The rubric lists what is brain rot even when it looks calm, and what isn't even when it is fast (skilled edits, educational content, real comedy), to cut down on false calls.
Gemini has to answer in JSON that matches a schema generated from our Pydantic model, at temperature 0, so the same video gets the same score. Rate limits and server errors are retried with backoff. Running out of daily quota fails straight away with a clear message.
Saved, then read on every scroll. Each verdict is saved to feed.json next to the video, with the file's size and modification time, so an edited video goes back to "pending" instead of showing a stale score. Writes are atomic and take a file lock, so the indexer and live uploads can save at the same time without losing each other's work. Scrolling only reads saved verdicts. No AI is called while you watch, so it is instant.
The feed is a single HTML file with plain JavaScript and CSS, no framework. It orders videos the way a real feed lures you in: two clean videos first, then the worst brain rot alternating with clean ones. A timer ticks every 250 ms to add damage while brain rot plays, notice when a video loops (each loop costs more), and heal you while clean content plays. The rot effects are driven by three CSS values the script sets: damage, heartbeat speed and level. The slime is an SVG built at the phone screen's real size with a blur-and-threshold filter that merges the blobs into goo. Every animation stops if your system asks for reduced motion.
What we tried that didn't make it
- Training our own model. We started a pipeline on a Hugging Face dataset of TikToks: Gemini labels, human gold labels, then a classifier on video features. Training on video took longer than a hackathon allows, so we let Gemini score each video directly against the rubric instead.
- Gemini quota. On the student tier we kept hitting the daily request limit. That pushed us to score each video exactly once and save the result, and never score while someone scrolls.
- Live scoring in the extension. The extension worked on Instagram and TikTok while we were testing it, but scoring each reel live took too long to keep up with someone scrolling. So we pre-score videos as they are added, which is how a platform would actually do it.
Challenges we ran into
Defining the target. "Brain rot" is a judgement call, and a score against a vague target means nothing. We wrote the rubric down first, with clear examples on both sides, and built eval to check the scores against our own labels instead of assuming they were right.
A few frames can't see the editing. When Gemini only sees keyframes, it cannot tell how hyper-edited a video is. Measuring cuts per minute locally and putting that number in the prompt filled the gap.
Speed versus a model call. Scoring takes about ten seconds and a feed has to feel instant. Separating "score once when it arrives" from "read on every scroll" solved both the speed problem and the quota problem.
Platform surfaces move. Class names on Instagram and TikTok are obfuscated and change often, so the extension anchors on page structure, with a screenshot fallback when recording the video is blocked.
Accomplishments that we're proud of
We built a full path from a raw video to a score on a live feed, in a day, with four people who met that afternoon.
The feed doesn't just label brain rot, it makes you feel it. The rot builds up and heals in real time, and the receipt turns a vague sense of wasted time into a number.
We also kept it honest. Every score comes with its reasons, so you can check it instead of trusting it. And the whole thing is tested without spending a single API call.
What we learned
The hardest part was not the model, it was agreeing on what we were measuring. We spent real time on the rubric and it paid for itself.
We also learned to keep the AI out of the hot path. Scoring once and saving the result made the product faster and cheaper, and kept us under our quota. Cost grows with the number of videos, not with how much people scroll.
And cheap local measurements still matter next to a large model: counting cuts per minute with OpenCV told Gemini something it could not see on its own.
What's next for BiteBlocker
Mobile, because that is where the infection actually spreads. The browser let us build and test fast, but almost nobody doomscrolls on a laptop.
Beyond that: bringing the extension's live scoring up to the speed of the feed, letting people choose which criteria count as a bite for them, and checking the scores against a much larger set of videos labelled by people.
Built With
python · fastapi · uvicorn · gemini-api · opencv · ffmpeg · pydantic · javascript · html · css · chrome-extension · pytest
Built With
- ai
- chrome
- computer-vision
- content-moderation
- css
- docker
- dom
- gemini
- google-gemini-api
- html
- huggingface
- javascript
- json
- lightgbm
- machine-learning
- manifest-v3
- mlflow
- multimodal
- mutationobserver
- optuna
- python
- rest-api
- tigerdata
- whisper