A full-stack news aggregation platform that blends curated RSS feeds with AI-assisted research, analysis, and fact-checking. The project consists of a FastAPI backend and a Next.js frontend, with PostgreSQL and ChromaDB for storage and semantic search.
- Backend: FastAPI (Python 3.11+),
backend/app/main.py - Frontend: Next.js 15 (TypeScript, Tailwind CSS, shadcn/ui)
- Database: PostgreSQL 17 + ChromaDB for vector storage
- State: Zustand for client state, React Query for server state
- AI: OpenRouter or direct Gemini via LangChain
./runlocal.sh or docker-compose up -dFrontend: http://localhost:3000
Backend docs: http://localhost:8000/docs
Create backend/.env from .env.example:
OPEN_ROUTER_API_KEY=your_key_here
GEMINI_API_KEY=your_key_hereRestart the backend after updating keys.
Full-text extraction via newspaper3k, source credibility scoring, bias detection, reporter profiling, and fact-check suggestions.
ChromaDB embeddings with HDBSCAN clustering surface trending topics. The /trending/clusters endpoint returns semantically grouped articles with velocity scoring.
- News Research: searches cached articles first, then falls back to web search with chain-of-thought visualization
- Entity Research: reporter profiles and organization research via Wikipedia integration
- Verification: fact-check claims with streaming evidence
- Semantic search via ChromaDB embeddings
- BM25 lexical fallback
- Hybrid search combining both
- 94-country RSS catalog with ownership, funding type, and bias ratings
- GDELT global event integration
- Wikipedia-sourced source and reporter dossiers
| Method | Endpoint | Description |
|---|---|---|
| GET | /news |
Paginated news feed |
| GET | /trending/clusters |
Topic clusters with articles |
| GET | /news/country/{code} |
Local lens for a country |
| POST | /api/search/semantic |
Vector similarity search |
| POST | /api/research |
AI research agent |
| POST | /api/verification/verify |
Fact-check claims |
| GET | /wiki/source/{id} |
Source credibility profile |
| GET | /ws |
Real-time updates |
backend/
├── app/
│ ├── main.py # FastAPI entry point
│ ├── api/routes/ # REST endpoints
│ ├── services/ # Business logic
│ └── data/rss_sources.json # 1972 curated feeds
frontend/
├── app/ # Next.js 15 pages
├── components/ # UI components
└── lib/ # API client
docker-compose.yml
rm -rf .chroma
docker-compose restartEnsure .env exists in backend/ and restart the backend.
Run the full verification suite:
./verify.shFrontend type check:
npx tsc --noEmitBackend linting:
uvx ruff check backend/docs/Todo.mdfor roadmap and task trackingdocs/Log.mdfor change history