Repository navigation
Stations File Setup
This page describes how to prepare the stations configuration file for an event, including optional OpenSplitTime metadata.
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.
| 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": {
"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:
-
stagingpoints atstaging.opensplittime.organd is intended for rehearsals, connectivity tests, and dry runs. It does not affect any public/live results. -
productionpoints atwww.opensplittime.organd 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 tostagingwhenever a staging entry is configured, so operators must intentionally switch toproductionbefore working a live event. - Switching the dropdown from
stagingtoproductionshows a confirmation warning ("Live Event") because any times submitted afterward go to the real event. Switching fromproductionback tostagingdoes not require confirmation. - Only populate the
productionblock once the real OpenSplitTime event group exists. Leave it out (or leavestagingas the only configured environment) for events that only need staging/testing. - The
idvalue 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, butnamemust still match a real event group name or the lookup will fail. -
splitNamesis 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'sidentifieror its rawname.
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.
{
"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": ""
}
}
}
]
}- Open Settings.
- Click Load Stations and select the event's
*-stations.jsonfile. - Confirm the event name, start/end times, and station list on the Stations page.
- If OpenSplitTime is configured, open OpenSplitTime Steward Login, confirm the environment dropdown shows the intended event/environment (staging by default), and sign in.
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 | The record has not been exported to CSV. | |
| Not signed in | The record was included in a successful incremental or full CSV export. | |
| Signed in | The record is pending OpenSplitTime upload. | |
| Signed in | The record was uploaded to OpenSplitTime. | |
| Signed in | 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.