TruthLens 🔍
Real-time political speech fact-checker that tells you what it means for you
Inspiration
Dario Amodei's essay Machines of Loving Grace opens with a provocative question: what happens when AI can compress decades of human progress into years? We asked ourselves a narrower version of that question tonight:
What if AI could compress the gap between a politician speaking and a citizen understanding — in real time?
Democracy has an information problem. Not a shortage of information — an accessibility problem. Political speeches are designed to persuade, not inform. Fact-checkers exist, but they publish hours or days later. By then, the damage is done.
We were also thinking about something more personal. Every person in this room has sat through a speech, a town hall, a debate — and felt that nagging feeling: "Is that actually true? And does it affect me?"
Nobody builds tools for that person. Harvey builds for lawyers. PolitiFact builds for journalists. We built TruthLens for everyone else.
What It Does
TruthLens listens to a live political speech through your browser microphone. As the speaker talks, it:
- Transcribes speech in real time using the browser-native Web Speech API
- Detects claims — factual assertions, statistics, policy proposals
- Classifies each claim into one of 6 categories:
- ✅ Verified — supported by evidence
- 🔴 False — contradicted by evidence
- ⚠️ Misleading — technically true but deceptive in context
- 🟡 Unverifiable — cannot be confirmed or denied
- 🔵 Policy — a proposal, not a fact claim
- 🔵 Disputed — genuine expert disagreement exists
- Personalizes the impact — explains what each claim means for your specific situation (student, renter, employee, income bracket)
- Shows missing context — what the speaker left out that you should know
The result appears as live cards on screen, one per claim, updating as the speech progresses.
How We Built It
The Reasoning Pipeline
The core insight is that this is not a retrieval problem — it's a reasoning problem.
A basic RAG system would embed a claim, retrieve similar text, and summarize. That gives you information. We wanted judgment.
Each claim goes through three independent reasoning steps:
Step 1 — Fact Check
$$\text{verdict} = f(\text{claim}, \text{live_web_sources})$$
Claude uses web search to find current sources, then reasons about whether the claim is supported, contradicted, or unverifiable. Critically, it distinguishes between technically true and contextually honest — the source of most political misleading.
Step 2 — Personal Impact
$$\text{impact} = g(\text{claim}, \text{user_profile})$$
Given a user profile (role, location, income bracket), Claude reasons about the specific downstream effect on that person. A tax cut claim means something different for a UMD student on financial aid vs. a small business owner.
Step 3 — Missing Context
$$\text{gap} = h(\text{claim}, \text{what_was_not_said})$$
This is the hardest step — identifying what wasn't said. We prompt Claude to reason adversarially: "What would a well-informed critic immediately point out?"
Tech Stack
- Frontend: React + Tailwind CSS
- Audio: Web Speech API (browser-native, no backend processing)
- AI: Claude Sonnet with web search tool enabled
- Backend: Python Flask (transcript session management)
- No database — fully stateless for demo
Challenges We Faced
1. Latency vs. Accuracy Tradeoff
Real-time speech moves at ~130 words per minute. Our pipeline takes 3–6 seconds per claim. We solved this with async card loading — cards appear immediately with a "Analyzing..." state, then populate as each agent resolves. The user sees something instantly, even if the verdict takes a moment.
2. "Just Use Claude.ai"
Every judge will ask this. Our answer: Claude.ai gives you information. TruthLens gives you personalized consequence + judgment + action — structured through a multi-agent pipeline that no single prompt can replicate. The interface is the product.
3. Claim Detection Noise
Not every sentence in a speech is a checkable claim. "God bless America" is not a fact. We built a claim classifier that filters for:
- Quantitative assertions (numbers, percentages)
- Causal claims ("X caused Y")
- Comparative claims ("more than," "less than")
- Explicit policy proposals
Vague rhetoric gets filtered out. Only checkable claims generate cards.
4. Avoiding Political Bias
We deliberately don't fact-check opinions or values — only falsifiable claims. "We should invest more in education" is not a claim TruthLens analyzes. "Education spending is down 20%" is. This keeps the tool epistemically honest and politically neutral.
What We Learned
- The Web Speech API is criminally underused. Browser-native, zero latency, free — and almost nobody builds with it.
- Parallelizing Claude calls is the right architecture for real-time AI pipelines. Sequential calls would add 10+ seconds per claim.
- The interface is the moat, not the model. The hardest design problem wasn't AI — it was showing complex multi-dimensional information (verdict + source + impact + gap) in a card that someone can scan in 3 seconds.
- Scope ruthlessly. We started with "any speech, any country." We shipped with "US political speeches, Maryland focus." That's why it works.
What's Next
- Mobile app — most people watch speeches on their phones
- Browser extension — overlay cards directly on YouTube or C-SPAN
- Historical mode — analyze any transcript, not just live audio
- Multi-language support — democracy is global
- Outcome probability — "Based on similar Maryland cases, this policy affects ~$2,400/year for your income bracket"
Built With
claude-api react tailwind-css python flask web-speech-api
anthropic javascript websockets
*Built at the Claude × UMD Hackathon, April 24 2025.
Track: Governance & Accessibility.*
Built With
- claudecode
- flask
- groqapis


Log in or sign up for Devpost to join the conversation.