Skip to content

Stations File Setup

Russ Leikis edited this page Sep 3, 2026 · 6 revisions

This page describes how to prepare the stations configuration file for an event, including optional OpenSplitTime metadata.

Overview

The stations file is a JSON document loaded from the Settings page (Load Stations). Loading it:

  • Sets the event name, start time, end time, start line, and finish line in the app's local settings.
  • Replaces the local Stations table with the stations listed in the file.
  • Re-applies the currently configured station identity.

Filename convention: eventname-YYYY-stations.json (e.g. Bear100_2026_stations_v1.json). Keep a copy per event/year so past events remain reproducible.

The file has two top-level sections: event and stations.

event Object

Field Type Description
name string Internal event name/slug used as a fallback identifier throughout the app.
starttime string Event start timestamp, e.g. "06:00:00 Sept 25 2026".
endtime string Event end timestamp, same format as starttime.
openSplitTime object Optional. OpenSplitTime event group metadata for production and/or staging. See below.

OpenSplitTime Metadata

"openSplitTime": {
  "production": {
    "name": "the-example-event-2026",
    "id": 1498
  },
  "staging": {
    "name": "example-event-test",
    "id": 695
  },
  "splitNames": {
    "0-start-line": "Start",
    "1-example-peak": "Example Peak",
    "2-finish-line": "Finish"
  }
}
Field Type Description
production.name / staging.name string The OpenSplitTime event group slug for that environment (as it appears in the OpenSplitTime URL). This must be exact — it is what the app sends to the OpenSplitTime API to submit and query times.
production.id / staging.id number The numeric OpenSplitTime event group ID for that environment. This is a convenience value only.
splitNames object Optional. Maps a station's identifier to the split name OpenSplitTime expects for that location. Overrides the station's name when submitting/querying times for that station only. If a station's identifier has no entry here, the app falls back to using the station's name as the split name.

Production vs. Staging:

  • staging points at staging.opensplittime.org and is intended for rehearsals, connectivity tests, and dry runs. It does not affect any public/live results.
  • production points at www.opensplittime.org and posts times to the real, public event page. Treat it as live.
  • In the OpenSplitTime Steward Login UI (Settings page), the environment dropdown lists every configured entry as "<event name> - <production/staging>". It defaults to staging whenever a staging entry is configured, so operators must intentionally switch to production before working a live event.
  • Switching the dropdown from staging to production shows a confirmation warning ("Live Event") because any times submitted afterward go to the real event. Switching from production back to staging does not require confirmation.
  • Only populate the production block once the real OpenSplitTime event group exists. Leave it out (or leave staging as the only configured environment) for events that only need staging/testing.
  • The id value is validated against OpenSplitTime automatically the first time an operator successfully signs in for that environment. If the live event group ID differs from what's in the file, the app corrects its stored copy automatically — you do not need to look up the exact ID by hand, but name must still match a real event group name or the lookup will fail.
  • splitNames is useful when OpenSplitTime's configured split labels for an event differ from the station names used elsewhere in the app (different wording, casing, or abbreviations). The active station's resolved split name (override or fallback) is applied automatically whenever the station identity is set, and is what gets sent to OpenSplitTime in raw time submissions — not the station's identifier or its raw name.

stations Array

Each entry describes one aid/timing station:

Field Type Description
name string Display name of the station.
identifier string Unique station identifier (also used as the OpenSplitTime source value for submitted times).
description string Free-text location/crew description.
location.latitude / location.longitude / location.elevation number Station coordinates and elevation.
distance number Course distance (miles) at this station.
dropbags boolean Whether drop bags are available at this station.
crewaccess boolean Whether crew access is allowed at this station.
paceraccess boolean Whether pacer access is allowed at this station.
shiftBegin / shiftEnd string Operator shift window for the station.
cutofftime string Athlete cutoff time for the station.
entrymode number Logging mode: 0 = Normal, 1 = Fast, 2 = In Only, 3 = Out Only.
operators.primary / operators.secondary / operators.tertiary object Each has fullname, callsign, and phone. secondary/tertiary are optional.

The first entry in the array is treated as the start line and the last entry as the finish line.

Example

{
  "event": {
    "name": "example-100-2026",
    "starttime": "06:00:00 Sept 25 2026",
    "endtime": "18:00:00 Sept 26 2026",
    "openSplitTime": {
      "production": { "name": "the-example-100-2026", "id": 1498 },
      "staging": { "name": "example-100-test", "id": 695 },
      "splitNames": { "0-start-line": "Start" }
    }
  },
  "stations": [
    {
      "name": "Start Line",
      "identifier": "0-start-line",
      "description": "Main Trailhead",
      "location": {
        "latitude": 41.7283,
        "longitude": -111.7995,
        "elevation": 4852
      },
      "distance": 0.0,
      "dropbags": false,
      "crewaccess": true,
      "paceraccess": false,
      "shiftBegin": "05:00:00 Sept 25 2026",
      "cutofftime": "06:30:00 Sept 25 2026",
      "shiftEnd": "07:00:00 Sept 25 2026",
      "entrymode": 1,
      "operators": {
        "primary": { "fullname": "Jane Doe", "callsign": "N0AAA", "phone": "" },
        "secondary": {
          "fullname": "John Smith",
          "callsign": "N0BBB",
          "phone": ""
        }
      }
    }
  ]
}

Loading the File

  1. Open Settings.
  2. Click Load Stations and select the event's *-stations.json file.
  3. Confirm the event name, start/end times, and station list on the Stations page.
  4. If OpenSplitTime is configured, open OpenSplitTime Steward Login, confirm the environment dropdown shows the intended event/environment (staging by default), and sign in.

OpenSplitTime Operation And Record Status

OpenSplitTime is optional. Stations that do not sign in continue to use CSV exports to deliver timing data. The indicator at the left of each timing record shows the active delivery status:

Integration state Indicator Meaning
Not signed in Gray hollow circle The record has not been exported to CSV.
Not signed in Green hollow circle The record was included in a successful incremental or full CSV export.
Signed in Yellow solid circle The record is pending OpenSplitTime upload.
Signed in Green solid circle The record was uploaded to OpenSplitTime.
Signed in Red solid circle The OpenSplitTime upload failed.

When a steward signs in, OpenSplitTime status takes precedence over the CSV export indicator. Signing out returns the display to CSV export status without changing whether the record has been exported.

Use Pause Pushes to temporarily stop automatic uploads while retaining the signed-in session. Use Resume Pushes to restart automatic uploads. Saved credentials are protected by the operating system's secure credential storage; never place credentials in the stations file.

Clone this wiki locally