Event
Hack NC State 2026
Timeline
24 hours
Tools
Next.js, SerpAPI, AWS Bedrock, Gemini
Team
Me, Sai Nelluri, Krish Kathpalia

Paper Trails

A checker for images, links, and claims that won’t hand back a bare score. It looks up where the thing has already appeared and what fact-checkers have said about it, keeps the dates, and only then lets a model write the verdict.

  • reverse image
  • fact-check records
  • dated timeline
  • second opinion

01 · Overview

A score is not a source

Most detectors hand back a probability and stop. The reader is asked to believe a percentage they cannot open. Paper Trails hands back a record instead: where an image has appeared, when, and which fact-checkers have already written about the claim riding on it.

Team Axiom built it in 24 hours for the Siren’s Call track, on misinformation and deceptive AI, which drew 43 submissions. The idea and product direction were mine, shaped by feedback from Sai Nelluri and Krish Kathpalia, and all three of us wrote the code. I built the first working pipeline, the image route from Google Lens to Bedrock, and the results dashboard it reported into.

02 · Provenance

Start with provenance

A photograph of a flood from 2014 is still that photograph when it shows up years later under a new caption. The first question is when the file entered the public web, and what story it was attached to then. Generation and context-swap are different failures, and a pixel score collapses them into one number.

Google LensGoogle's reverse image search. Its “About this image” view lists pages where an image has appeared, often with dates., queried through SerpAPIA paid API that returns Google results, including Google Lens, as structured JSON., supplies that history: the pages where an image appears, with dates. If it comes back empty, the result says “No digital footprint” and shows no timeline. Letting the model fill that gap would bring back the guessing the product exists to replace.

03 · Three inputs

Image, URL, or claim

All three routes end on the same board. Each one gathers dated evidence first, then hands it to a model.

Image

A public image URL goes straight to Lens. A pasted or uploaded file can’t, because Lens needs a URL it can fetch, so the app parks the file on Vercel BlobVercel's file storage. It gives an uploaded file a public URL that other services can fetch. for the length of the request and deletes it in a finally block.

URL

CheerioA Node.js library for parsing a page's HTML and pulling out its text. pulls the page’s title, description, body text, and images. Posts on X go through oEmbedA standard that lets sites like X return a post's text and metadata directly, without scraping the page. first. If the page carries an image, it gets a Lens pass too, so a tweet with a recycled photo is still traced. Web, news, and fact-check searches run alongside.

Claim

Plain text skips the scraping and goes straight to search: the Google Fact Check Tools APIGoogle's index of published fact-checks, with ratings from outlets like PolitiFact, Snopes, and AFP., the open web, news, and site-limited queries on PolitiFact, Snopes, FactCheck.org, and AFP.

04 · The split

Separate retrieval from reasoning

Claude Sonnet 4 on Amazon BedrockAmazon Bedrock, AWS's hosted service for running models from Anthropic and others. We used it to call Claude Sonnet 4. writes the board, but it only narrates. Its prompt tells it to judge the media rather than the user’s wording, and to build the timeline only from dates it was handed. It doesn’t get the last word: two later steps in the path below can overturn its verdict.

  1. IndexLens, web and news search, and fact-check sources. Every date on the timeline comes from here.
  2. NarrateOne Sonnet call per check writes the verdict, score, explanation, and timeline from that evidence.
  3. OverrideFor URLs and claims, if Sonnet says UNVERIFIED but a published rating exists, from the Fact Check API or a PolitiFact or Snopes result, the rating wins.
  4. AppealIf it is still UNVERIFIED, GeminiGoogle's model family. We used Gemini 1.5 Flash, a small, fast model. and BackboardAn API platform that serves models from several providers. We used it to reach OpenAI's GPT-4o-mini. each read a summary of the evidence. Only a firm TRUE or FALSE replaces the verdict; anything vaguer is ignored.
  5. FilterBefore the board renders, Gemini drops fact-checks about a different claim, so the cross-examination row stays on topic.

The split also kept us inside a limited pool of Bedrock credits. Each check makes exactly one Sonnet call, the one that reads all the evidence. The narrow jobs went to cheaper, faster models with answers capped at a few lines, and the second opinion only runs when Sonnet stays uncertain.

05 · The board

Make the evidence inspectable

Every check ends on the same screen. The timeline runs down one side, each node a dated appearance with a short note and a link, so you can see when an image or claim first showed up and how its story shifted after that. Beside it sit the verdict (TRUE, FALSE, or UNVERIFIED), a score, and a short explanation. Below are the sources the model actually used, with the fact-checkers split into their own row, which we called cross-examination.

The score is the weakest part of the board. It runs from 0 to 100 and leans toward false as it rises, but it blends how manipulated the media looks with how sure the model is, and when a rule sets the verdict instead of the model, the score is a fixed value. We kept it because people read it at a glance, but the timeline is the part we would point someone to.

At the demo, the board got the strongest reaction. People liked watching a narrative change over time instead of getting a bare score, and the PolitiFact and Snopes links made the verdict easy to check. The board also says plainly that a model wrote the explanation and can be wrong.

Satire identified through provenance, not a guess from the headline.
A confirmed report carries the same visible trail.
An AI-generated image, caught by its first appearances and a fact-check.
A medical claim with its supporting and fact-check sources kept separate.

06 · Limits

What we could not validate

The demo feedback was informal. We did not measure whether the board changed anyone's mind, compare it against a labeled set of claims, or test how well the source rules held up against stale, duplicated, or low-quality search results. Pulling in more sources did not, by itself, make a verdict right.

The demo runs above show where it slipped. The satire verdict was right, but one of its reasons was wrong: it called February 5, 2026 a future date, more than a week after it had passed. And in the medical-claim run, ten of the twelve cross-examination entries were PolitiFact pieces on other topics, so the relevance filter did not do its job.

The second opinion is the shakiest rule. Gemini and Backboard are never reconciled: if both give a firm answer, Backboard’s wins, even when they disagree. The image route has no override or second opinion at all, so an uncertain image stays UNVERIFIED.

Latency was the clearest tradeoff. A check waits on outside search and fact-check services, then on Sonnet, and uncertain cases wait on two more models. With more time, we would add per-stage progress, cache repeated queries, evaluate verdicts against a labeled set, and rank original reporting above duplicate search hits.

Optional services also fail open. Without a Gemini key there is no second opinion and no relevance filter, and without Blob, pasted images stop working while public image URLs still do. That kept the demo running, but a misconfigured deployment would skip those checks without telling anyone.

Hack NC State 2026 · Team Axiom