A Chrome extension that blocks content, not sites. It reads the video, post or article you're on and asks TypeSafe Jev if it serves your goals. If it doesn't, it's gone.
Needs Chrome, Node 18+ and a TypeSafe Jev API key.
git clone https://github.com/plusminushalf/rot-guard.git
cd rot-guard
cp .env.example .env # add your JEV_API_KEY
node scripts/build-config.mjs # writes extension/config.local.json
cp extension/profile.example.json extension/profile.local.json # edit it
Open chrome://extensions, turn on Developer mode, click Load unpacked, pick extension/.
Or skip the files and set the key and profile in the extension's Settings.
Lives in extension/profile.local.json (gitignored). Without it, profile.example.json is used.
| Key | Meaning |
|---|---|
profile | Who you are, in a few sentences. |
goals | What counts as progress. Be specific: "Postgres internals" beats "work". |
fun | Hobbies. Only time limits apply. |
avoid | What counts as rot for you. |
allowlist | Domains that are never judged. Subdomains included. |
trustedCreators / mutedCreators | Always shown / always hidden. |
Any key from DEFAULT_SETTINGS in extension/shared.js works here too (passMinutes, xCheckinsPerDay, readingMinutesPerDay, …). Settings saved in the extension override the file. Changing goals clears the cache.
There's no server. Page titles, post text, video titles, channel names, article excerpts and your profile go to the Jev API. Everything else stays in the browser. Allowlisted domains are never sent.
extension/
background.js time, budgets, locks, cache
content.js per-site extraction, blurring, collapsing
jev.js Jev client + decision rules
cache.js verdict cache
shared.js settings + helpers
popup.* options.* blocked.* extension pages
scripts/ build-config.mjs: .env → config.local.json
test/ live tests against Jev
These hit the live Jev API with the example profile. They need JEV_API_KEY in your env or config.local.json.
node test/jev-live.mjs # pages + appeals
node test/x-posts-live.mjs # X posts
node test/yt-videos-live.mjs # YouTube videos
node test/creators-live.mjs # creator reputation
node test/profile-live.mjs # fun, music, interests
Jev is probabilistic. Cases near a threshold can flip.
3 commits
JavaScript
87.0%
HTML
10.6%
CSS
2.4%
A Chrome extension that blocks content, not sites. It reads the video, post or article you're on and asks TypeSafe Jev if it serves your goals. If it doesn't, it's gone.
Needs Chrome, Node 18+ and a TypeSafe Jev API key.
git clone https://github.com/plusminushalf/rot-guard.git
cd rot-guard
cp .env.example .env # add your JEV_API_KEY
node scripts/build-config.mjs # writes extension/config.local.json
cp extension/profile.example.json extension/profile.local.json # edit it
Open chrome://extensions, turn on Developer mode, click Load unpacked, pick extension/.
Or skip the files and set the key and profile in the extension's Settings.
Lives in extension/profile.local.json (gitignored). Without it, profile.example.json is used.
| Key | Meaning |
|---|---|
profile | Who you are, in a few sentences. |
goals | What counts as progress. Be specific: "Postgres internals" beats "work". |
fun | Hobbies. Only time limits apply. |
avoid | What counts as rot for you. |
allowlist | Domains that are never judged. Subdomains included. |
trustedCreators / mutedCreators | Always shown / always hidden. |
Any key from DEFAULT_SETTINGS in extension/shared.js works here too (passMinutes, xCheckinsPerDay, readingMinutesPerDay, …). Settings saved in the extension override the file. Changing goals clears the cache.
There's no server. Page titles, post text, video titles, channel names, article excerpts and your profile go to the Jev API. Everything else stays in the browser. Allowlisted domains are never sent.
extension/
background.js time, budgets, locks, cache
content.js per-site extraction, blurring, collapsing
jev.js Jev client + decision rules
cache.js verdict cache
shared.js settings + helpers
popup.* options.* blocked.* extension pages
scripts/ build-config.mjs: .env → config.local.json
test/ live tests against Jev
These hit the live Jev API with the example profile. They need JEV_API_KEY in your env or config.local.json.
node test/jev-live.mjs # pages + appeals
node test/x-posts-live.mjs # X posts
node test/yt-videos-live.mjs # YouTube videos
node test/creators-live.mjs # creator reputation
node test/profile-live.mjs # fun, music, interests
Jev is probabilistic. Cases near a threshold can flip.
3 commits
JavaScript
87.0%
HTML
10.6%
CSS
2.4%