Files
station-master-startos/instructions.md
T
JesseandClaude Opus 5 d905c86e69 0.8.1.0:0 — bundle Station Master v0.8.1.0, and date the games in Manage Game
A table pass over 0.8.0.17. The second-digit bump is deliberate: 0.8.1 had been
reserved for the seatless display table, which is getting more thought, and this
batch earned the number on its own.

GAMES IN PROGRESS RESUME, AND IT WAS MEASURED BEFORE RELEASE rather than argued
from the diff. The bundled release changes what sits in the yards, so the risk
was real. All twelve saves on the test box were pulled and replayed through
`tryResumeSession` — the server's own boot check — against the new build: six
resume, six refuse, and the six refusals are the SAME six, at the same moves,
with the same codes, that 0.8.0.17 already logged. Nothing new was stranded.
That replay is the check worth repeating on any release that touches state,
because it answers before the install rather than after.

THE GAME'S OWN FIX, for the README's benefit: the Freight Agent's "clear the red
Inbound box" returned the car to the Classification Yard still marked loaded,
carrying a load already delivered and already paid for. `pooled()` strips a
load's `origin` stamp and keeps `loaded` on purpose — a train can retire at a
Division Point with freight aboard — so the call site's comment, "a car back in
a yard is back in the common supply, carrying nothing", described something it
never did. Coaches suffered worst: detraining takes `coach && !loaded` out of
the Division Yard, so a cleared coach came back as stock that could never unload
a passenger. 18 loaded coaches against 6 empty over five measured games.

THIS PACKAGE'S OWN CHANGE IS THE MANAGE GAME DROPDOWN. It listed each game's
code, seat count and position and nothing about when the game was last touched,
so four games on a server looked alike — reported 2026-09-22: "I've got four
games out there, but I have no idea which one's which or how old they are."
`lastMoveAt` was already on the wire from the server's `summary()` and simply
unused. Each option now carries both an age and a timestamp, because they answer
different questions: "5h ago" answers the one that was asked, and the date
beside it is what you quote when deciding to end a game. A lobby has had no
move, so it reports when it was created and says so.

`when()` moved out of `gamesInProgress.ts` into `utils.ts` alongside a new
`ago()`, shared by both actions so an administrator sees one date format
wherever a game is named — the second copy would have been the one that drifted.

No route, file model or interface changed. README and instructions.md carry the
release, and the notes in all five locales say games in progress are unaffected.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MUizFYCMHRWhbWwXhp7WPR
2026-09-22 21:23:53 -04:00

32 KiB

Station Master

Documentation

  • Rules and design docs — the rulebook implications, the multiplayer design, and the game's architecture.

What you get on StartOS

This service runs the multiplayer server: a lobby, and a table for 2 to 4 players to play a competitive or cooperative game together from their own browsers. Everything a player needs — the game itself, the lobby, and the connection back to this server — is served from the single web interface below; there is nothing else to install or configure on a player's side.

Getting set up

  1. Run the Get Join Secret action from this service's Actions menu, and copy the value it returns.
  2. Share that secret, and this service's address, with everyone you want to play with. Anyone holding the secret can create a new game or join one that hasn't started yet.
  3. Open this service's Multiplayer Table interface. You'll land on the front page, which offers three ways in: solitaire, the replay viewer, and multiplayer.
  4. Click Play multiplayer, then Create Game (or Join Game with a game code someone else created), and enter the join secret when asked.

Using Station Master

Multiplayer Table

The front page offers solitaire, the replay viewer, and multiplayer. Play multiplayer takes you to the lobby: create or join a game, seat players (including filling empty seats with a bot), and start. Once a game is underway, this same interface is where every player plays their turns and watches the table — there is nothing else to open.

Solitaire runs entirely in your own browser and needs nothing from the server, so it works here exactly as it does on the public Station Master site.

What changed in 0.8.1.0. Games already running on this server resume normally — this was measured, not assumed: every save on the test server was replayed against the new build first, and the only games that refuse are the same ones that already refused.

Passenger coaches stopped piling up unusable. When the Freight Agent cleared a red Inbound box, the car went back to the Classification Yard still marked as carrying its load — a load that had already been delivered and already been paid for. A coach that came back that way could never be used to unload passengers again, so they accumulated in the yards as dead stock. The car comes back empty now, which is what the rules always intended.

And that option says what it does. It used to read "send the loaded coach in the red Inbound box to the Classification Yard", which is true of the counters and nonsense as a sentence. It now says the passengers leave the station and the coach goes back to the yard empty.

The lobby is not a dead end any more. Leaving a game in progress took you back to the lobby, and the lobby showed only the games you were already in — with no way to join a different one or start a new one. Both doors were there the whole time, hidden. They come back now.

The lobby's buttons look like buttons. Look up game, Join, Create new game, Copy code, Copy invite link, Start game and Rejoin carry the same amber border the action buttons in the game do, which has always meant "this is something you can do now".

Taking the last card from a Department refills it — that is the rule (§6.2) and always has been, but it was not written down anywhere, so it surprised a player at the table. It is in the Rules and the Home deck reference now.

Managing a game tells you how old it is. The dropdown in the Manage Game action listed the code and the position but nothing about when the game was last touched, so four games looked alike. Each now says how long ago the last move was and when.

In the history, an Enhancement says which Mainline card it went on — the slot and the card type both, since a Division can be dealt two of the same card — and calls the card by its printed name.


What changed in 0.8.0.17. Games already running on this server resume normally — no rule changed.

There is a guide inside the game now. Open the This Game card, on the right beside the board, and every reference is listed at the bottom: the Quickstart, the Rules in full, every card, both deck references and the Components list. They open in a new tab, so reading one mid-turn does not lose your game. This works the same in solitaire and multiplayer. They are served as plain text for now — tables come out as rows of pipes — which is honest rather than good, and a proper page is the next step. Previously only the Quickstart was published, and the links at its foot all led nowhere.

ABS Signals can be played on any Mainline card, as its card always said. Only one was ever offered. Nothing was wrong with the rule — the game simply described every one of those placements with the same words, and the action list hides duplicates, so all but one vanished before you saw them.

You can see what is standing on a Mainline card. A card carrying ABS Signals draws a signal mast with a lit lamp at its corner, and the Heavy Grade modifiers draw as BRK (Brakeman), AIR (Airbrakes) and HLP (Helpers) beside the card's name. Until now none of them marked the board at all: the only way to find out a card was protected — which decides whether a second train on it is safe — was to hover over it and read the tooltip.

The Freight Agent says what it actually did. The line read "one car moved to or from a facility" even when nothing had moved, and then said nothing further. Doing nothing is a legitimate choice — the rules ask for no action, and a bot will decline rather than break open a working box to look busy — so now it says when it has, and why. When work does happen it names the car, the industry by name rather than a grid coordinate, and which way the car went.

A square is written the same way everywhere. The action list and the history log had been printing the same square in two different orders.


What changed in 0.8.0.16.

The Interchange no longer offers a sorting action it does not have. The card on the Mainline said cars could be re-ordered there. That has never been possible, so the only thing it achieved was sending you looking for a button that was not there. What the Interchange actually gives you is the one place on the Mainline where an Extra Train can be made up and started. To re-order a train, use a Small Yard in your own district.

There is a guide for new players. A Quickstart now ships with the package — what the game is, how you win, how a Stage runs, what everything on the screen is for, a first twenty minutes, and the handful of things that surprise everybody. The rules and card references beside it have been brought up to date with how the game actually runs; several had been describing an older version.


What changed in 0.8.0.14. GAMES ALREADY RUNNING ON THIS SERVER MAY NOT RESUME — one rule changed, and a game whose history contains the move it affects will stop replaying at that move. The server says which move and leaves your save file alone, so if a game is worth finishing you can re-install 0.8.0.13 and play it out. On the game this was tested against, it stopped eleven moves from where the table had got to.

A Modifier card may no longer be placed outside your Limits. Your district ends at its sign, and that is now true of every card, not only track and industries. A Facility standing right at the sign keeps six of its nine nearby spots, and the sign moves outward as your Running Track grows.

Why your passenger trains were running empty, and why nobody could get off. Coaches only travel one way. Passengers boarding sends the emptied coach to the Classification Yard; passengers getting off needs an empty coach fetched from the Division Yard; and the Classification Yard comes back only when the Division Yard is completely bare. In one three-Day game every coach had ended up in Classification by the middle of Day 2 and stayed there — so nobody could board or get off anywhere for the rest of the game, and a train whose card calls for coaches was made up with nothing. None of that has changed: running out is part of the game. What has changed is that the game now says it. A train made up short of what its card calls for reports what it wanted, how many are waiting in Classification, and how far the Division Yard is from empty; and the yard panel warns you while the shortage lasts.

The Small Yard shows you the train each option would build. Re-ordering a consist used to offer a list of numbers. Each option now shows the resulting train laid out west to east, exactly as the board draws it, with the engine in place — and says whether that train would be ready to leave the Office or held there until it is sorted again. A train may also now be sorted with cars ahead of its engine, which is how you shove a cut into an industry.

Making up a train says which train. The lines were there but every one of them said "the train being made up", so looking back for a particular train found nothing.

A switching turn no longer fills the history with coordinates. It keeps the move that set the crew off, anything set out at or picked up from an industry (named — "at the Freight House"), the Small Yard sort, and a closing line saying what the turn cost and where the crew was left. Every move is still recorded and still captions the board as it happens.

Each role says what it is for. The Freight Agent stocks the green Loading box and frees a jam; passengers board and get off in the Cargo phase, with a Porter; a Laborer moves a load along MEN → AT → WORK. Reaching for the wrong one used to mean finding nothing there and no explanation.

What changed in 0.8.0.13. Games already running on this server are not affected — they resume normally; no rule changed.

A car in the Division Yard can no longer be clicked while your board is behind. When other players have moved and your board is still catching up, the game hides the action list, because choosing against a position that has already moved on is choosing blind. The cars in the Division Yard were the one thing left out of that: a click during somebody else's turn sent a real move against a board several turns stale, and a car left the yard. They now wait like everything else, and the car counts beside the yards show the board you are looking at rather than the one the game has already reached.

There is a button for your own district. The row for looking at another player's Office Area had one for everybody except you, so the player with nothing to do but wait was the only one who could not look at their own board. The buttons are also in map order now — west to east along the Division — rather than the order people joined, and they follow the seating when it rotates between Days.

You are told when the Fedora passes. The Superintendent changes at the end of Stages 3, 6, 9 and 12. It is announced on screen and written into the history now, the same as a train completing its run.

A collision says whose district it happened in and who paid for it. The 5 Revenue penalty was a separate line further down the log, and the wreck itself never named the district.

A Depot that cannot take another passenger explains itself. Stocking one takes a loaded coach out of the Division Yard, and when there is not one there, the option used to vanish from the menu with nothing said. The shortage stays — running out is part of the game — but the panel now tells you how much room is left, that the Division Yard has no loaded coach, and how many are waiting in the Classification Yard for it to run bare.

Smaller. The make-up panel and the New Train tip say "working eastward" rather than "working left", which is the same rule described by the map instead of by a table nobody is looking at. The history panel keeps 90 lines instead of 60, in the same space.

What changed in 0.8.0.12. Games already running on this server are not affected — they resume normally; no rule changed.

A player who cannot get back into their game can be let back in. The only proof of who you are is kept by your own browser, so clearing your browsing data, coming back in a private window, or sitting down at a different browser makes you look like a stranger — an empty lobby, no game code, no name — even though the game is still running and the seat is still yours. The new Restore a Seat action hands you a link for that player; opening it in their own browser puts them straight back where they were. It works once, expires after 30 minutes, and whoever opens it takes that seat, so send it to that person rather than posting it somewhere public. See Restore a Seat below.

What changed in 0.8.0.11. Games already running on this server are not affected — they resume normally; no rule changed.

Making up a train tells you what is left, and why your turn ended. The panel now says what the train still needs rather than only what its card calls for, and says outright that you add one car before the round passes to the next player. The train being loaded is marked on the Division map, and the cars you can add are highlighted in the same amber as every other button — they were always the buttons, but they did not look like it.

A train's arrival says whose Office it reached, instead of telling everyone at the table they can work a train standing in somebody else's district.

You can pause the playback, and look at another player's Office Area. While your board catches up on everyone else's moves, Pause holds it where it is for as long as you like — the move you paused keeps the time it had left — and a button for each player opens their Office Area for a look. The Day, Stage and phase on screen now match the move you are watching, so being five moves behind looks the same everywhere rather than on only half the page. When nobody is being waited on, the screen says what the Division is doing instead of "waiting on nobody".

Saved games are named after the game, with the join code, Day and Stage in the filename.

Smaller things: the LIMITS sign is printed below its card rather than through the middle of the word, the dividing line on a Mainline card can actually be seen, a Restaurant or Hotel next to a Whistle Post now says it is dormant until the Office is upgraded instead of appearing to do nothing, and the version number appears once in the page header instead of twice.

What changed in 0.8.0.10. GAMES ALREADY RUNNING ON THIS SERVER MAY NOT RESUME — this update fixes a rule, and a saved game is replayed through the current rules, so a game that contains a decision the rules no longer ask for stops at that point. Nothing is deleted: the server says which move it stopped at and keeps the file, and re-installing 0.8.0.9 lets such a game be played out.

The fix is worth it. The Superintendent was being asked to rule on a train BEHIND the one leaving, which is nobody's concern — and holding the leaving train kept the only arrival track occupied, so the train behind arrived into it and was destroyed. A train moving away behind you no longer holds you up either.

Watching other players is clearer. While your board catches up on everyone else's moves, the screen names the player whose move you are watching rather than whoever the game is really waiting on, and the history no longer runs ahead of the board — each line appears as its move is drawn, with Skip still showing everything at once. The name on the Division map is readable again. A Realignment now says which card it converted, and that card flashes on the map as it changes. A move made by holding the Superintendent's office says so, and no line names a player twice.

You can save a multiplayer game to a file. The Save replay button on the play screen now works in multiplayer as well as solitaire, and writes the game to your Downloads folder — the same save the Manage Game action hands back as text.

What changed in 0.8.0.9. Games already running on this server are not affected — they resume normally; no rule changed.

The bots are much better opponents and seat-fillers. A bot now plans its whole switching turn before it moves, so it delivers cars to industries that can use them and brings expedited trains home. It stops picking up face-up cards it cannot play, so it actually builds its district, and it lays track where it opens up something to do, including run-arounds. It also no longer runs a Second Section by accident, which was behind many of its collisions.

What changed in 0.7.9.8. Games already running on this server are not affected — they resume normally, and nothing in this update changes a rule, so no saved game stops being playable. (That is the opposite of 0.7.9 below, which did change one. It was checked, not assumed.)

Most of this update is multiplayer, and two of it are things the table could see that only one player should have. The random number that deals the game was announced in the shared history, and a blind draw from the Home Office named the card it drew to everybody, not just the player who drew it. Both are gone.

Your history panel came back empty if you reloaded the page mid-game. The server had the whole log the entire time and was sending it in a field the page never read, while the field the page does read was told there was nothing new. Reload now and your history comes back with you.

During the "play one more Day?" vote, the turn chart named a player at random. That vote is open to everyone at once — anybody who has not voted may vote, in any order — so there is nobody whose turn it is, and the chart said so wrongly while the tally beside it correctly listed everyone still to vote. It now says nobody is being waited on.

A train your Interlocking stopped at your Limits used to disappear from the board. It was still there in the rules — first in line for the next free A/D track — but nothing drew it, so it looked like the train had gone until it reappeared in your Office some Stages later. It now stands at the Limits, marked as held.

Things that are easier to see: trains waiting for a Crew Tray say so, with how many trays are free — a played Extra or an ordered second section used to wait with nothing on screen about it. A Red Flag standing at an Office is drawn on the map, at the end it guards. A Telegraph, Telephone or Radio you have already used today is struck through instead of still advertising its bonus, and tells you when another district is dispatching, since it is the Superintendent's devices that get used. The Campaign Train says whether its speeches are made — before them it stops normally, after them it must be kept at the station. And two from the last playtest session: the Express's "one freight car per location" rule is now explained where it stops you (the panel used to talk about the industry instead, sending you to fix the wrong thing), and westbound trains are drawn in the correct half of a Mainline card.

What changed in 0.7.9. Read this part first: your saved solitaire game may not reopen. Solitaire has always had two collision limits — 3 in a Day and 5 in a game — and the setup screen has always offered them and said that reaching one ends the game in a loss. They were never actually checked. They are now. A saved solitaire game in which trains have collided will therefore refuse to reopen, because the moves it recorded are no longer all legal. Nothing is destroyed: the save is left exactly as it was and the game simply declines to load it, rather than opening something the rules could not have produced. If you have a solitaire game you care about, finish it before updating. Multiplayer games on this server are not affected.

The rest of 0.7.9 is things you can see. The end-of-game screen now asks whether to play one more Day — the question was being drawn underneath the results dialog, so a solitaire player reaching the end of the timetable was never offered it. "Waiting on" now names the person and what they are being asked, instead of saying nobody was holding the game up while it waited on the Superintendent. The game's settings have moved off the top line into a This Game card at the foot of the right-hand column, where all of them are listed rather than the four that fitted; the running collision counts take their place at the top, since those change as you play. The Office Area's show/hide button is now three buttons — auto-hide, always show, always hide — because as a single cycling button it could not reach every setting. The history now reads newest first. And a Heavy Grade card shows which way it climbs, instead of only saying so in its tooltip.

What changed in 0.7.8. The solitaire setup screen now appears for everyone. It was being skipped whenever your browser held a saved solitaire game — and any browser that has ever played holds one — so most players never saw it at all. Clicking Play solitaire now always asks how you want the game set up. Your game in progress is safe: the screen offers Continue saved game, and says plainly that dealing a new one replaces it. Simply reopening the page still picks up where you left off, exactly as before. The homepage footer now names both ways to play, too.

What changed in 0.7.7. Updates to this service now actually reach your browser. Until now every release published its files under the same cache name and the server never told browsers when to look again, so returning players kept running whatever version their browser had already stored — the 0.7.5 solitaire setup screen and its 0.7.6 fix were both installed correctly here and neither was ever seen. If a past update seemed to do nothing, this is why, and opening the page in a private window was the only way to see it. That should not be necessary again.

What changed in 0.7.6. The Play solitaire door on the front page now reliably reaches solitaire. If this browser had ever taken a seat at a multiplayer table, the door used to lose to that game or lobby instead — a plain page load couldn't tell "I clicked Play solitaire" apart from "I reloaded mid multiplayer game". Fixed; nothing else changed.

What changed in 0.7.5. Solitaire now asks before it deals. A genuinely fresh visit to the solitaire page opens a setup screen with the full set of options — game type, starting hand, where an Extra may start, the revenue rates, victory conditions, and the optional rules — the same question the multiplayer lobby has asked before a game starts since 0.7.0, below. Press Deal when you're ready. A saved game, a shared link that already carries a seed, or a link the setup screen itself just produced all skip straight past it — those already answer the question rather than needing to ask it again. Nothing about the rules changed, so every game in progress carries over, both here and on the multiplayer server, without exception.

Setting a game up (new in 0.7.0). The lobby opens on Join a game: type the code you were given and you will see the whole rule set — the opening hand, what the work pays, every way the game can end — before you take a seat. Creating a game instead starts from a game type: Co-op, Competitive or Cutthroat. A type just fills in the rules; every one of them is yours to change, and changing any of them marks the game Custom, which keeps the scoring of the type you started from. The seed, the number of players and the number of Days sit above the type and do not make a game Custom — the targets re-derive from them.

What changed in 0.7.4. Before anything else: a game already in progress may not carry over. These are rules changes, and three of them alter what a saved game is allowed to contain, so an old game may stop replaying. The server declines to resume one rather than breaking it — it says which move it stopped at and leaves the save alone — so if you are mid-game and it matters, finish it before updating or put 0.7.3 back on afterwards. A game that never runs into one of the three carries on as normal.

The Yard Office asks you now. A freight train arriving in your district used to be sent into the yard automatically, whether you wanted it there or not. Now you are asked. Three things it never checked before it does now: it has to be able to reach the yard in one move — if it cannot, you are not offered the choice, and the history tells you why rather than staying silent — and if there are cars standing on the way in, the train hits them, exactly as it would anywhere else. Taking the yard still keeps your Train Order Office free, which is the whole point of the card.

Circus, Campaign and Military trains run loaded. They take loaded cars from the Division Yard while there are any, empties once there are not, and will run short rather than wait. A Circus or Campaign train earns its point for setting up once in each player's district rather than once in the whole game — so a train that tours the Division is worth more than one that parks — and only when every car is full. Not much of a circus if the cars are empty. The Campaign train earns that point for the first time; it never scored at all before, and it needs its candidate aboard.

Red Flags does something else entirely. It used to protect one stopped train out on the line. Now you plant it on the east or west side of your own district, and it holds the next train coming from that way — which is how you buy yourself a Stage to finish switching. It comes down with the train it stops: one card, one train. You can also play it at the moment it matters. If a train is arriving into a certain collision and you are holding the card, the game stops and asks whether you want to flag it; say no and the collision happens.

What changed in 0.7.3. Your games in progress survive this one — unlike the last update, nothing about the deck or the way a game is saved has changed, so a game saved under 0.7.2 picks up where it left off.

The game asks before it ends. When the last Day on the timetable runs out, you are no longer simply told the game is over: you are asked whether to play one more Day. Say yes and you get one Day — not two, not the rest of the evening — and at the end of it you are asked again. In a multiplayer game everybody has to agree, and one "no" ends it there and then, so nobody is kept playing a game they have finished with.

Playing on cannot change who won. The result is decided at the length you dealt the game for. If you set up five Days and carry on to eight, the winner is still whoever was ahead at the end of Day 5, and the results screen says so — everything after that is recorded as what it is, an exhibition. One exception: a game that ends because of too many collisions is over for good and is not offered another Day, whether that happens on a scheduled Day or an extra one. A railroad that has been declared unsafe does not carry on regardless.

The end of a game now tells you what happened. In place of one line and a number there is a full results screen: why the game ended, in plain English rather than a code; who won and by how much; every player's Revenue side by side; the rules the game was actually dealt under, including the pay rates and any optional rules; who did what; and what the railroad managed — trains that ran the length of the Division and how many of them did any switching on the way, loads made up and broken, passengers boarded and set down, cars coupled and set out, and any trains lost to a collision along with the cars that went with them. It comes up by itself when the game ends and there is a button to open it again, so playing on never costs you the results.

What changed in 0.7.2. Before you read on: that update was the one where a game already in progress did not carry over, because the card deck changed size. If you are updating from 0.7.1 or earlier, that still applies to you.

At the table, three things looked different. Crossing a Mainline card is quicker, and counted differently: the speed sign printed on the card was always just scenery, and what decides the time is the number of regions drawn on it — Plains and Double Track one, Curves and Tunnel two, Heavy Grade three unless you have Helpers or Brakeman on it. A train's Fast/Slow rating only matters on the Hilly card now, instead of adding a Stage to every card, so slow trains in particular get across the Division far quicker than they used to. The deck is smaller and holds less track, matching the published card counts, so building a district is a slower business and the cards you draw are worth more. And the Division map is one row you read left to right, west on the left and east on the right, instead of wrapping around the screen — it no longer shows the inside of anyone's district, which is what your own Office map is for, but every train in a district still appears on it, with the ones holding an arrival track drawn on the rail and any crew switching drawn below it.

Leaving, and coming back. Anyone may leave a lobby, and the host can clear a chair, so a mis-join or somebody who wanders off no longer blocks a table that cannot start until every seat is taken. A Leave game button appears once a game is running: it keeps your seat and the table waits for you, and the lobby lists every game this browser is in so you can rejoin it — or join a different one without losing the first. Forget on that list is the one thing that cannot be undone: the token kept in your browser is the only proof of who you are, so a forgotten game cannot be rejoined from that browser.

Get Join Secret

Run this whenever you need the current join secret again, or want to shut out anyone still holding an old one. Every run replaces the secret and immediately puts the new one into effect — players already seated in a game are unaffected, but the old secret stops working for creating or joining games from that point on.

Games in Progress

Shows every game on the server: who is playing, which Day and Stage they have reached, and whose turn it is. It changes nothing, so run it whenever you are curious. It is also how you spot a game nobody is coming back to — one whose last move was days ago, still waiting on a particular player.

Manage Game

Pick a game, then either save a copy of it or end it.

Export hands you the whole game as text and leaves it running. Save that text as a .json file and you can open it in the replay viewer later to watch the game back.

End the game deletes it and disconnects anyone still watching. This is the only way to clear a game that will never be finished — otherwise it sits there, and comes back every time the service restarts. It cannot be undone, so the game's save is handed back to you when it happens: that text is the only copy left, so keep it if the game was worth watching.

Restore a Seat

Use this when a player cannot get back into a game they are already in — they open the page and find an empty lobby, with no game code and no name filled in, as though they had never joined.

That happens because the only proof of who you are is kept by your own browser. Clear your browsing data, come back in a private window, or sit down at a different browser, and that proof is gone — even though the game is still running on the server and the seat is still yours.

Pick the player from the list and this hands you a link. Send it to them, and opening it in their own browser puts them straight back in their seat. The link works once and expires after 30 minutes, and whoever opens it takes that seat — so send it to that person directly rather than posting it somewhere public. If it expires before they get to it, just run the action again.

Games in progress normally survive an update of this service. When the update changes the rules of the game itself, a half-played game cannot be resumed under rules it was not played by, and that game is set aside rather than continued — you would see it disappear from the lobby. Nothing is ever deleted, so going back to the previous version makes it playable again.