Saving a party as one file

Save writes the whole night, full world state plus every ticker line with timestamps, as a single JSON document that reads as a transcript in any editor. Resume picks the night back up at exactly that beat.

One file
world + complete event log
Log cap
4,000 events (the wire only carries 48)
Resumes live at
/rooms/<room>?party=<id>
Concurrent forks
6, LRU-evicted when idle

Saving changes nothing

Save downloads the file and the room carries on. There is no pause, no mode and no ownership. The party is not yours; you took a copy of it.

The event log is capped generously so that the file is a complete record. It is the one place the full log matters, since the stream never carries more than the last forty-eight lines.

A resumed party never touches the public room

Resume loads the file into its own private runner keyed "<roomId>::<partyId>", living at ?party=<id>. Share the link and other people watch that one with you; resume the same file twice and you join the same private party instead of forking again.

Forks are capped at six and evicted least-recently-used once they are not busy, and the hourly spend budget is process-wide, so forking cannot multiply the cap. A link to a party that has since been evicted lands you in the public room instead of nowhere.

It is a transcript as well as a save

Because the log carries timestamps and plain lines, the file reads top to bottom as an account of the night in any text editor. That makes it the natural artefact to send somebody: not a screenshot of a simulation, the simulation.

curl -O -J localhost:4712/api/rooms/midnight/export
curl -X POST --data-binary @midnight-beat12.parlour.json \
     -H 'content-type: application/json' \
     localhost:4712/api/rooms/midnight/resume        # -> { url }

Read next

More on the build