Releases / v0.87.0

v0.87.0 Wide Awake

2026-09-10 Engine

A joining player can be told that a server is still waking up, rather than being told the game does not exist. Plus two flags that were always there and never written down.

A server that is starting is not a server that is missing

net.joinState() has a new answer: "starting".

Until now a join could only be going ("connecting"), done ("joined"), or never going to work ("refused"). A dedicated server that has been asked for but is not up yet is none of those, and the only honest-looking option was a refusal — which tells somebody holding a perfectly good lobby code that their friend's game is not there.

lua
local state, why = net.joinState()
if state == "starting" then
  find("Status").text = why      -- "about 20 seconds"
elseif state == "refused" then
  find("Status").text = why      -- "no lobby QK7RM"
end

The second return carries words you can show a person, not a status word you have to translate. Treat "starting" as a waiting state like "connecting" — with the difference that "connecting" is one round trip to the relay and this one can take tens of seconds, long enough that a bare spinner reads as a hung game.

Games already published keep working exactly as they do now. A build that has never heard of "starting" sees "connecting" for the whole wait and draws the spinner it already draws. Nothing to recompile, nothing to guard.

What is not in this release: nothing sends "starting" yet. Sleeping a server and waking it on demand is being designed and is not here. This is the half a game is written against, shipped early so that when the rest arrives your lobby screen is already right.

Two server flags that were real and undocumented

floptle serve has always accepted --status-file and --max-players. Neither appeared in floptle help, so the only way to know was to read the source.

  • --status-file PATH writes live status as JSON on a timer — players connected, uptime, tick timing, the lobby code, and the port or relay the server is actually reachable on. It is how anything supervising a server learns the lobby code, because the relay hands that to the server and nowhere else.
  • --max-players N refuses joins past a number you pick.

--budget was documented as a cap on entities per tick. It is a bandwidth ceiling in bytes per second, and it only does anything alongside --interest. If you set it from the old description, check the number.

Floptle Cloud sees a region filling up

Region relays now report their own load, so a busy region is something Floptle Cloud can see coming rather than something it learns about from complaints. A server running on a region also reports what it costs to run, which is what the per-region capacity is worked out from.

None of this changes how you host or what you pay. It is the difference between capacity planned on measurements and capacity planned on estimates.

Servers on a region are also told which deployment they are, so their logs can be matched to the right entry on your game's page.

Upgrading

Nothing to do. If you run a region box, take the new fleet agent and relay.

Floptle Hub

Linux x86_64 7.5 MB Download → sha256 573b2ea155a4d85f08b7129bbfa91d4945917b4a9a6d02a65d35feb08b429ec7
macOS Apple Silicon 5.7 MB Download → sha256 9e8ec6f537098ecba5534ff178f01fa2886788c3b0292a8e1a135441337891a9
macOS Intel 6.2 MB Download → sha256 0080754ba7e8b9e01f54bc29aeca575704cd1fc27dc9a63ccb05e737d309e2b8
Windows x86_64 7.1 MB Download → sha256 928b1dff718c661811cb95f612a9b0f440745dafaef9ed140088d2aebe431229

Engine

Linux x86_64 33.4 MB Download → sha256 0b73a866e027b62ef14e1a4a1eea29ed7f5f2faf8e57cc8534ecfd0b893e0b24
macOS Apple Silicon 27.2 MB Download → sha256 0523329486d9c2bb438747edabd791304eb75c6c7fcf999a540621b8f9c83aa9
macOS Intel 29.3 MB Download → sha256 2c6130cfaf0ff65bff0126c90a78072d4954c06b74b4ce05fa003203d3dcacd2
web 4.2 MB Download → sha256 4e4923f5c63e0139ec35a45d56675b750c039d4b03ffa6cd43ea9c98f01567f5
Windows x86_64 33.1 MB Download → sha256 dfeb92bc7e32f6b57e6137924e5f956cc71641ed9df54d26ffc68e71e0767ba3

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.