Fantasy Voley
A fantasy manager for Spanish volleyball, scored from real league statistics.
- Role
- Sole engineer — data ingestion, API, front end
- Stack
- Python PostgreSQL Neon Railway Vue
Problem
Spanish volleyball has a devoted following and no fantasy league. The federation publishes squads, fixtures and per-match statistics through a legacy ASP.NET portal with no API, team identifiers that change between seasons, and markup that shifts without warning.
Approach
An ingestion layer that treats the federation portal as a hostile data source. Player identifiers are stable, so they carry the joins; team identifiers are not, so they are resolved per season. Scraping runs on a schedule, writes to staging, and only promotes a season once the row counts look plausible — a silent markup change degrades to "no update" instead of "everyone's squad is empty". On top of that sits the scoring engine that turns real match statistics into fantasy points.
Outcome
A working league built end to end — ingestion, scoring engine and front end — kept in sync automatically through the season, on a data model that survived a federation site redesign without a rewrite. Public launch is next.
Scoring is a product decision, not a formula
Turning per-match statistics into fantasy points is where the game lives. Too literal and the best player always wins; too clever and nobody can predict their own score. Getting that balance right took more iterations than any part of the codebase.