{"slug": "show-hn-chrome-extension-where-jev-decides-if-each-post-video-page-is-worth-it", "title": "Show HN: Chrome extension where Jev decides if each post/video/page is worth it", "summary": "A developer released rot-guard, an open-source Chrome extension that sends page titles, post text, video titles, channel names and article excerpts to the TypeSafe Jev API to judge whether each YouTube video, X post, Reddit or LinkedIn item serves a user's stated goals, collapsing or blocking content that does not. The extension requires Chrome, Node 18+ and a TypeSafe Jev API key, runs with no server, caches verdicts for 1 day by content hash, and tightens thresholds at 2, 10 and 20 minutes of engaged time, with X limited to 2 check-ins of 15 minutes per day and newsletters to 45 minutes per day.", "body_md": "A Chrome extension that blocks content, not sites. It reads the video, post or article you're on and asks [TypeSafe Jev](https://docs.typesafe.ai) if it serves your goals. If it doesn't, it's gone.\n\n- **YouTube:** judges each video. Useful ones play, junk gets blocked. Irrelevant tiles in feeds and search collapse. Shorts are always hidden.\n- **X:** judges each post. Irrelevant posts collapse to one line. Ads are always hidden. 2 check-ins a day, 15 minutes each.\n- **Everything else:** Reddit, LinkedIn, articles and any other page get judged too.\n- **Time:** the longer you stay, the stricter it gets.\n- **Appeals:** one shot. Give a specific reason and you get 15 minutes. Give an excuse and you get \"Fuck you.\" and a lock until midnight.\n- **Fun and music:** your hobbies are never blocked on content. Music is never blocked.\n\nNeeds Chrome, Node 18+ and a [TypeSafe Jev](https://docs.typesafe.ai) API key.\n\n```\ngit clone https://github.com/plusminushalf/rot-guard.git\ncd rot-guard\ncp .env.example .env                                            # add your JEV_API_KEY\nnode scripts/build-config.mjs                                   # writes extension/config.local.json\ncp extension/profile.example.json extension/profile.local.json  # edit it\n```\n\nOpen `chrome://extensions`, turn on **Developer mode**, click **Load unpacked**, pick `extension/`.\n\nOr skip the files and set the key and profile in the extension's **Settings**.\n\nLives in `extension/profile.local.json` (gitignored). Without it, `profile.example.json` is used.\n\n| Key | Meaning | \n|---|---|\n| `profile` | Who you are, in a few sentences. | \n| `goals` | What counts as progress. Be specific: \"Postgres internals\" beats \"work\". | \n| `fun` | Hobbies. Only time limits apply. | \n| `avoid` | What counts as rot for you. | \n| `allowlist` | Domains that are never judged. Subdomains included. | \n| `trustedCreators` /`mutedCreators` | Always shown / always hidden. | \n\nAny 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.\n\n- **Extraction:** readers for YouTube, X, Reddit and LinkedIn, plus a generic one for everything else.\n- **Jev answers typed questions:** category, relevant to goals (yes/no), waste-of-time score (0–4), and whether it's a feed.\n- **Rules are code:** Jev is bad at numbers. Thresholds tighten at 2, 10 and 20 minutes. Shorts and rot are blocked instantly. Feeds are blocked after 10 minutes, and any site that doesn't serve your goals after 60 minutes a day.\n- **Time is engaged time only:** the tab has to be visible, and either focused and active or playing media. Reloading doesn't reset it.\n- **Per item:** X posts and YouTube tiles are judged one by one, 10 per request. Feed pages themselves are only blocked on time.\n- **Creator reputation:** every author or channel gets rated high, neutral or low signal. The rating comes from Jev's opinion (only when it's confident) and your track record with them (after 3 items). It shifts relevance by ±0.25, so experts' sarcasm passes and noise accounts' polished takes don't.\n- **Articles:** judged on their beginning, middle and end, because essays often bury the point.\n- **Cache:** answers are cached for 1 day by content hash. Nothing gets judged twice.\n- **Budgets:** X gets 2 check-ins of 15 minutes, and a new check-in starts after 45 minutes away. Newsletters get 45 minutes a day.\n- **Missing goal?** Add it from the block page. The page is judged again.\n\nThere'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.\n\n```\nextension/\n  background.js   time, budgets, locks, cache\n  content.js      per-site extraction, blurring, collapsing\n  jev.js          Jev client + decision rules\n  cache.js        verdict cache\n  shared.js       settings + helpers\n  popup.* options.* blocked.*   extension pages\nscripts/          build-config.mjs: .env → config.local.json\ntest/             live tests against Jev\n```\n\nThese hit the live Jev API with the example profile. They need `JEV_API_KEY` in your env or `config.local.json`.\n\n```\nnode test/jev-live.mjs        # pages + appeals\nnode test/x-posts-live.mjs    # X posts\nnode test/yt-videos-live.mjs  # YouTube videos\nnode test/creators-live.mjs   # creator reputation\nnode test/profile-live.mjs    # fun, music, interests\n```\n\nJev is probabilistic. Cases near a threshold can flip.", "url": "https://wpnews.pro/news/show-hn-chrome-extension-where-jev-decides-if-each-post-video-page-is-worth-it", "canonical_source": "https://github.com/plusminushalf/rot-guard", "published_at": "2026-09-27 16:12:04+00:00", "updated_at": "2026-09-27 16:31:21.219023+00:00", "lang": "en", "topics": ["ai-products", "ai-tools", "artificial-intelligence", "generative-ai"], "entities": ["rot-guard", "TypeSafe Jev", "Chrome", "YouTube", "X", "Reddit", "LinkedIn", "Node 18"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-chrome-extension-where-jev-decides-if-each-post-video-page-is-worth-it", "markdown": "https://wpnews.pro/news/show-hn-chrome-extension-where-jev-decides-if-each-post-video-page-is-worth-it.md", "text": "https://wpnews.pro/news/show-hn-chrome-extension-where-jev-decides-if-each-post-video-page-is-worth-it.txt", "jsonld": "https://wpnews.pro/news/show-hn-chrome-extension-where-jev-decides-if-each-post-video-page-is-worth-it.jsonld"}}