A LITTLE LUCK. A LITTLE STRATEGY.
Find your circle.
Make your move.
Start as a guest, choose two or four players, and bring all four tokens home.
Open the playtestDevelopment playtest. Availability and game settings may change.
YOUR FIRST GAME
From guest to game
Take a seat
Open the playtest and choose Continue as guest. Keep using the same browser profile to return to that guest.
Choose your circle
On the home screen, One on one starts a two-player game. A full circle has four players total. Both choices use free matchmaking; empty seats can be filled automatically.
Roll, then move
Your corner is bottom-left. Choose Roll dice on your turn, then tap an outlined token or its numbered button. A single legal choice moves automatically after the dice reveal.
Finish the circle
Bring four tokens home and follow the turn countdown. The game shows the final ranks. Choose Play again to return home. Confirming Quit game permanently forfeits that match.
02 · PICK UP YOUR GAME
Reconnect with your guest
Reload the same playtest tab to restore your guest and any active match. After a connection interruption, wait for the reconnect message to clear before playing.
Opening the same guest in another tab replaces the earlier connection. Use Continue here only in the tab where you want to play.
Clearing browser site data or changing browser profiles can lose access to the saved guest. A turn can expire while you are away.
03 · TRY A SLOWER CONNECTION
Watch the game catch up
Expand Network demo. Set Server → you or You → server to 150, 400, or 1,000 ms, with optional jitter. Return both to 0 ms and turn jitter off for normal play; reloading also resets the demo.
These controls delay WebSocket messages. They do not simulate login delay, connection setup, or physical packet loss. The server's turn deadline keeps running; late actions may be rejected.
Command round-trip time includes both network directions and any demo delays. It is not a measurement of one-way latency or a promised response time.
FOR CLIENT TESTERS
Public protocol, at a glance
This is a short guide to the player interface. The playtest handles authentication and recovery for you.
| Interface | Purpose |
|---|---|
POST /v1/auth/guest | Register or sign in with a persisted guest credential and client metadata. Retain the login request ID and body when retrying the same attempt. |
POST /v1/auth/refresh | Refresh an existing session. Keep the same request ID and body after an uncertain reply. |
POST /v1/auth/ws-ticket | Exchange an access token for a short-lived browser WebSocket ticket. |
WSS /v1/realtime | Browser subprotocols: ludo.json.v1 and ticket.<ticket>. Never put credentials into a URL. |
session.sync | Load player and configuration state. Wait for session.syncResult before gameplay commands. |
match.join / match.status | Join with {mode: 2, bucket: "free"} or mode 4; check the current assignment. |
game.snapshot | Restore the current game state after obtaining the assigned game ID. |
game.roll / game.move | Send the current gameId and expectedSeq; a move also includes tokenId. |
New domain mutations use a lowercase UUIDv7 requestId. If a reply is uncertain, retry the exact ID and payload. Reconnecting does not create a new match. Apply current server state before enabling another turn action.
First sync message
{
"type": "session.sync",
"syncId": "68bd4724-5e9b-4748-820b-a629c8557a79",
"payload": { "appConfigKey": 1, "configVersions": {} }
}Example only. Generate your own sync ID; later syncs report the configuration versions your client has cached.