Eight people, one phone, zero installs. Party Challenges is a free 18+ browser party card game we built as a PWA. Over 1,000 cards across 23+ decks, no accounts, runs in any mobile browser. One of the game modes, Hot Seat, cycles the phone around a table. Each player draws a card, reads it aloud (or bluffs), and passes.
We ran an eight-person playtest in a real living room. The core loop held up. The edge cases didn't.
Late joiners
Nobody sits down at a party at the same time. Player six showed up after round three. We had two choices: restart the session (everyone groans, someone already answered their most embarrassing confession) or insert them mid-rotation.
We went with mid-rotation insertion. The host taps Add Player, types a name, the new player enters the cycle after the current turn. Card history stays intact. No repeats, no lost progress.
The bug we hit: the rotation index shifted when a player was added, so the next person got skipped. Classic off-by-one in a loop. Took twenty minutes to find because in a three-person test it never triggers. Only when the insertion happens at certain positions in a larger group does the index math break.
Deck mixing
Party Challenges ships 23+ themed decks: Truth Bombs, No Chill, Hot Takes Only, Confession Hours, Flirt Mode, After Dark. When a group selects three or four decks at once, a naive shuffle creates streaks. Seven confessions in a row, then nothing but dares for ten minutes. The energy goes flat.
We added weighted interleaving. Each deck gets draw probability proportional to its card count, with a max-two-in-a-row constraint per deck. During the eight-person test, nobody commented on the pacing. They didn't notice the algorithm. They noticed the game didn't drag.
Accidental back-swipes
Pass-the-phone means the device changes hands constantly. People hold phones differently, accidentally trigger browser back navigation, pull down the notification shade, or hit the home button.
PWA fullscreen mode (display: standalone in the manifest) helped with some of it. We also disabled pull-to-refresh with overscroll-behavior: none and handled the popstate event to prevent accidental back navigation from killing the session.
What we couldn't prevent: someone locking the phone. On iOS, when the screen locks and unlocks, the PWA sometimes reloads from cache and loses in-memory state. We moved session state to sessionStorage as a fallback. If the page reloads mid-game, it picks up where it left off. Same player rotation, same dealt cards, same position in the deck.
Screen timeout
Eight people means longer rounds. With five-second-per-player turns that's forty seconds between your turns. But some cards spark a group conversation. Two, three minutes pass before someone remembers to tap Next. The phone sleeps.
We request a wake lock (navigator.wakeLock API) when a session starts. It's not supported everywhere (roughly 85% of mobile browsers at this point), but where it works, the screen stays on for the duration of the game. Where it doesn't, we show a small "tap to keep awake" nudge every 90 seconds of inactivity.
Offline at a house party
Not every apartment has reliable WiFi. Party Challenges is a PWA with a service worker that caches the card database on first load. Once cached, the entire game runs offline. No server calls during play. Card content, player state, deck selection, all local.
The catch: analytics calls. We fire page-view and card-draw events to track which decks get played. Without connectivity, those calls failed silently, which was fine. But the retry queue grew and caused a noticeable lag spike when the phone reconnected to WiFi mid-game. We capped the offline event queue at 50 entries and drop-oldest after that.
What held up
The core loop (draw, read, pass) was solid from the start. The single-device constraint actually simplified the architecture. No WebSocket sync, no conflict resolution, no "waiting for player 4 to reconnect." One phone, one state, one source of truth.
The three game modes (Hot Seat for group rotation, No Hesitation for speed rounds, Spin It for random targeting) each carry their own timer and rotation logic, but they share the same card pipeline and session state. Adding a new mode means writing a turn controller, not rebuilding anything.
Party Challenges is a free 18+ browser party card game with 1,000+ cards across 23+ decks for friends, couples and solo play. Try it at partychallenges.com.
Top comments (0)