React + FastAPI app for an upload-first fact-checking workflow:
- Upload a screenshot, audio/video clip, or social media link.
- Extract visible text or transcribe spoken content.
- Analyze bait-like or misleading framing.
- Compare against broader reporting.
- Return a neutral summary.
backend/
api/ FastAPI routes
core/ Settings and app config
schemas/ Request and response models
services/ OCR, transcription, framing, search, summarization pipeline
scripts/ Smoke tests for live backend services
tests/ Basic API tests
frontend/
src/api/ Backend client helpers
src/components/ UI building blocks
cd backend
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
python -m uvicorn main:app --reloadcd backend
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
uvicorn main:app --reloadFor video uploads, install the ffmpeg system binary and make sure it is on PATH.
Ubuntu / WSL:
sudo apt update
sudo apt install ffmpegRequired environment variables in the repo-root .env:
GEMINI_API_KEY=
TAVILY_API_KEY=
FRONTEND_ORIGIN=http://localhost:5173Current backend inputs:
- screenshot/image upload
- audio upload
- video upload
- social media link
The /api/analyze route routes images through OCR, audio/video through transcription, and links through Tavily extraction before running the shared framing/search/summary pipeline.
Run these from backend/ after activating the virtualenv:
python scripts/ocr_smoke_test.py
python scripts/analyzer_smoke_test.py
python scripts/search_smoke_test.py
python scripts/summary_smoke_test.py
python scripts/media_smoke_test.py /absolute/path/to/clip.mp3 or clip.mp4cd frontend
npm install
npm run devVite proxies /api requests to http://localhost:8000.
From backend/:
python -m pytest