2026W30

Rocheport Times 20–26 Jul 2026

Building the MR340 race tracker in seven days

Commits
374
In this project
Week 4 of 10
ISO week
2026-W30

374 commits to Rocheport Times from Mon 20 Jul to Sun 26 Jul 2026. The MR340 is a 340-mile canoe and kayak race down the Missouri River that passes Rocheport, and it started on 28 July. This week I built the paper’s own race tracker from nothing: a live leaderboard, a replay map of the 2024 field on a GPU-rendered vector basemap with 3D terrain, a cinematic follow camera, and a phone-first find-a-boat page. Alongside it, an SEO emergency (one page indexed and 198 dead URLs) got a code-owned redirects module.

  • Reverse-engineered the race’s public tracker feed and built a tracker module: leaderboard and checkpoint watch from a 3-minute server-side cache with stale fallback, pinned by 27 fixture checks.
  • Moved the replay map from Leaflet to MapLibre GL: vector basemap with no API key, optional 3D terrain and buildings, a satellite toggle, a cinematic tour that chases a chosen boat, and checkpoints placed at real ramp coordinates.
  • Rebuilt the 2024 field from 405 real GPS tracks, snapped to the official river-channel line from a 2012 survey, and lazy-loaded it so the page shrank from 1.45 MB to 360 KB.
  • Added live mode: a server-side proxy at a REST endpoint, a client engine that polls it, and a mobile /find page in three tiers that auto-throttles on slow connections.
  • Fixed the indexing emergency: a redirects module in code mapping 207 dead URLs (81 permanent redirects, 112 gone), no loops or chains, with a deploy guard that verifies them.
  • Stopped the deploy from shipping the staging site’s plugins over production’s, purged 1,760 stray macOS metadata files from the host, and published a DMARC record for the paper’s email.
Rocheport Times2023-W30 · 1 commits2023-W31 · no entry2023-W32 · no entry2023-W33 · no entry2023-W34 · no entry2023-W35 · no entry2023-W36 · no entry2023-W37 · no entry2023-W38 · no entry2023-W39 · no entry2023-W40 · no entry2023-W41 · no entry2023-W42 · no entry2023-W43 · no entry2023-W44 · no entry2023-W45 · no entry2023-W46 · no entry2023-W47 · no entry2023-W48 · no entry2023-W49 · no entry2023-W50 · no entry2023-W51 · no entry2023-W52 · no entry2024-W01 · no entry2024-W02 · no entry2024-W03 · no entry2024-W04 · no entry2024-W05 · no entry2024-W06 · no entry2024-W07 · no entry2024-W08 · no entry2024-W09 · no entry2024-W10 · no entry2024-W11 · no entry2024-W12 · no entry2024-W13 · no entry2024-W14 · no entry2024-W15 · no entry2024-W16 · no entry2024-W17 · no entry2024-W18 · no entry2024-W19 · no entry2024-W20 · no entry2024-W21 · no entry2024-W22 · no entry2024-W23 · no entry2024-W24 · no entry2024-W25 · no entry2024-W26 · no entry2024-W27 · no entry2024-W28 · no entry2024-W29 · no entry2024-W30 · no entry2024-W31 · no entry2024-W32 · no entry2024-W33 · no entry2024-W34 · no entry2024-W35 · no entry2024-W36 · no entry2024-W37 · no entry2024-W38 · no entry2024-W39 · no entry2024-W40 · no entry2024-W41 · no entry2024-W42 · no entry2024-W43 · no entry2024-W44 · no entry2024-W45 · no entry2024-W46 · no entry2024-W47 · no entry2024-W48 · no entry2024-W49 · no entry2024-W50 · no entry2024-W51 · no entry2024-W52 · no entry2025-W01 · no entry2025-W02 · no entry2025-W03 · no entry2025-W04 · no entry2025-W05 · no entry2025-W06 · no entry2025-W07 · no entry2025-W08 · no entry2025-W09 · no entry2025-W10 · no entry2025-W11 · no entry2025-W12 · no entry2025-W13 · no entry2025-W14 · no entry2025-W15 · no entry2025-W16 · no entry2025-W17 · no entry2025-W18 · no entry2025-W19 · no entry2025-W20 · no entry2025-W21 · no entry2025-W22 · no entry2025-W23 · no entry2025-W24 · no entry2025-W25 · no entry2025-W26 · no entry2025-W27 · no entry2025-W28 · no entry2025-W29 · no entry2025-W30 · no entry2025-W31 · no entry2025-W32 · no entry2025-W33 · no entry2025-W34 · no entry2025-W35 · no entry2025-W36 · no entry2025-W37 · no entry2025-W38 · no entry2025-W39 · no entry2025-W40 · no entry2025-W41 · no entry2025-W42 · no entry2025-W43 · no entry2025-W44 · no entry2025-W45 · no entry2025-W46 · no entry2025-W47 · no entry2025-W48 · no entry2025-W49 · no entry2025-W50 · no entry2025-W51 · no entry2025-W52 · no entry2026-W01 · no entry2026-W02 · no entry2026-W03 · no entry2026-W04 · no entry2026-W05 · no entry2026-W06 · no entry2026-W07 · no entry2026-W08 · no entry2026-W09 · no entry2026-W10 · no entry2026-W11 · no entry2026-W12 · no entry2026-W13 · no entry2026-W14 · no entry2026-W15 · no entry2026-W16 · no entry2026-W17 · no entry2026-W18 · no entry2026-W19 · no entry2026-W20 · no entry2026-W21 · no entry2026-W22 · no entry2026-W23 · no entry2026-W24 · no entry2026-W25 · no entry2026-W26 · no entry2026-W27 · no entry2026-W28 · 459 commits2026-W29 · 156 commits2026-W30 · 374 commits2026-W31 · 208 commits2026-W32 · 12 commits2026-W33 · 46 commits2026-W34 · no entry2026-W35 · 15 commits2026-W36 · no entry2026-W37 · no entry2026-W38 · 18 commits2026-W39 · 32 commits1,321

Every week of Rocheport Times