Target Start Trail / Stop Unload / Prep
(min)
Gear Distance
(mi)
Pace
(mph)
Est Time Est Finish Load Up
(min)
Travel Next
(min)
Notes
Saved

Year Catalogs

Operations below act on the year selected at the top right. The shipped catalog lives at data/<year>.json in the repo; admin edits are stored as a server-side override in the year_overrides table and take effect for every visitor immediately.

Upload a <year>.json from your computer. The file is validated, saved as a server-side override, and shown immediately to every visitor. Use this when you've prepared a new year's catalog (or pulled an updated one from the repo) and want it live without rebuilding the container.
Save the selected year's catalog — including any server-side edits or computed travel matrix — to your computer as <year>.json. Commit it to data/ in the repo to ship those edits to fresh deployments.
Geocode any trails missing coordinates via Nominatim (OpenStreetMap, throttled to 1 req/sec), then fetch the full trail-to-trail drive-time matrix from OSRM. Stored on the catalog as travelMatrixMin — once present, reordering trails in the planner auto-updates each "Travel Next" value. Typically run once when first publishing a year.
Discard the server-side override for the selected year and revert to the shipped data/<year>.json. Use this if a test edit went wrong — riders see the official catalog again on their next load.
Same as Revert to Shipped, but prompts you for a year number first. Useful when an override exists for a year that isn't currently selected, or for cleanup of years no longer in the shipped manifest.

Available years

Year-file JSON schema (click to expand)
{
  "year": 2027,                       // required, number
  "label": "Judgment Day 2027",       // shown in the header
  "eventDate": "2027-10-23",          // optional YYYY-MM-DD; used for day-of-week labels
  "startTimeDefault": "05:40",        // HH:MM, depart-home time
  "homeToFirstMinDefault": 52,        // travel home → first trail
  "lastToHomeMinDefault": 70,         // travel last trail → home
  "paceMphDefault70": 6,              // default mph for 70mi
  "paceMphDefault100": 7.5,           // default mph for 100mi
  "prepDefaultMin": 15,               // default minutes for "Unload / Prep" (post-arrival)
  "loadUpDefaultMin": 15,             // default minutes for "Load Up" (pre-travel)
  "trails": [                         // required, ordered by defaultOrder
    {
      "id": "northshore",             // stable slug
      "name": "Northshore",
      "address": "2599 Edgemere Rd, Flower Mound, TX 75022",
      "loopsNote": "Loops 4,3,2,1…",
      "miles70": 12,                  // mileage for 70-mile route
      "miles100": 15,                 // mileage for 100-mile route
      "defaultOrder": 1,              // 1..N
      "reorderable": true,            // first 3 are usually true
      "defaultTravelToNextMin": 24,   // fallback if no matrix
      "lat": 33.0306,                 // optional; populated by "Compute Travel Matrix"
      "lng": -97.0581
    }
    // ...one entry per trail
  ],
  "travelMatrixMin": {                // optional; populated by "Compute Travel Matrix"
    "northshore":  { "knobhills": 24, "corinth": 23 /* ... */ }
    // ... full N×N (excluding self)
  }
}