Inspiration

We read claims all day in Slack threads, LinkedIn posts, newsletters and screenshots of tweets. Checking even one means leaving the app, opening six tabs and reading for five minutes, so most of the time nobody checks. Fact-checking tools exist, but they live on a separate website or in a browser extension, far from where the claims actually are. We wanted fact-checking to cost one keystroke.

What it does

Proofmark is a macOS menu bar app.

  • Select text and press ⌥Space. Proofmark reads the selection from whichever app has focus, so it isn't tied to a browser or a single tool. A glass panel opens next to your cursor.
  • The claim gets highlighted in a marker colour for its verdict: green for true, yellow for misleading, pink for false, lavender for unverifiable. A ten-tick ruler shows the confidence.
  • Under the verdict: a short explanation of what is actually true, then the exact quotes that prove it, each linking to its source. For numbers and quotes, Proofmark also shows the earliest dated coverage it found.
  • ⌥⇧Space checks a region of the screen instead: tweets saved as images, slides, video frames. A Nemotron vision model reads the image first.
  • Every detail folds: verdict details, each source (with the passage Tavily found) and each report section are accordions.
  • Dig deeper. One click on any claim, or ⌃⌥Space on any selection, streams a cited research brief from Tavily. Nemotron adds a TL;DR and follow-up questions you can click to keep digging.
  • History. Every check and brief is saved on your Mac only, in a searchable window opened from the menu bar.
  • A live trace shows every Tavily call as it happens.

A web playground runs the same pipeline for people who don't use a Mac.

How we built it

Two pieces live in one repo, launched with a single ./run.sh:

A native Swift app: Carbon global hotkeys, the Accessibility API to read the selection (with a ⌘C fallback for apps that hide it), screencapture for region picking, and a non-activating NSPanel with SwiftUI and Liquid Glass.

A Python agent (FastAPI) that streams each step to the panel over server-sent events:

  1. Nemotron 3 Nano splits the text into checkable claims, and writes one query that would confirm each claim and one that would debunk it.
  2. Tavily /search runs both queries in parallel with search_depth=advanced, chunks_per_source, the right topic, and time_range for recent events.
  3. Sources are deduplicated and ranked, with official and fact-checking domains first. Video and social pages are dropped.
  4. Tavily /extract reads the top three sources in full. The best challenging source is always among them.
  5. Nemotron 3 Ultra judges from those sources only and must quote them verbatim.
  6. Plain code checks every quote against the extracted text. Invented quotes are dropped and the panel says so. A verdict with no verified quote can't go above 40% confidence.
  7. Tavily /search (news) on the exact phrase, sorted by publication date, finds the earliest coverage.

Nemotron 3.5 Super VL turns screenshots into text before the pipeline runs.

How we used Tavily

Tavily is the evidence layer, not one search pasted into a prompt:

  • Adversarial search. Two parallel searches per claim, one to confirm and one to debunk, so the judge also sees counter-evidence.
  • Extract as ground truth. /extract gives the full text that every quote is verified against.
  • Origin tracing. A news search plus published_date finds the earliest coverage.
  • Research, streamed. "Dig deeper" runs /research and streams its plan, queries, sources and report into the panel live, with citations linked to their sources.
  • Visible in the product. Every call, with its intent, query, result count and latency, appears live in the panel.

How we used NVIDIA Nemotron on Nebius Token Factory

Each step gets the right size of model, as the track suggests, through one OpenAI-compatible client:

  • Nemotron 3 Nano 30B: splits claims and writes queries (about 0.8s), then writes the research TL;DR and follow-up questions.
  • Nemotron 3.5 Super VL: turns a screenshot into text (about 2.4s in our test).
  • Nemotron 3 Ultra 550B: judges the evidence (about 2s in the full pipeline).

Token Factory made model routing a one-line change, so we measured the options instead of guessing. Turning reasoning traces off (enable_thinking: false) took Nano from 4.0s to 0.8s and Super from about 3s to about 1.6s on the same prompts. With traces off and JSON mode on, Ultra answered a short judging test in 1.2s, faster than Super with traces on (about 3s), so we gave the deciding step to the biggest model.

Challenges we ran into

  • Latency. Our first end-to-end run took 11.7s. We cut the model time from about 8s to about 3s by measuring each model with and without reasoning traces. What remains is mostly web search, and streaming makes it feel shorter: sources appear before the verdict.
  • Malformed JSON from the judge broke a check once. JSON mode fixed it, and now each claim fails on its own instead of taking the others down.
  • Confirm and debunk queries came back identical at first, which defeated the point. A prompt rule fixed it.
  • Model output is untrusted input. Nemotron sometimes invented a search topic like history, which Tavily rejects with a 400. Validating the value before the call fixed it, and we only found it by testing sentences on purpose.
  • Reading the selection. Some apps hide selected text from Accessibility, so Proofmark falls back to a simulated ⌘C and then restores your clipboard.

Accomplishments that we're proud of

  • Quotes you can trust. No quote reaches the screen unless it exists word for word in the source, and we watched the guard catch an invented one live.
  • It isn't tied to one app, and it works on images too.
  • A visual language people already know: the highlighter.

What we learned

  • Reasoning traces are not free. For structured judgement over evidence you already hold, a large model without traces was faster than a smaller model with them, and its verdicts held up on our test claims.
  • Searching for the opposing side matters as much as searching for more sources.

What's next

  • A hosted backend on Nebius Serverless Endpoints, so there are no keys to set up.
  • Team mode for Slack: one shortcut checks a message and replies with the cited verdict.

Built With

  • appkit
  • docker
  • fastapi
  • nebius-token-factory
  • nvidia-nemotron
  • python
  • server-sent-events
  • swift
  • swuftui
  • tavily
Share this project:

Updates

Submission history