A Windows desktop utility for importing UltraTracker CSV timing data into an OpenSplitTime event. It reads event metadata from a packaged event ZIP, maps station names to OST split names, and uploads the resulting JSON payload to the selected OST environment.
Requires a valid OST account with access to the target event and event-level permissions that allow data uploads.
The app is intended for the common workflow used by the Bridgerland Amateur Radio Club:
- Load the event ZIP provided for the race.
- Select the correct OST site from the event metadata.
- Authenticate to OpenSplitTime.
- Load the UltraTracker CSV export.
- Review the imported rows for validity, flag duplicate and did-not-start records.
- Upload the validated data.
The tool is a Windows WPF application and is built for Windows 10/11.
- Windows 10 or Windows 11
- .NET 10 SDK for building the project locally
- A valid OST account with Steward-level access to the event
- An event ZIP file from UltraTracker/OST containing a
stations.jsonfile at the root - A CSV export generated by UltraTracker in the expected format
Refer to the Ultra-Tracker Event File Creation documentation.
For most users, this file will be prepared by your event organizers.
This project expects event packages to be a single ZIP file containing stations.json from which it reads the OST connection metadata for your event.
If the event metadata includes a staging site, the app prefers staging by default to use for testing.
If the event ZIP is missing stations.json or the event.openSplitTime block is not present, the app will not allow authentication because it cannot determine the target OST environment.
- Download the latest release for Windows from the Releases page.
- Extract the files to a local folder.
- Run the executable.
- If prompted by Microsoft Defender SmartScreen click More Info and then click Run Anyway.
From the main window:
- Click Browse Event File.
- Select the ZIP file for the event.
- The app will inspect
stations.jsonand populate the OST site choices.
When a valid event file is loaded, the UI enables authentication and makes the OST site selector available.
The app shows the available OST locations based on the event metadata, typically:
- Production - https://www.opensplittime.org/
- Staging - https://staging.opensplittime.org/
A confirmation prompt appears before switching to a production URL because live uploads are sent there.
Credentials for the OST staging site and Production site are unique, you must be assigned as a steward in the corresponding site. If you create your account using the Google or Facebook logins, you must then use the Forgot your password? link to create a password. Your OST admin will need to add your account as a steward.
Enter the OST email and password, then click Login.
CSV import workflow will be enabled only after authentication succeeds.
You may optionally check Save credentials to store the token securely for future sessions.
Import files must be a valid UltraTracker CSV export file. The app validates the file before upload.
The app maps the station token from the CSV to the OST split name using the event metadata splitNames mapping. If a station is not present in the event data, the upload is rejected.
- Click Load File.
- Select the UltraTracker CSV.
- The app loads the rows into the grid.
- Duplicate and did-not-start rows are highlighted in yellow and are excluded from upload.
- Rows with unknown participant bibId's will be uploaded, but will not be matched to an participant.
- The records summary shows the total number of rows and duplicate count.
When the CSV has loaded successfully:
- Verify the event, station, and export type displayed in the top section
- Confirm the OST site selector is pointing at the correct OST environment.
- Click Upload Data
The app sends the generated payload to the selected OST API endpoint and reports the result in the status bar and message dialogs.
Before uploading to the OST Production site, confirm the corrent event name. Raw times uploaded to the Production site are linked to real athletes and their accounts.
- Saved authentication tokens are stored securely through the app’s credential store rather than plain text.
- Credentials are only reused for the matching OST base URL.
- The app clears saved credentials when the user does not choose to save them.
Symptoms:
- Site selector is disabled
- Authentication controls remain disabled
- The status says the event file is missing OST metadata
Fix:
- Use a valid event ZIP that contains
stations.jsonwithevent.openSplitTime.production - Ensure the metadata is not truncated or malformed
Symptoms:
- The app shows a message that the station was not found in event metadata
Fix:
- Confirm the CSV station identifier matches the event’s configured station names
- Recheck the selected event file
Symptoms:
- Login returns a failure
- The status shows “Not Authenticated” or “Authentication Failed”
Fix:
- Confirm the OST email and password are correct
- Ensure the selected site matches the environment for the event
- Verify that the event file metadata points to the correct OST instance
Symptoms:
- Header does not contain the expected fields
- Invalid bib numbers are reported
- Export type is not accepted
Fix:
- Use a standard UltraTracker export file
- Ensure the header contains the expected three fields
- Remove or correct invalid bib values before upload
Run the full test suite:
dotnet test ost-uploader.slnBuild the app:
dotnet build ost-uploader.sln