
GUILTY
A Forza in-house product: a real-time multiplayer party-games suite, on mobile and web.
The idea behind our own product: what it explores and why we built it.
The project
Guilty is a Forza in-house product: a party-games suite for groups. It bundles eight games —truth or dare, never have I ever, would you rather, most likely to, tipsy, tower, mixed and a social-deduction impostor— in an iOS and Android app (Flutter) and on the web, with live multiplayer rounds of 2 to 12 players and English/Spanish support. We built it to explore real-time cross-platform multiplayer end to end: state synced over WebSocket, rooms that work even without internet, and a freemium model with in-app purchases and Stripe. It's live on guilty.mx, on the App Store and on Google Play.
What they came to solve, in plain language.
Challenge
- 01Sync rounds in real time across many players, without the state drifting.
- 02One product across iOS, Android and web, with the same game logic.
- 03Rooms that also work without internet (local / LAN mode).
- 04Eight different games sharing one game engine.
The pieces that make the product work.
What we built
Live multiplayer
One player opens a room, the others join with a code and play live: turns, votes and phases sync instantly across everyone. The backend runs on Cloudflare Durable Objects with WebSocket, and with no internet the host spins up a local (LAN) room with no server.
- Rooms with an invite code
- Synced turns and votes
- Host view and player view
- Fallback to a local room with no internet (LAN)
A suite of 8 games
Truth or dare, never have I ever, would you rather, most likely to, tipsy, tower, mixed and a social-deduction impostor (Among Us style). All share one game engine, with chill and guilty modes.
- 8 games on a shared engine
- Social-deduction impostor
- Chill and guilty modes
- Content editable from an internal tool
Mobile and web, one product
Native iOS and Android app with Flutter (published in the stores) and a web version with React Router 7, sharing the same game logic and the same backend. Players join from anywhere and play together.
- iOS and Android (Flutter, in stores)
- Web with React Router 7
- Same backend across all platforms
- Spanish and English
Freemium in the stores
A complete freemium model: free chill mode and premium guilty mode by subscription. In-app purchases on iOS and Android and Stripe payments on web, with subscription state synced across platforms.
- In-app purchases (iOS / Android)
- Stripe payments on web
- Subscription synced across platforms
- Free trial and no-cost chill mode
How we built the product, step by step.
Process
- 01
Concept
We defined the product: which games, how group play works and what makes live multiplayer special. An in-house experiment to push real-time cross-platform.
- Games and modes definition
- Rounds and rooms model
- 02
Architecture
A Flutter app (clean architecture + BLoC) for mobile and a real-time backend on React Router 7 over Cloudflare Durable Objects and WebSocket, with Prisma/PostgreSQL for data.
- Flutter app + real-time backend
- Sync protocol
- 03
Game engine
Each game as a state machine (phases, turns, votes) on a shared engine, so new games drop in without rewriting the round logic.
- Shared round engine
- 8 games implemented
- 04
Multiplayer
Live rooms over WebSocket on Durable Objects, with host and player views, and a fallback to a local (LAN) room when there's no internet.
- Synced online rooms
- Offline local mode
- 05
Launch
Published on the App Store and Google Play, web live on guilty.mx, and the freemium model with in-app purchases and Stripe active across all platforms.
- iOS, Android and guilty.mx live
- Freemium live (IAP + Stripe)
- 01
Concept
We defined the product: which games, how group play works and what makes live multiplayer special. An in-house experiment to push real-time cross-platform.
- Games and modes definition
- Rounds and rooms model
- 02
Architecture
A Flutter app (clean architecture + BLoC) for mobile and a real-time backend on React Router 7 over Cloudflare Durable Objects and WebSocket, with Prisma/PostgreSQL for data.
- Flutter app + real-time backend
- Sync protocol
- 03
Game engine
Each game as a state machine (phases, turns, votes) on a shared engine, so new games drop in without rewriting the round logic.
- Shared round engine
- 8 games implemented
- 04
Multiplayer
Live rooms over WebSocket on Durable Objects, with host and player views, and a fallback to a local (LAN) room when there's no internet.
- Synced online rooms
- Offline local mode
- 05
Launch
Published on the App Store and Google Play, web live on guilty.mx, and the freemium model with in-app purchases and Stripe active across all platforms.
- iOS, Android and guilty.mx live
- Freemium live (IAP + Stripe)
The product by the numbers.
By the numbers
Truth or dare, never have I ever, would you rather, most likely to, tipsy, tower, mixed and impostor — all on the same engine.
Native app in both stores (Flutter) and a web version (React Router 7), with the same backend.
2 to 12 players in the same real-time round, with a fallback to a local room without internet.
The host spins up a LAN room and players join with no connection — the party goes on even if the wifi drops.
Screens of the product.
How it looks
The stack behind the product.
Technologies
- Flutter
- Dart
- BLoC + GetIt
- React Router 7
- Cloudflare Durable Objects
- WebSocket
- Prisma + PostgreSQL
- Stripe
- In-app purchases
- i18n (ES/EN)
Want something like this for your business?
If this case clicked for you, let's talk. We reply within one business day, no strings attached.