{"slug": "show-hn-sniffslop-browser-extension-to-classify-text-using-jev", "title": "Show HN: Sniffslop – browser extension to classify text using Jev", "summary": "A developer released Sniffslop, a free browser extension for Chrome and Firefox that classifies hovered text blocks of 25 or more words using the Jev API from TypeSafe, defaulting to a single score question asking \"How likely is this text AI slop\" with levels Likely human, 50/50 slop, and AI Slop. The extension requires a user-supplied Jev API key, stores it in storage.local without browser sync, sends requests only to api.typesafe.ai, and caches results per page by text hash; users can configure any number of score, choice, or noul questions, which are scored in a single request per hover. The tool ships as plain JavaScript with no build step, loaded unpacked in Chrome or as a temporary add-on in Firefox, and the author states no telemetry or analytics are collected.", "body_md": "Hover a paragraph, find out how likely it is written by AI, or define whatever questions you want to ask with\n[Jev](https://docs.typesafe.ai/).\n\n## demo.webm\n\nNo build step — it's plain JS, load the folder as-is.\n\n**Chrome**\n\n1. Go to `chrome://extensions`\n2. Turn on **Developer mode** (top right)\n3. **Load unpacked** → pick this folder\n\n**Firefox**\n\n1. Go to `about:debugging#/runtime/this-firefox`\n2. **Load Temporary Add-on…** → pick`manifest.json` inside this folder\n\nTemporary add-ons are cleared when Firefox restarts; a permanent install needs a signed build.\n\nObtain your Jev API key at [typesafe console](https://console.typesafe.ai/keys).\nPaste your API key into the extension by clicking the extension toolbar icon and hit **Save**.\nUse it at your own risk.\n\nThe key is stored with `storage.local`, which keeps it on this machine and this\nbrowser profile — it is not browser-synced, so it does not travel to your other\ndevices. Nothing is collected by me, no telemetry, no analytics, and no\nserver belonging to this extension. The only host it can reach at all is\n`api.typesafe.ai`, because that is the sole entry in `host_permissions`; any\nrequest anywhere else would be blocked by the browser.\n\nThe key is read only by the background script, which attaches it as a\n`Authorization: Bearer` header on calls to TypeSafe. The content script running\ninside web pages never sees it — it hands text to the background script and gets\nan answer back, so page JavaScript has no path to it.\n\n1. \nAdd your API key as above.\n2. \nPress the shortcut (default `Cmd+Shift+X` /`Ctrl+Shift+X` ) to arm sniff mode on a page.\n3. \nHover any block of text with 25+ words. It outlines grey while the request is in flight, then turns green → amber → red and shows a card with one section per configured question. The outline colour comes from the first question that maps onto a scale — a `score` (position across its levels) or a`noul` (its probability). Choice\nanswers have no inherent ordering, so if every question is a`choice` the\noutline stays neutral blue and the card carries the detail.**Hue is the answer, saturation is the certainty.** An uncertain answer looks\nwashed out instead of confidently green or red. Confidence gets no row of its\nown: it is computed from the probability distribution the card already draws,\nso showing it would restate the bars. Nouls have no confidence field, so\ncertainty is derived from the distance to 0.5.\n4. \nShortcut again or `Esc` to disarm.\n\nResults are cached per page by text hash, so re-hovering a block you already scored is instant and costs nothing until you reload. Saving anything in the popup clears that cache — answers are only valid for the settings that produced them — and immediately re-scores whatever is under the cursor.\n\n- \n**Questions** — any number, all three primitives. Every hover sends them in a\nsingle request: the API scores each question independently against the same\ndocument, and the document is only transmitted once, so N questions cost far\nless than N calls.type criteria answer `score` ordered array, low → high, 2–10 levels `score` (weighted position across levels) +`confidence` +`probabilities`` choice`object of `option_name` → description`choice` +`confidence` +`probabilities`` noul`optional `true` /`false` descriptions`noul` , a single 0–1 probability of yesThe default is one `score` question:`How likely is this text AI slop` , with\nlevels`Likely human` /`50/50 slop` /`AI Slop` . A score of 1.43 there means\n\"leaning slop\".\n- \n**Minimum words per block** — default 25, raise it to ignore short blurbs.\n- \n**Shortcut** — on Firefox,**Change** records a new binding directly in the\npopup (`commands.update()` ). Chrome has no equivalent API, so there the button\nopens`chrome://extensions/shortcuts` instead. Either way the browser can\nrefuse a combination it reserves for itself.\n\nSlop detection is just the default. The question is whatever you want to ask\nof a paragraph, and you can stack several — they cost one request between\nthem. Open the popup, hit **+ Add question**, pick a type, and write the\ninstructions.\n\nPick the type by the shape of the answer you want:\n\n- **`noul`** for a yes/no —*\"Does this cite a source?\"* ,*\"Is this a sales\npitch?\"* . You get one number: the probability of yes. Criteria are optional;\nadd them when \"yes\" needs pinning down.\n- **`score`** for a spectrum —*\"How technical is this?\"* with levels` Layperson` →`Practitioner` →`Specialist` . Write the levels in order, low\nto high. The answer is a weighted position across them, so it lands between\nlevels rather than snapping to one.\n- **`choice`** for named buckets with no ordering —*\"What is this paragraph\ndoing?\"* with options`argument` ,`evidence` ,`anecdote` ,`filler` . Give\neach option a description saying when to pick it; that description does most\nof the work.\n\nA few things that make answers better:\n\n- **Describe the levels, don't just name them.**`Broken, but a workaround exists` beats`Medium` . The model reads the descriptions.\n- **Order matters for `score`, not for `choice`.** Score levels must run low\nto high; choice options are unordered, which is why a choice answer leaves\nthe outline neutral.\n- **Ask one thing per question.** A level that mixes two dimensions produces a\nflat distribution — the answer washes out, which shows up as a desaturated\noutline.\n- **The question id is the key in the API request** , so it gets slugified on\nsave:`Is it technical?` becomes`is_it_technical` .\n\nChanging a question's type converts its criteria to the new shape, because sending an array where the API expects an object is a 422.", "url": "https://wpnews.pro/news/show-hn-sniffslop-browser-extension-to-classify-text-using-jev", "canonical_source": "https://github.com/kmcheung12/sniffslop/", "published_at": "2026-09-23 10:32:14+00:00", "updated_at": "2026-09-23 10:59:37.713342+00:00", "lang": "en", "topics": ["ai-tools", "generative-ai", "ai-products"], "entities": ["Sniffslop", "Jev", "TypeSafe", "Chrome", "Firefox"], "alternates": {"html": "https://wpnews.pro/news/show-hn-sniffslop-browser-extension-to-classify-text-using-jev", "markdown": "https://wpnews.pro/news/show-hn-sniffslop-browser-extension-to-classify-text-using-jev.md", "text": "https://wpnews.pro/news/show-hn-sniffslop-browser-extension-to-classify-text-using-jev.txt", "jsonld": "https://wpnews.pro/news/show-hn-sniffslop-browser-extension-to-classify-text-using-jev.jsonld"}}