Skip to content
← All work

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.