We made opolyx faster
Dice numbers now appear almost instantly, pages load fast wherever you are, and there is far less waiting between turns.

In plain words
Speed is a feature. We spent a whole push making opolyx feel snappy, and you should notice it the moment you sit down at a table.
Tap "Roll dice" and the dice come alive right away — the numbers used to take a second and a half to settle, and now they land in a blink. Moving on with your turn, buying a property, paying rent: all of it responds the instant you act.
- Dice numbers appear almost instantly after you roll.
- The home page and the guide load fast from anywhere in the world.
- Less waiting between turns once the table gets going.
- No more "the game server is waking up" stall when you open a board.
None of this changes how the game is played — same rules, same board. It just gets out of your way faster.
For the technically curious
Click-to-dice-numbers dropped from ~1.5s to roughly 0.3–0.75s. Two things were stacked: a ~700ms settle animation after the response arrived, and a slow network path. We trimmed the tumble to 250ms, and the acting player now plays the dice optimistically at 0ms, then applies the daemon’s authoritative state and events as soon as they return — no waiting on the slower realtime broadcast.
The bigger win was the network. The game daemon authorizes the player’s own JWT rather than a server secret, so the browser can now call it directly instead of bouncing through a Vercel server action. Direct calls verify the HS256 token locally on the daemon (signature, exp, audience) — auth went from ~40ms to ~1–5ms — and fall back to the server-action relay on any error, so nothing is ever double-submitted.
# Browser → daemon directly (with a verified server-action fallback)
NEXT_PUBLIC_DAEMON_URL=https://opolyxgame-daemon-production.up.railway.app
# Daemon verifies the player's token locally (HS256), ~40ms → ~1-5ms
SUPABASE_JWT_SECRET=<legacy HS256 secret from Supabase → Settings → API>Underneath, the daemon and database now sit together: we migrated prod Supabase from Tokyo to Singapore, co-located with the Railway daemon, so daemon↔db calls are local — auth ~200ms → ~40ms and game work ~250ms → ~45ms. A module-scoped node:https keep-alive Agent holds that connection warm between turns (the first roll of a turn no longer reconnects cold). And every marketing and content page — home, how-to-play, rules, guide, the legal pages, sign-in — is now prerendered per locale across all ten languages, so they serve from the edge cache with no cold-start lambda.
