Skip to content

Release 0.3.0 - #85

Merged
tnakeli merged 1 commit into
masterfrom
release/v0.3.0
Nov 7, 2026
Merged

tnakeli merged 1 commit into
masterfrom
release/v0.3.0

Conversation

@tnakeli

@tnakeli tnakeli commented Nov 7, 2026

Copy link
Copy Markdown
Owner

Draft for review: application release 0.3.0. Not to be merged before the notes are approved.

Below are the generated GitHub release notes (node scripts/release-notes.mjs app 0.3.0).


Development status

OpenSkiTime is still in development and is not yet intended for timing real races. It will be tested at real competitions during the 2026/27 season. Use it for evaluation and rehearsals only, always with independent backup timing.

Application

This version uses live protocol 2. It changes the .ost series format (start lists of all genders, up to 99 runs). Series files from earlier versions cannot be opened; create a new series file.

Added

  • Club races with classes: a Club (non-FIS) competition can hold several classes, men and women together in one start list, and any number of runs (1–99, for example a training race of 20 runs). Classes are the category rules of the series.
  • Flexible start order: in Start lists every class is a start block. Blocks can be reordered, merged into one drawn group and split again. For the first run choose Draw all or By points (best group drawn, the rest in points order, lower or higher points better, 0 as no points). For each later run choose Reverse start order (no results needed), Reverse results (the best N or all; DNF/DSQ start last or not at all) or Same order. Draw block again draws one class again without changing the others. Every list is saved with its settings and seeds and can be verified like a FIS draw.
  • Bibs per block: first bibs are calculated from the order, the number of starters, the first bib and the skipped bibs; type a first bib for a block to leave a gap, and the blocks after it follow.
  • Default classes for every season: a new event series starts with the age classes of its season (girls N and boys M 10, 12, 14, 16, 18, 21 and general), with birth years that move on every season. Default classes (replace) in the category rules loads them again.
  • Points for all disciplines: a POINTS column in Competitors (typed, pasted from Excel or imported) is used by the draw instead of the discipline's FIS points.
  • Results PDF for Club races: one file with the jury and the courses, every class ranked by total time, and those who did not start, did not finish or were disqualified, by run. It says PRELIMINARY until every run is finished.
  • Timing report for Club races: the timing report can be prepared for every competition; a Club race gets it as a PDF from PDF Factory, without XML or FIS submission.
  • Send to FIS: results and timing reports are sent to FIS from the application, with a test mode that uses FIS's reserved test codices, a clear verdict of FIS's answer and the raw response on request. The results XML follows the FIS Alpine Result XML specification 2.13. The FIS Member Section token has its own place in Settings.
  • Typed B and hand times checked against System A as they are entered in the timing report: a small difference is a warning, a large one an error that blocks the XML.
  • Chief of timing in the race information.
  • Race radio (optional): short Finnish AI commentary for Local and Cloud live timing viewers. Enable it per competition in the live timing control panel's Race radio card, choose the language model and speech provider, set a spending limit (a hard stop) and add event background and pronunciations if needed. Provider keys are saved in Settings → Live timing → Race radio provider keys (Windows Credential Manager). Results are called unofficial, and timing capture and live publishing are never affected. Simulation providers rehearse it offline without cost. Optional background music from a folder of MP3 files can be turned off by viewers.
  • Replay file follows the file during capture: a replay file connected as timing keeps being read, so impulses appended while connected (for example by the real-time rehearsal script scripts/race-replay.py) are captured as they arrive. Replay lines may name the bib explicitly.
  • Live timing server load: the Local and Cloud cards of the live timing control panel show the server's viewers, response times, CPU, memory and queued work. Needs live timing server 0.5.0 or later.

Changed

  • Timing ranking and live page: in a race with classes the class of the latest finisher (or of the racer on course) is listed first, and ranks are within the class. A FIS race is ranked race-wide.
  • Start lists: the list keeps its place when it is drawn again; start list PDFs, TSV and the print view show the class of every starter, and a Run 2 start list shows the gap to the Run 1 leader instead of points.
  • New look: every view uses the same cards, 12-column layout and colours; person names follow one rule everywhere (surname in bold capitals, then the first name), and nations show their flag in desktop views and PDF reports.
  • PDF Factory keeps each competition's files in a subfolder named after its short name. Official Results can be generated as a draft before approval. Penalty rule tables of 2025/26 are accepted.
  • Updated components: the application and the live timing control panel use Avalonia 12; Entity Framework Core, SQLite and the other .NET libraries are on their latest servicing releases.

Removed

  • The report history expander of the timing report; report revisions stay in the event file.

Fixed

  • FIS calendar loads despite incomplete races: one race without a codex (or another unusable row) no longer rejects the whole FIS calendar. Races without a codex are imported and the codex can be entered in Competitions later.

Security

  • FIS live timing logs without racer data: the local live timing diagnostic log no longer stores racer names, nations, clubs or FIS codes from FIS messages. Full protocol tracing is opt-in with the OST_FIS_WIRE_TRACE=1 environment variable.

Live timing

This version publishes with live protocol 2. Compatible live server releases: live-v0.10.0, live-v0.9.0, live-v0.8.1, live-v0.8.0, live-v0.7.0, live-v0.6.0, live-v0.5.0, live-v0.4.1, live-v0.4.0, and later releases supporting protocol 2. The hosted server at https://live.openskiti.me is updated independently; see live server releases and CHANGELOG-LIVE.md. Local publishing uses the server included in this installer.

Installation

Windows x64 installer and portable package. The .NET 10 runtime is included. The installer is per-user and needs no administrator rights.

Digitally signed: the installer and OpenSkiTime programs are signed with the project's Certum code signing certificate issued to Teemu Niemi and timestamped. Check the installer's Digital Signatures tab before running it. Windows SmartScreen may still warn about a new download until the release has built a reputation. Download only from this project's GitHub Releases; see the code signing policy.

Rehearse before race day and back up event files before updating. Incompatible series files are preserved and rejected; automatic schema upgrades are not available. ALGE native USB needs the vendor driver and SDK separately.

Verification

The attached CycloneDX SBOM describes detected runtime dependencies. CVE reports include all severities; high and critical findings block publication. Native vendor components may need separate advisories.

Checksums verify file integrity, not publisher identity. Download SHA256SUMS.txt into the folder with the downloaded files and run the check there. Each listed file that is present prints OK or FAILED.

Windows PowerShell:

Get-Content SHA256SUMS.txt | ForEach-Object {
  $hash, $name = $_ -split '  ', 2
  if (Test-Path -LiteralPath $name) {
    if ((Get-FileHash -LiteralPath $name -Algorithm SHA256).Hash -eq $hash) { "OK      $name" } else { "FAILED  $name" }
  }
}

Linux: sha256sum -c --ignore-missing SHA256SUMS.txt. macOS: shasum -a 256 -c --ignore-missing SHA256SUMS.txt.

@tnakeli
tnakeli marked this pull request as ready for review November 7, 2026 21:02
@tnakeli
tnakeli merged commit 9c81180 into master Nov 7, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant