A critical-thinking sidekick for the open web. DoppelCheck reads the article you're on, isolates the most load-bearing factual claims, then β claim by claim β checks them against existing fact-check databases and independent sources, and shows where they agree, where they disagree, and what the disagreement actually says.
It's a browser extension. There is no server, no Docker, no Ollama, nothing to install on your machine beyond the extension itself. Page content stays on-device by default.
Note: v1.0 is a complete rewrite of DoppelCheck on a modern stack. The original Python + FastAPI + Ollama + bookmarklet implementation is preserved in
legacy/and remains runnable. SeeREVISION.mdfor the design rationale.
DoppelCheck targets Chromium browsers (Chrome, Edge, Brave, Arc, Opera) on Windows / macOS / Linux / ChromeOS, plus Firefox 128+.
git clone https://github.com/Doppelcheck/main doppelcheck
cd doppelcheck
npm install
npm run build # produces .output/chrome-mv3/
# or: npm run build:firefox β .output/firefox-mv2/Then in the browser:
- Chrome / Edge / Brave: open
chrome://extensions, enable "Developer mode", click "Load unpacked", point at.output/chrome-mv3/. - Firefox: open
about:debugging#/runtime/this-firefox, "Load Temporary Add-on", point at.output/firefox-mv2/manifest.json.
The DoppelCheck icon now sits in the toolbar. Clicking it opens the side panel.
Open the extension's options page (right-click the toolbar icon β "Options", or click the gear inside the side panel). At minimum you need:
- A Brave Search API key. Free tier gives ~1k queries/month β enough for personal use. Get one at api-dashboard.search.brave.com.
- A language model. Pick one of:
- Browser built-in (default). Free, on-device, private. Uses Chrome's Gemini Nano via the Prompt API. Requires Chrome 138+ on a supported OS; the model downloads on first use and the options page shows status. Not available on Firefox.
- Cloud API. Bring an API key for Anthropic Claude (best price/perf for this workload is
claude-haiku-4-5-20251001at $1/$5 per million tokens), OpenAI, or Google Gemini. Streaming, schema-aware where the API supports it. Keys go directly to the provider β DoppelCheck never proxies them. - Local server. Point DoppelCheck at any HTTP-reachable LLM running on your own machine. Two protocols are supported: Ollama (native API with schema-constrained generation) and OpenAI-compatible (LM Studio, llama.cpp server, vLLM, β¦). The easiest path is the companion doppelcheck/gemma-server β a one-shot installer that runs Gemma 4 locally and exposes it as an Ollama server on
localhost:11434; the options page has a one-click "Use gemma-server" preset.
Optional but recommended:
- A Google Fact Check Tools API key. Free. Surfaces existing fact-checks from publishers like Snopes, PolitiFact, Correctiv, dpa-Faktencheck before DoppelCheck spends LLM calls on the open web. Enable the API at developers.google.com/fact-check/tools/api.
- Trusted sources. Add publication domains you already trust β Brave will run a site-restricted search against each of them in addition to the general web.
Settings sync across your browsers via chrome.storage.sync. Keys never leave your device except to the API they belong to.
- Open the article you want to scrutinise.
- Click the DoppelCheck icon. The side panel opens.
- Click Analyze page. Within a few seconds the panel lists the strongest factual claims in the article, in the article's language.
- Click Verify on any claim. DoppelCheck:
- queries Google Fact Check Tools for an existing review of that claim,
- generates a search query and runs it against Brave Search (general + your trusted domains),
- fetches each candidate source and asks the LLM whether it agrees, disagrees, or is unrelated, with a verbatim evidence quote,
- highlights the claim and the evidence directly on the page (using the CSS Custom Highlight API β no DOM mutation).
- Click any quote to follow through to the source.
- No fully offline default. The legacy version ran a local Ollama LLM by default, which let it work air-gapped at the cost of a multi-gigabyte install. The default tier here uses Chrome's on-device Gemini Nano (provided by Google but running locally without network calls). If you specifically need third-party-free local inference, install the companion
doppelcheck/gemma-serverand pick it from the Local server tier β same air-gapped guarantee as the legacy Ollama setup, with a one-shot installer instead of Docker. - Mobile is out of scope. Chrome's built-in AI doesn't ship on Android/iOS yet; mobile would need a different host.
- One-click install instead of Docker + bookmarklet drag.
- ~500 KB total extension size vs. ~10 GB Docker image.
- Persistent UI in the browser's side panel β no more sidebar getting re-injected on every click.
- No CSP
/proxyworkaround β content scripts have access by default. - Single TypeScript codebase, cross-browser, fully typed.
- Direct Google Fact Check Tools integration: catches already-fact-checked claims for free before any LLM call.
- Streaming claim extraction β claims appear in the panel as the model produces them.
.
βββ entrypoints/ extension surfaces
β βββ background.ts service worker β orchestrates extract/verify
β βββ content.ts content script β Defuddle + CSS Highlights
β βββ sidepanel/ React UI shown in the browser side panel
β βββ options/ React UI for the settings page
βββ lib/ domain logic, all browser-side
β βββ llm/ tiered LLM router (chrome-builtin, anthropic, openai, google, ollama, openai-compatible)
β βββ search/ Brave Search + Google Fact Check clients
β βββ extract/ Defuddle wrapper + CSS Custom Highlight API
β βββ messaging/ typed port-based comms (panel β background)
β βββ storage.ts chrome.storage.sync wrapper for Settings
β βββ fetch-source.ts service-worker side fetch + cheap HTML strip
β βββ json.ts LLM-output JSON tolerant parser + array streamer
βββ components/ (room for shared React components)
βββ assets/globals.css Tailwind + CSS Custom Highlight API styles
βββ public/ static assets copied to the extension root
βββ wxt.config.ts WXT build config (Chrome MV3 + Firefox MV2)
βββ legacy/ the previous Python + bookmarklet implementation
npm run dev # WXT dev server, auto-reloads on save (Chrome)
npm run dev:firefox # same, Firefox profile
npm run compile # tsc --noEmit
npm run zip # produce a .zip ready for the Chrome Web StoreMIT for the code. IBM Plex fonts (used in the UI styling) are SIL Open Font License 1.1.
DoppelCheck began as a project by Mark Wernsdorfer with funding from WPK-Innovationsfonds and Media Lab Bayern, aimed at promoting critical evaluation of online information.