Real-time news verification dashboard that scores breaking news by trustworthiness.
VerifyPulse aggregates news from multiple independent sources, clusters related stories, and calculates a confidence score based on how many credible outlets corroborate each claim. Instead of telling you what's true, it shows you the evidence — so you can decide.
Built as a solo founder prototype in 7 days. 100% free tech stack.
RSS Feeds (Reuters, AP, BBC, Al Jazeera, NDTV)
+ GDELT Global News Database
│
▼
┌─────────────────┐
│ DATA PIPELINE │ Fetches every 15 min, deduplicates
└────────┬────────┘
▼
┌─────────────────┐
│ CLUSTERING │ MiniLM embeddings + cosine similarity
│ ENGINE │ groups related articles into clusters
└────────┬────────┘
▼
┌─────────────────┐
│ CONFIDENCE │ 3-factor scoring: source count,
│ SCORER │ credibility, source diversity
└────────┬────────┘
▼
┌─────────────────┐
│ REST API │ FastAPI with auto-generated docs
│ (FastAPI) │ at /docs
└────────┬────────┘
▼
┌─────────────────┐
│ DASHBOARD │ Live feed with confidence badges,
│ (HTML/JS) │ filters, and "Why we trust this"
└─────────────────┘
Each story is scored on three factors:
| Factor | Weight | What It Measures |
|---|---|---|
| Source Count | 0-40 pts | How many independent sources report the story |
| Source Credibility | 0-35 pts | Average credibility of reporting sources |
| Source Diversity | 0-25 pts | Variety of source types (wire service, broadcaster, national) |
The combined score maps to a confidence label:
| Score | Label | Meaning |
|---|---|---|
| 80-100 | Verified | Multiple independent credible sources confirm |
| 60-79 | Likely Accurate | Strong sourcing, not fully independently confirmed |
| 40-59 | Developing | Some corroboration, story still evolving |
| 20-39 | Unverified | Limited sources, insufficient evidence |
| 0-19 | Disputed | Single source or contradictory reports |
| Layer | Technology | Cost |
|---|---|---|
| Backend | Python 3.10+ + FastAPI | Free |
| Database | SQLite (WAL mode) | Free |
| NLP | sentence-transformers (MiniLM) | Free |
| Data Sources | RSS feeds + GDELT API | Free |
| Frontend | Vanilla HTML/CSS/JS | Free |
| Fonts | DM Sans + IBM Plex Mono | Free |
Total cost: $0/month
- Python 3.10+
- pip
cd backend
python -m venv venv
# Windows
venv\Scripts\activate
# macOS / Linux
source venv/bin/activate
pip install -r requirements.txt
python -m uvicorn app.main:app --reloadThe API starts at http://localhost:8000 with auto-generated docs at http://localhost:8000/docs.
On first run, it downloads the MiniLM embedding model (~90 MB), creates a SQLite database, and begins fetching news automatically every 15 minutes.
Windows users: if you see a UnicodeEncodeError on startup, run with set PYTHONUTF8=1 before the uvicorn command, or just use start.bat which handles this automatically.
# From the project root, just double-click:
start.bat
This creates the venv and installs dependencies automatically on first run.
# Just open the file in your browser
open frontend/index.html # macOS
start frontend/index.html # WindowsThe dashboard connects to localhost:8000 and displays stories with confidence scores.
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/stories |
Clustered stories with confidence scores |
| GET | /api/stories/{id} |
Story detail with full scoring breakdown |
| GET | /api/confidence-levels |
Confidence level definitions |
| POST | /api/fetch |
Manually trigger news fetch |
| GET | /api/articles |
Raw articles with filters |
| GET | /api/sources |
Source credibility table |
| GET | /api/stats |
System overview |
Full documentation: docs/API.md
verifypulse/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI app + lifecycle
│ │ ├── config.py # Sources, regions, settings
│ │ ├── models/ # Pydantic data models
│ │ ├── routers/
│ │ │ ├── stories.py # /api/stories endpoints
│ │ │ └── data.py # /api/articles, sources, stats
│ │ └── services/
│ │ ├── rss_fetcher.py # RSS feed parser
│ │ ├── gdelt_client.py # GDELT API client
│ │ ├── database.py # SQLite operations
│ │ ├── dedup.py # Title similarity dedup
│ │ ├── clustering.py # TF-IDF story clustering
│ │ ├── confidence.py # 3-factor confidence scoring
│ │ └── scheduler.py # Auto-fetch every 15 min
│ ├── tests/
│ │ └── test_clustering.py # Unit tests
│ └── requirements.txt
├── frontend/
│ └── index.html # Dashboard (single file, no build)
├── docs/
│ └── API.md # API documentation
├── Dockerfile
└── README.md
- LLM-powered claim extraction (Claude API)
- Multilingual support (Hindi + more via XLM-RoBERTa)
- Semantic clustering with sentence-transformers
- Story timeline tracking (how stories evolve over time)
- Daily misinformation report generator
- Deepfake/image manipulation detection
- Browser extension for inline verification
| Day | What Was Built | Commits |
|---|---|---|
| 1 | Project setup, RSS parser, GDELT client | 4 |
| 2 | SQLite database, deduplication, auto-scheduler | 4 |
| 3 | TF-IDF clustering, confidence scoring, tests | 4 |
| 4 | API routers, documentation | 3 |
| 5 | Frontend dashboard with live feed | 1 |
| 6 | Source timeline, score ring, summary bar | 2 |
| 7 | README, Dockerfile, final polish | 2 |
MIT
Solo founder prototype — built to demonstrate that news verification can be automated, transparent, and free.