Skip to content
MrJev

TypeSafe AdBlock

Chrome extension that asks Jev whether each DOM element is an ad and removes the ones that are.

View on GitHub →

Hands-on review

A Chrome extension that asks Jev whether an element is an ad, then removes it. Clever, tiny, and it removes full-screen iframes without the size guard.

Good for

  • Seeing ad detection done by meaning rather than by a filter list
  • A small, readable MV3 extension: no build step, no dependencies
  • Catching sponsored placements that lists miss, in languages lists ignore

Watch out for

  • The size and content guards are skipped for iframes, which it then removes
  • Default mode deletes elements at a 0.70 threshold, and mistakes are permanent
  • It runs on every page, and there is no per-page or per-day spend cap

Tested Sep 20, 2026 at 7e067d243d87 · Chromium in Docker running the unmodified content script against the project's own fixture page; no Jev calls

How we reviewed this: we ran the project’s unmodified content script inside headless Chromium against its own fixture page, with a stub for the extension APIs, and captured exactly what it would have sent. We made no Jev calls, and we did not load it into a real browser profile.

What it does

typesafe-adblock, by realZachi, is a Manifest V3 Chrome extension that finds candidate elements with ordinary heuristics — iframes, ins tags, ad-ish ids and classes, data-ad-* attributes, links to 34 known ad networks, “Sponsored”/“Anzeige”/“Werbung” labels — and then asks Jev one Noul per candidate:

Is the page element candidates[0] a paid advertisement or sponsored promotional placement? Judge it by its text, label, link targets, iframe source, attributes, and shape, in the context of page.

Up to 30 candidates go in one request. Above the threshold, the element is hidden or removed.

On its own fixture — a German news page with eight ads — it produced one request with eight candidates, about 2.2 KB, and every ad was in it. The comment section, the newsletter box, the cookie banner, the related-articles block, the header and the weather widget were not sent: the local heuristics filtered them out first. That is the design working.

The iframe hole

The guard that stops it touching page furniture is this:

if (el.tagName !== "IFRAME") {
  if (area(el) > viewportArea() * 0.5) return false;
  if ((el.textContent || "").length > 2000) return false;
  if (el.querySelector("main, h1")) return false;
}

All three checks — too big, too much text, contains the page’s main content — are skipped for iframes. The README says “anything too big (half the viewport, contains main or h1) is skipped”, which is true for everything except the element type most likely to be a large embedded thing: a video player, a map, an embedded document, a payment frame.

Combined with the defaults — mode remove, threshold 0.70 — a false positive on a full-screen iframe deletes it, and there’s a 2.5-second failsafe timer that removes the element even if the animation is interrupted. The README is upfront that “it will occasionally eat something that is not an ad” and that this is “not a real ad blocker”; the iframe exception is the part that isn’t in the README. We’ve reported it.

Two smaller things: when a request fails, the candidates in that batch have already been marked as judged, so they are never re-examined until you click “Rescan page”; and the criteria text — about a kilobyte — is repeated once per candidate, so a 30-candidate request is mostly 30 copies of the same paragraph.

What leaves your browser

Less than you’d fear, from more pages than you might expect.

  • Per batch: the page host and title, and per candidate its tag, id and class words, role, aria-label, shape, whether it matches a standard ad size, its label, its inner text truncated to 220 characters, link hosts, iframe host, and image alt text. The README’s “no page is sent in full” holds — our capture was 2.2 KB for a whole news page.
  • On every site. The content script matches http://*/* and https://*/*, so Chrome will warn that it can read and change your data on all sites. Any page with an ad-shaped element sends its host, title and those snippets — including your webmail, your intranet and your bank, if something on them looks like a candidate.
  • No spend cap. A request per new batch of candidates, refreshed as you scroll and as the DOM changes. Nothing limits calls per page, per session or per day.
  • The key lives in chrome.storage.sync, which means it syncs through your Google account to every Chrome you’re signed into. The README says “stored in your browser”, which is true but worth expanding.
  • Good boundaries elsewhere: the key stays in the service worker and is never exposed to page scripts, there are no web-accessible resources, and nothing lets a page talk to the extension.

Maintenance

One commit, created September 17, no open issues, MIT licensed — though the licence names a different person than the repository owner, which is worth a question before you fork it. There are no offline tests: the two test scripts need a real key, and the harness needs a browser. We wrote our own checks against its request builder, which behaved correctly, including refusing more than 30 candidates per request.

Verdict

The idea is genuinely good, and the implementation is smaller and more careful than it needed to be: local heuristics do the filtering, the model only judges, and the payload is a few kilobytes of labels rather than the page.

Treat it as the author does — “a fun project, not a real ad blocker”. Switch it to hide rather than remove, know that it runs everywhere and costs money per page, and be aware that a large iframe gets judged with the safety checks switched off.

For other browser work, see Unclutter, which learns hiding rules per page template instead. Our Best Jev Tools roundup compares what each tool sends.

See how it compares with other tools in Best Jev tools, tested hands-on.

Review updated Sep 20, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.

More in Apps & Browser Extensions

Jev Chat Assistant

★ 8.2k▲ 105

jev-chat/jev-chat-jarvis

Android chat assistant that reads the conversation on screen through the accessibility service, has Jev judge the other person's intent and the risk, and fills in a drafted reply that you send yourself. Chinese and English editions.

Kotlin

OpenMuse

★ 6.1k▲ 479

CopilotKit/openmuse

CopilotKit's self-hosted personal agent with its own browser, terminal and files; Jev decides whether a reply becomes a clarification panel, a comparison of options or plain prose, and overrides the agent only when confident. Alpha.

TypeScriptReviewed

Shapeshift

★ 1.1k▲ 16

anishfn/shapeshift

One text box that turns what you type into the right small interface, an event card or a checklist or a bill split, with Jev choosing which; falls back to rules when no key is set.

TypeScriptReviewed

Get new Jev projects every week

New Jev releases, pricing changes, and the best new projects, once a week. No spam; unsubscribe anytime.

Powered by Buttondown. See our privacy policy.