Vuosien juoksudata — kisat, ennätykset ja tulokset yhdellä sivulla.
Tämä sivu on täysin staattinen HTML-tiedosto, joka generoidaan öisin tietokannasta — käsin ylläpidettävää sisältöä ei ole.
Datakerros. Sivun data elää Neon Postgres -kannassa, joka on osa laajempaa henkilökohtaista datajärjestelmääni: samaan kantaan synkataan öisin koko Strava-historiani (activities-taulu) sekä Garminin hyvinvointidataa, ja sinne on viety myös labramittauksia — kehonkoostumustulokset (InBody) ja juoksumaton kuntotestit vuodesta 2016 alkaen. Tämä sivu käyttää kannasta kahta taulua: races (kategoria, virallinen chip-aika sekunneiksi johdettuna, koordinaatit, Strava-id) ja activities, josta kisariveille liitetään tarkat päivämäärät ja nousumetrit strava_id-liitoksella. Viralliset ajat ovat aina järjestäjän chip-aikoja, eivät GPS-kellon dataa.
Kirjaus. Uudet tulokset, tulevat kisat ja labramittaukset kirjataan kantaan Clauden ja Neon MCP -integraation kautta — luonnollisella kielellä, ilman SQL-käsityötä. Kun kisa on juostu, sanon tuloksen, ja INSERT tapahtuu oikeaan tauluun oikeilla johdannaisilla.
Build. GitHub Actions -workflow (cron 03:30 UTC + manuaalinen dispatch) ajaa Python-generaattorin, joka hakee rivit psycopg 3:lla, laskee ennätykset, PB-merkinnät ★, matkakertymät, paikkakoosteen ja kehityssarjat — sama kisa vähintään kolmesti juostuna muodostaa trendin, ja maantiematkoille lasketaan lisäksi ikävakioidut ajat (likimääräiset WMA-kertoimet, ikä kisapäivänä) — ja injektoi tuloksen JSON:ina HTML-templaattiin. Yksi ajo, yksi tiedosto.
Julkaisu. Valmis index.html työnnetään julkisen repon gh-pages-haaraan, jota GitHub Pages tarjoilee tässä osoitteessa (custom domain A-tietueilla, TLS Let's Encryptillä). Palvelinta tai tietokantayhteyttä ei sivulla ole — pelkkä nopea staattinen tiedosto.
Varmuuskopiot. Kanta dumpataan öisin (pg_dump, versiotunnistus palvelimelta) validoituna privaattiin repoon rotaatiolla: 7 päivittäistä, kuukausittainen ja vuosittainen. Kerran kuussa erillinen workflow palauttaa tuoreimman dumpin puhtaaseen Postgres-konttiin ja verifioi rivimäärät sekä sisällön — varmuuskopio jota ei koskaan palauteta on toivomus, ei vakuutus.
Frontend. Yksi HTML-tiedosto ilman frameworkkia. Maapallo on D3.js:n ortografinen projektio (world-atlas TopoJSON), joka pyörii animaatioloopissa ja tukee drag-rotaatiota sekä rulla-/nipistyszoomia. Kehityskäyrät ovat puhdasta käsin generoitua SVG:tä ilman kirjastoriippuvuuksia — absoluuttinen aika yhtenäisenä viivana, ikävakioitu katkoviivana samassa kuvaajassa. Laskuri seuraavaan kisaan ja ikä lasketaan selaimessa, joten ne pysyvät ajan tasalla buildien välilläkin.
Koodi on rakennettu tekoälyavusteisesti (Claude & ChatGPT) — arkkitehtuurista SQL:ään ja D3-koodiin.
Kun kisa on juostu, tulos kirjataan kantaan — aamulla sivu on ajan tasalla.