No subscription
The server, the client and the protocol are free software under the GPL. Run them for your team for as long as you like, on hardware you already have.
Open source · self-hosted · plugin-based
Pacenote is a sim racing telemetry server and client. Your team runs the server, drivers pair a client, laps arrive, and plugins do the rest: coaching, a voice, charts. One binary, your database, your budget.
A telemetry trace of one lap: speed, throttle and brake plotted against distance, with seven corners marked. Turn 4 is highlighted with the cue “Brake twenty metres later”.
Quick start
The server needs PostgreSQL 15 or newer and a host name. Nothing else: no runtime, no package manager, no container unless you want one. On first run it prints a one-time token and waits for you at /setup.
curl -LO https://github.com/Pacenote-Sim/server/releases/download/v0.2.0/pacenote-ce_0.2.0_linux_amd64.zip
unzip pacenote-ce_0.2.0_linux_amd64.zip
./pacenote-server
# Open http://your-server:8080/setup and type the token it printedOther platforms and checksums on the release page.
Why
Telemetry, coaching and a race engineer's voice should not come as a subscription with a price you do not control. Pacenote puts every cost where you can see it.
The server, the client and the protocol are free software under the GPL. Run them for your team for as long as you like, on hardware you already have.
Anything that calls an outside service is a plugin. It runs on your own account, tells you where it sends data before you enable it, shows what each call cost, and stops at the daily cap you set.
Every lap, stint and trace lives in a database you run. Back it up like any other. Credentials are sealed with a key only your server holds, so a copy of the database carries nothing usable.
How it works
The client measures. The server stores and tells its plugins. A plugin answers. Its client half plays the answer while the lap is still being driven.
The game publishes its state while it runs. Pacenote reads it through a source plugin, so any simulator can be added.
One program beside the sim. It measures every lap and corner as it is driven and sends them to your team’s server.
One binary your team runs, with its own database. Drivers pair a client, laps arrive, the panel shows where the time went.
Separate programs told when a lap or stint finishes: coaching, a voice, charts. Each says what it calls and what it may spend.
And back. A plugin's client half, a companion, runs inside the client: it posts the lap, gets the coach's lines, and plays them before the next corner.
A simulator is a plugin. iRacing is the first; adding another means writing one reader, not changing the client or the server.
The operator ticks the plugins they want and the server produces one installer with its own address inside. A driver installs one file and pairs it with a code. No settings to copy around.
A server plugin is a separate process talking to the server over a local channel. One that crashes does not take the server with it; one that is slow is skipped at its deadline. The server names no vendor and holds no credential for one.
Plugins
Everything beyond storing laps is a plugin, and the operator chooses which ones run. Each is free software you install yourself, with no fee attached to it.
Coaches your drivers from their own laps: a line for the corner ahead, the radio in a race, a debrief with setup changes after the stint. Runs on your own language-model key.
Speaks the engineer’s lines so a driver hears them before the corner, not after. Runs on your own voice-vendor key, and a line spoken once is never paid for twice.
Draws every lap as it was driven: speed, revs, throttle and brake against distance, sectors marked, the circuit alongside. Overlay laps to compare drivers. Calls nothing outside your machine and costs nothing to run.
Reads iRacing while it runs and turns it into laps and corners the client understands. Other simulators are added the same way, without touching the client.
A server plugin runs beside the server as its own program. It is told when a lap or stint finishes, can keep its own pages and data, and only ever borrows a credential for one call. If it crashes, the server keeps running.
A client plugin is compiled into the client your server builds. A source reads one simulator. A companion is the client half of a server plugin: it sends laps, plays what comes back, and shows a page in the client window.
Both plugin contracts are Apache-2.0, and the client carries a plugin exception to its GPL. A plugin depends on the contract, never on the server or the client, and may be licensed however its author likes, open or closed.
Write your own
Put the binary and its manifest in a folder under the server's plugin directory and pressLook for new plugins in the panel. The contract is small and documented, and it is not tied to Go: the message format is published for other languages too.
package main
import (
"context"
"github.com/pacenote-sim/plugin"
)
type mine struct{}
func (mine) Settings(context.Context) ([]plugin.Setting, error) { return nil, nil }
func (mine) Notify(context.Context, plugin.Event) (plugin.Usage, error) {
return plugin.Usage{}, nil
}
func main() { plugin.Serve(mine{}) }Community
The server has tagged releases. The client and the plugins build from source today. Issues and pull requests are welcome on any repository.
| Module | Licence |
|---|---|
| server | GPL-3.0-or-later |
| client | GPL-3.0 + plugin exception |
| protocol | GPL-3.0 + plugin exception |
| plugin (server contract) | Apache-2.0 |
| clientplugin (client contract) | Apache-2.0 |
Run it for anything, including commercially. Change it and run your changed copy. Hand a changed copy to someone else and you hand over your changes on the same terms. Your plugins are yours: the client and protocol carry a plugin exception, so a client built with your plugin can ship under your plugin's licence.