Three attempts before the product
SimStrats is not a weekend project. It is the third attempt at the same question. In 2024 a first “Cidix Strategy Tool” used Express and MongoDB. It already knew races, drivers, stint length, pit time and unavailability, but it remained a concept. In September 2025 came Chronicle Strats: Next.js, Convex, Clerk, a first stint planner and a team chat.
In April 2026 the product was set up again as SimStrats in a new codebase. The stint planner and live dashboard were carried over from Chronicle Strats and developed further; the data model for drivers and stints kept its shape. Since 28 April 2026 the platform runs publicly on its own server.
This history matters. It shows the domain logic carried across several technical generations. What no longer fitted was rewritten, not everything at once.
A stint plan is a rule set
A team enters rules for each driver: maximum stint length, minimum rest, maximum total drive time, times someone is unavailable. A validator checks seven rule types and reports violations on the exact stint. A solver turns them into a proposed driver order.
The interesting part is locked stints. When a team manager pins a stint, the solver plans around it. Locked minutes count towards the driver’s total immediately. The end of the driver’s last stint, however, only moves once planning actually reaches that point. Otherwise a locked stint three hours from now would block the same driver today for lack of rest.
How long a stint lasts depends on lap time and fuel use. Both are resolved per driver in tiers: race laps first, then training laps, then the median of team-mates on the same track, then defaults. That gives the range of one tank and so the stint length.
For night races the planner shows day and night phases on the timeline. They come from the track coordinates and an astronomical approximation, without any external service.
Telemetry only from the right driver
During the race, SimHub on the driver’s PC delivers data from the simulator: fuel, tyres, lap times, brakes. Shared mapping tables translate the fields per simulator. Verified on real hardware so far is Assetto Corsa; ACC, iRacing and Le Mans Ultimate are prepared in code.
What matters is whose data may arrive. A team often has several PCs running SimHub, for practice or spectating. A check accepts data only if the sender is registered as a driver, is on the same track in a race session and is the one who should be driving. When the simulator is idle, nothing is written to the database.
The desktop app is built with Tauri and Rust. It polls SimHub ten times a second, keeps its access key in the Windows credential store and buffers lap traces. Parser and checks were ported one to one from TypeScript to Rust and tested on both sides, so web and desktop make the same decisions. The server stores access keys only as hashes. There is no distributed installer yet.
The AI proposes, a person decides
In the race chat any team member can address the AI race engineer with @strats. The request goes to Gemini with the latest messages, each tagged with its author, so the model knows who asked what. The answer streams back and is stored in the conversation.
The model has exactly one tool: it can propose a stint change. The proposal lands as a pending entry and changes nothing in the plan. Only when someone on the team clicks “Apply” does it take effect. During a race, a wrong automatic change costs more than one extra click.
Every plan has a monthly token quota that is checked before each request. A security review found that a client could have posted messages as the assistant. Since then only a server-side path that requires a shared secret writes AI answers into the chat.
Sharing without revealing names
Leagues and teams want to show races, for example on stream. SimStrats creates a share link with a 192-bit token. The public page and three OBS overlays for stints, pit window and strategy read through their own queries. Driver names are replaced by placeholders such as “Driver A”. The overlays have transparent backgrounds and work directly as a browser source.
Operation is part of the product
SimStrats runs on its own Linux server behind nginx, not on a platform that sets costs and limits. Subscriptions run through Clerk Billing; a user’s plan is only set through a signature-checked webhook. Errors go into an own log with an admin view, and a public status page shows the state of API, database, email and AI.
Users can export and delete their data themselves. Reminder emails before the race start, email invitations and clean-up of stale data run as scheduled backend jobs.
What is still missing
SimStrats is in closed beta, and that is meant seriously. Strategy for time-only races still needs a fixed lap count. Driver changes are not detected automatically, there is no position or gap data for opponents and no mobile race view yet. The app interface is English only so far. Before an open beta come production sign-in keys, a legal review and hardware verification of further simulators.
What this work shows for your project
The race is the occasion here, not the limit. A stint plan with maximum duration, rest time and unavailability is structurally a shift or crew schedule. Telemetry that is only accepted from the right source is a problem in every device integration. A language model that proposes but changes nothing by itself is a pattern for AI in any specialist tool.
SimStrats shows that CIDIX builds and runs such a system, from the data model to the paying user. And states openly which parts are finished.


