Skip to main content
HomeProjectsContextguard

ContextGuard — Credibility Checks Before You Click

Published Mar 21, 2026
Updated Jul 30, 2026
1 minutes read

The premise

Most fact-checking happens after you have already believed something. That is the whole problem. By the time a correction reaches you, you have read the claim, felt the thing the claim wanted you to feel, and possibly forwarded it.

So ContextGuard moves earlier — to the search results page, before the click. If the badge next to a link says this domain has a history, you never open the tab, and I never have to argue you out of a belief you already formed.

What it actually is

Three pieces, three repos.

Extension
  • WXT
  • Svelte
  • TypeScript
  • Vite
Backend
  • FastAPI
  • OpenAI API
  • crawler
Web
  • Next.js
  • forum + login flow

The extension does three jobs. content.ts injects verification badges straight into Google Search results. background.ts relays verification requests to the backend. popup/App.svelte renders the longer credibility review for the page you are currently on.

The backend exposes /crawl, /verify_content, and /domain_verify. Order matters: the extension crawls first, then verifies, and the injected search badge uses domain_verify on its own because it needs an answer at page-paint time, not after a full crawl.

The Next.js site is the forum. If something slips past the extension, there is a place to report it and a login flow that ties a report to a person, which is the cheapest anti-abuse mechanism I could build.

What I got wrong first

My first instinct was to verify everything on demand. Crawl the page, send it to a model, wait, render. It worked in dev with one tab open and fell over the moment I opened a normal search results page with ten links on it.

The fix was boring: cache by URL and selected language, so a result already reviewed in English is not re-reviewed for the same user, and let the badge render optimistically before the detailed review lands. Most of the perceived speed came from what I chose not to block on.

The other thing I got wrong was tone. Early builds showed a percentage. A number that says "78% credible" reads like a verdict, and when it is wrong, it is wrong loudly. Now the badge signals checked / has history / unknown, and the popup explains why. Unknown is an honest answer. I had to teach myself to ship it.

Where it sits now

Extension builds for Chrome, backend runs against the OpenAI API, forum handles reports and login. It shares DNA with SENTINEL — same worry, different surface. SENTINEL meets you in a chat; ContextGuard meets you in a search result.