I built OsoParty around a simple setup: a group of people together, each with a phone. One person opens a room, shares a six-character code or invitation link, and everyone joins in their browser. There are no accounts to create or apps to install.
Play OsoPartyOpen the live game and start a party
Four Games, One Room
The same party can move between four games:
- CapyTrivia: choose topics and answer multiple-choice questions, then reveal who picked each answer.
- LoroStop: fill categories using a shared starting letter, call Stop, and vote on the group's answers.
- DibuPudú: take turns drawing a secret word while everyone else guesses. Faster correct guesses earn more points.
- MichiSus: share clues, discuss who seems suspicious, and vote to find the hidden impostor without giving away the secret word.
The host can add a room password or hide the code while streaming. Party chat stays alongside the games, and Infinite mode lets the group vote on what to play next. A pack editor supports custom content, import and export, so a game night can use the group's own questions and words.
Shared Rules, Real-Time Rooms
My work spans the React, TypeScript and Vite client, the shared game engines, and the multiplayer service on Cloudflare Workers. Each party has its own Durable Object, with WebSockets connecting the players to that room.
The rules live in deterministic TypeScript packages that run in both the browser and the server. They do not read the DOM, open network connections, or own their own clocks. The application supplies those effects, keeping the rules testable without a browser and avoiding a separate implementation for each environment.
The server applies player actions and sends each person only their own view of the game. A secret role or unrevealed answer must stay off another player's connection, rather than simply being hidden in their interface. Drawing adds another real-time path: strokes need to reach the room while guesses, timers and scoring continue alongside them.
A Party in Three Languages
OsoParty supports English, Spanish and Brazilian Portuguese. Each player chooses their interface language, while the host separately chooses the language of questions and words. That distinction lets people share a room without forcing every phone to use the same interface.
Gameplay, drawings and chat stay in room memory instead of becoming a saved history. The device can remember a display name and a draft from the pack editor; those preferences are separate from the live game state.
Motion, Sound and Testing
The interface uses Motion with reduced-motion handling, canvas drawing, and Web Audio feedback. I authored the sound cues with Nielo SFX, connecting one of my creative tools to a playable project.
Vitest exercises the game rules, while Playwright covers multiplayer flows and axe checks accessibility. The engineering focus is keeping the shared state consistent across phones while protecting the information each player is supposed to keep secret.

