Skip to content

Doppelcheck/main

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

243 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

DoppelCheck

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. See REVISION.md for the design rationale.

Install

DoppelCheck targets Chromium browsers (Chrome, Edge, Brave, Arc, Opera) on Windows / macOS / Linux / ChromeOS, plus Firefox 128+.

From source (until the Web Store listing is published)

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.

Configure

Open the extension's options page (right-click the toolbar icon β†’ "Options", or click the gear inside the side panel). At minimum you need:

  1. A Brave Search API key. Free tier gives ~1k queries/month β€” enough for personal use. Get one at api-dashboard.search.brave.com.
  2. 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-20251001 at $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:

  1. 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.
  2. 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.

Use

  1. Open the article you want to scrutinise.
  2. Click the DoppelCheck icon. The side panel opens.
  3. Click Analyze page. Within a few seconds the panel lists the strongest factual claims in the article, in the article's language.
  4. 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).
  5. Click any quote to follow through to the source.

What you give up vs. the legacy version

  • 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-server and 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.

What's improved

  • 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 /proxy workaround β€” 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.

Project layout

.
β”œβ”€β”€ 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

Develop

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 Store

License

MIT for the code. IBM Plex fonts (used in the UI styling) are SIL Open Font License 1.1.

Acknowledgements

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.

About

Automatized research at the touch of a button πŸ‘†

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors