Project Info
Inspiration
The world cup motivated some of us to watch a lot of football related content before the big games. Especially documentary type videos or explainer videos of players relating their backstories and quirks. What surprised us was how many of the search results that come back on Youtube contain unbearably slopped out videos. That made us think that there must be a way to solve this problem using ChatGPT. That's how we came up with our idea for SlopShield.
What it does
SlopShield is a Chrome (and Firefox) extension that analyses the transcripts and sound of the Youtube videos that are displayed in your viewport while browsing. It passes the ids down to the backend for analysis, through our engine, that then reports how confident it is that the video has been AI generated. The videos that are flagged are then removed from the Youtube viewport by the browser plugin. Nice and simple.
How we built it
At first we wanted to train a model to do this but soon we realized that this can be solved for the most part by using very simple heuristics. For one, the transcripts already signal very heavily when a video has been generated by a botfarm. That's because the text will have been generated by, usually, a very old model that by now is easy for AI text detectors to flag. Beyond that, SlopShield also checks the sound characteristics of the video by running it through a synthetic voice detector and uses that information to influence the confidence score as well. These two methods combined resulted in a surprisingly effective filter that gets rid of most of the garbage that you would see in your feed.
Challenges we ran into
The Youtube api is a little restrictive about just fetching an infinite amount of transcripts and eventually just flagged our backend's IP which made our system run into a slew of 429s. To get around that, we use the session of the user, because they are already logged in, to generate a OTP that the plugin passes to Youtube's backend as if the user click on the transcript button on the bottom of the video. Like this, the IP that is used to fetch the transcript is the same IP as the user watching and searching Youtube, which makes the network traffic behave the way Youtube intends it to. Another complication was dealing with our compute limitations. We have one 3090 that we use for the engine, so we set up a few queues to make the load of multiple users best distributed over that one GPU. In addition we set up a database to cache results so no video has to be processed more than once, which would be wasteful. Lastly, and probably the trickiest problem we ran into, is that the passing of the transcript to the backend via the plugin meant that there was a cache poisoning attack vector. To get around that, we corroborate the transcript that is sent against a transcript that we generate ourselves using whisper for a segment of that video.
Accomplishments we're proud of
That we overcame the technical hurdles listed above is a large source of pride for sure. That we came managed to cook something of this complexity up within a week is also definitely a source of pride. Even if it was all ChatGPT's merit anyway. What we are also proud of is that this product has the potential to increase the viewing experience of other people. As well as combating botfarms that just manipulate people for views.
What we learned
We learned a lot about how youtube's API and backend works. We learned a lot about how effective ChatGPT/Codex is at researching, testing and calibrating local models for our use-case. We also learned that an insane amount of videos are AI generated.
What's next
There is a lot to expand on here. Many user interface improvements can be made. The engine can be made much faster. Which is something that would a very interesting technical challenge for us. We did not implement analysis on Youtube shorts yet, so that would be something that we would love to tackle given more time. Honestly this is a project with a really high polish ceiling that we could definitely make so good that you wouldn't want to use Youtube without it.
SlopShield browser extension
SlopShield hides videos that the SlopShield API has classified as AI-generated. It scans normal YouTube cards, reuses cached scores immediately, and fetches missing transcripts through the user's active YouTube browser session. Model inference stays in the backend.
This fork uses the real slopshield-api. The old mock scores and strictness slider have been removed. Filtering is simply on or off; switching it off reveals already-classified AI cards with provenance badges.
Built with OpenAI Codex and GPT-5.6
We used OpenAI Codex with GPT-5.6 to build and review the browser extension.
Codex helped connect the extension to the real API.
It helped move YouTube caption retrieval into the user's browser session.
It helped design batching, caching, cooldowns, and fail-open behavior.
It helped harden trust boundaries and validate API messages.
It helped improve consent, privacy text, status badges, and result provenance.
It also helped test the Chrome and Firefox flows.
Install in Chrome
- Open
chrome://extensions. - Enable Developer mode.
- Click Load unpacked and select this repository.
- Refresh any YouTube tabs that were already open.
Install temporarily in Firefox
Firefox uses a background script rather than Chrome's Manifest V3 service worker, so it needs its own manifest. Install build dependencies and build the Firefox directory with Node.js 18 or newer:
npm install
npm run build:firefox
Then:
- Open
about:debugging#/runtime/this-firefox. - Click Load Temporary Add-on.
- Select
dist/firefox/manifest.json. - Refresh any YouTube tabs that were already open.
Firefox removes temporary add-ons when the browser closes. Everyday installation will require a Mozilla-signed XPI.
The popup reports API/engine health plus truthful current-page coverage: videos cleaned, AI videos hidden, checks still running, unavailable or failed checks, and lightweight scan timing.
Behavior
The extension extracts each video's immutable UC… channel ID from YouTube renderer data (with no handle/name fallback), then sends discovered videos to POST /v1/analyses in batches of up to 50. Cached video or channel classifications are applied immediately. For a new channel, the API selects one evidence video; its transcript is fetched only after its card enters the viewport. Other videos from that channel wait and inherit the evidence verdict without fetching transcripts.
completedwithis_ai: true: hide the video card.completedwithis_ai: false: leave it visible.queuedorrunning: leave it visible and check again later.missingwithneeds_transcript: true: fetch captions in Firefox and submit them.failedor invalid: leave it visible.
For missing videos that enter the viewport, the page bridge runs YouTube's BotGuard challenge once, reuses its WebPO minter, mints a content-bound token per video, and fetches timestamped captions through the user's IP/session. Transcript jobs run one at a time with at least 1 second between starts. Transient YouTube/network failures trigger a shared exponential cooldown (30 seconds up to 5 minutes) so one rate limit cannot cause a retry storm. No hidden tabs or video navigation are used.
Results are cached by the backend. Thumbnail badges show Checking… while a result is pending and ✓ No AI detected after either a direct non-AI result or a non-AI verdict inherited from the channel's evidence video. AI-classified cards are hidden while filtering is enabled. Turning filtering off reveals direct AI results as AI detected and inherited results as AI channel, making the disabled state useful as a preview. Failures remain visible with a Check failed badge. Videos without an immutable channel ID or usable transcript remain visible with an Unavailable badge.
YouTube Shorts and Shorts shelves are intentionally ignored.
Source layout
manifest.json Chrome Manifest V3 configuration
manifest.firefox.json Firefox Manifest V3 configuration
scripts/build-firefox.mjs Creates the loadable Firefox directory
src/background.js SlopShield API requests and health checks
src/content.js Card discovery, two-phase queueing, and filtering
src/webpo-page-entry.js Browser transcript/WebPO source
src/webpo-page.js Generated page-context browser bundle
src/content.css Hidden-card and API-offline styles
popup/ On/off switch, health, and hidden count
API configuration
The API URL is defined in src/background.js. Its origin must also appear under host_permissions in both browser manifests.
See docs/API_CONTRACT.md for the API fields used by the extension.
See PRIVACY.md for the concise hackathon privacy disclosure mirrored in the popup.
Analysis
View
Metric
- 17
- 2
- 1
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- CSSIn code
- HTMLIn code
- JavaScriptIn code
- PythonClaimed
3 of 4 appear in the indexed code. 1 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
74 KB
Source files
13
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
chknlittle/slopshield-plugin
25 files · 101 KB · @ 9aaf6ad
Structure
Interface
2 files · 8%Screens, components and styles rendered to the user.
Application logic
10 files · 40%Domain rules, services and shared utilities.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- JavaScript74%
- CSS11%
- Markdown11%
- HTML3%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
package.json
npm · 22 development-only dependencies.
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.