Releases / v0.90.0

v0.90.0 Say Who You Are

2026-09-11 Engine

A relay can present a real certificate and pick up its renewal without ending a lobby, a dedicated server keeps its lobby code across a restart, a box reports which version it runs, a game key stays out of every world-readable file, and a server bundle says when it was made and what you called it. Nothing here changes how you write a game; it is the release in which the things you run say what they are.

A relay presents a certificate you gave it

floptle-relay --tls-cert fullchain.pem --tls-key privkey.pem presents the chain in those files instead of minting a self-signed one at startup. PEM, as certbot writes them; half a pair is refused at startup, and a pair that will not load is a relay that does not come up, never one that quietly came up self-signed instead.

A renewal ends no lobby. The relay watches both files; a renewal written to the same paths — which is what certbot does — is presented to new connections within ten seconds, and every connection already up keeps the certificate it agreed. A renewal that will not load (a torn file, a key for a different certificate) is said once on the relay's log and the previous certificate stays. There is no restart to schedule and nothing for a deploy hook to signal.

floptle-relay-bench --verify is how you check it from outside, with the same handshake a player's build runs: it prints the SHA-256 fingerprint of the leaf the relay actually presents, in openssl's spelling, and whether the chain verifies for the relay's name against the public roots. openssl s_client cannot do this — it speaks TCP, and a relay answers QUIC on UDP.

A dedicated server keeps its lobby code across a restart

A server that restarts onto a new build and asks the relay for the code its players already know was granted it — and, in the same second, the relay ended the lobby for having had nobody in it for half an hour. The restored lobby had inherited the old process's idle clock, and a server that sits empty waiting for players is exactly what a dedicated server is for. The server then went on advertising six characters that answered nothing, with no error anywhere.

A reclaimed lobby now starts a fresh idle window at the reclaim, whether its host is a dedicated server or a player whose connection blipped. A dedicated server's lobby is never reaped for idleness; a player's reclaimed lobby gets the same window a new one gets.

A box says which version it runs

The fleet agent and the managed relay each report their own version on the reports they already send — the version compiled into the binary, never read from a file or a unit, so an upgrade cannot leave a row saying the old number. The two are different binaries on different machines and are kept apart.

The agent also forwards which key a running server was started with — the first twelve characters, never the key — so a developer mid-rotation can see what the process that is running presented.

A game key stays out of every world-readable file

A dedicated server's unit file is world-readable, as unit files are, and it carried the whole game key. On a box that runs more than one developer's server, that was somebody else's credential at rest for anyone to read.

The key now lives in a file of its own under --keys (default /etc/floptle/keys), one 0600 root-only file per deployment that the unit names with EnvironmentFile=; the unit itself carries no secret. A rotated key changes that file and not the unit, and the agent restarts the server for it all the same. A deployment that is removed takes its key file with it.

A server bundle says when it was made and what you called it

floptle export … server writes exported_at into the bundle's manifest, and --label "lobby v3" writes a label. The control plane knows when the bytes arrived; it could not know when the build was made, and a bundle exported on Tuesday and uploaded on Friday read as Friday's work — which is how somebody deploys a build they thought they had replaced. The label is what you call the build, shown beside its checksum and never instead of it. Bundles exported before this carry neither and work as they did.

A usage report says where a key's lobbies are hosted from

Each per-key sample a managed relay reports now lists the addresses its live lobbies are hosted from and how many at each. It is the number behind "is my key being used by someone who is not me" — and the first thing the control plane does with it is count and show, not refuse: a CI runner, a LAN party and a whole ISP behind one address all look like "many lobbies from one address" and are honest.

Upgrading

If you run a relay, nothing changes until you pass --tls-cert and --tls-key. If you run a fleet agent, its first reconcile on the new version writes each server's key file and rewrites each unit to read it, which restarts every dedicated server on the box once — pick the moment. If you export server bundles, --label is optional. Nothing else needs a change.

Floptle Hub

Linux x86_64 7.5 MB Download → sha256 6efc8076b57188886845e8717816d4f82130c60678e80913b0e0d072da03e541
macOS Apple Silicon 5.7 MB Download → sha256 261d0455c294c926d6eac975af542804b5f5674d3519a162eeee476cefa24acc
macOS Intel 6.2 MB Download → sha256 38c5c1973a6a32f28c0acfe4cfb92f42205d8521eeb773249add5d773742b985
Windows x86_64 7.1 MB Download → sha256 333aa08fe0ba8eb3fc0bdb23275f76533188a34c63144acf416bf3916354dfe9

Engine

Linux x86_64 33.7 MB Download → sha256 07749ceba1f0d2b5922c2383321f89e79768b24f3f0d372b1553d121d0a363e3
macOS Apple Silicon 27.4 MB Download → sha256 ccfb5828a6d748437fd5750447f224c474fd1ac58b8367fd6e53618dc8b758a6
macOS Intel 29.5 MB Download → sha256 dd8a11baa767b3d8634252cf5563424d839ce4eba4d5e1ac42c79ef67816f253
web 4.3 MB Download → sha256 5e49f73970430ab5e938c00a989cc9227c5d3563e82593765a9814db1d33bdec
Windows x86_64 33.3 MB Download → sha256 d2c8ceb7fc85b3809bf223fb41f9f499124b3310c350b6987460a816fc40df8a

The binaries are not signed yet. On macOS, right-click the app and pick Open the first time. On Windows, if SmartScreen appears, pick More info then Run anyway.