A fact-checking platform for football transfer rumours that tracks journalists' claims and scores them on truthfulness and speed.
Veracity helps football fans determine which journalists are most reliable when it comes to transfer news. The platform:
- Tracks claims made by journalists about player transfers
- Validates claims when transfers are confirmed or denied
- Scores journalists on two axes:
- Truthfulness: Percentage of claims that proved true
- Speed: Percentage of times they were first to break a story
- Django 5.0: Web framework
- Django REST Framework: API
- PostgreSQL: Database
- Python 3.10+
- React 18: UI framework
- Vite: Build tool
- TanStack Query: Data fetching
- Tailwind CSS: Styling
- Python 3.10 or higher
- PostgreSQL 14 or higher
- pip and virtualenv
-
Clone the repository (or navigate to the veracity directory)
cd veracity/backend -
Create a virtual environment
python3 -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate
-
Install dependencies
pip install -r requirements.txt
-
Set up environment variables
cp .env.example .env
Edit
.envand update the following:SECRET_KEY=your-secret-key-here DEBUG=True DB_NAME=veracity DB_USER=your-postgres-username DB_PASSWORD=your-postgres-password DB_HOST=localhost DB_PORT=5432 -
Create the PostgreSQL database
# Login to PostgreSQL psql -U postgres # Create database CREATE DATABASE veracity; # Exit PostgreSQL \q
-
Run migrations
python manage.py makemigrations python manage.py migrate
-
Create a superuser
python manage.py createsuperuser
-
Run the development server
python manage.py runserver
-
Access the application
- Admin panel: http://localhost:8000/admin
- API (coming soon): http://localhost:8000/api
- Log in to the Django admin at http://localhost:8000/admin
- Click on "Journalists" > "Add Journalist"
- Enter journalist details (name, publications, bio, etc.)
- Save
- In the admin panel, click on "Claims" > "Add Claim"
- Fill in the claim details:
- Journalist: Select the journalist who made the claim
- Claim Text: The actual statement made
- Claim Date: When the claim was made
- Publication: Where it was published
- Article URL: Link to the source
- Player Details: Player name, clubs, transfer fee
- Certainty Level: How confident was the journalist?
- Source Type: Original scoop or citing another source?
- Is First Claim: Was this journalist first to report?
- Save
- When a transfer is confirmed or denied, edit the claim
- Update the Validation Status:
- Confirmed True: The transfer happened as claimed
- Proven False: The transfer didn't happen
- Partially True: Some details were correct
- Add Validation Notes and Validation Source URL
- Save - scores will update automatically!
truthfulness_score = (confirmed_true_claims / total_validated_claims) * 100
Example: If a journalist made 100 claims, 80 have been validated, and 65 were true:
- Truthfulness Score = (65 / 80) * 100 = 81.25%
speed_score = (first_claims / total_original_scoops) * 100
Example: If a journalist had 50 original scoops and was first to report 30 times:
- Speed Score = (30 / 50) * 100 = 60%
Scores are automatically recalculated when:
- A claim's validation status changes
- A claim's
is_first_claimstatus changes
veracity/
├── backend/
│ ├── manage.py
│ ├── requirements.txt
│ ├── config/
│ │ ├── settings/
│ │ │ ├── base.py
│ │ │ ├── development.py
│ │ │ └── production.py
│ │ ├── urls.py
│ │ ├── wsgi.py
│ │ └── asgi.py
│ └── apps/
│ └── claims/
│ ├── models.py # Database models
│ ├── admin.py # Admin interface
│ ├── signals.py # Auto-score updates
│ ├── services/
│ │ └── scoring.py # Scoring algorithms
│ └── migrations/
└── frontend/ (Coming soon)
- Basic info (name, publications, bio)
- Cached scores (truthfulness, speed)
- Auto-generated slug for URLs
- Journalist who made the claim
- Claim details (text, date, publication, URL)
- Transfer details (player, clubs, fee)
- Claim characteristics (certainty level, source type)
- Validation info (status, date, notes, proof URL)
- Speed tracking (is_first_claim)
- Historical record of journalist scores
- Tracks score changes over time
- Used for analytics and charts
- Groups claims about the same transfer
- Tracks transfer outcome
- Identifies first journalist to report
- Phase 1: Backend Foundation
- Django project structure
- Database models
- Scoring algorithms
- Admin interface
- Auto-updating signals
- Phase 2: REST API
- Phase 3: Frontend Setup
- Phase 4: UI Components
- Phase 5: Pages
- Phase 6: Polish & Testing
- Test the admin interface by adding sample journalists and claims
- Implement REST API (Phase 2)
- Build React frontend (Phases 3-5)
- Add web scraping for automation (Future)
This project is for personal use.
Julian Smilg - juliansmilg@gmail.com