Push your phones together. They become one screen.

Inspiration

Put a group of friends around a table and, sooner or later, everyone is looking down at their own phone. We wanted to flip that: what if the phones were the reason everyone leaned in over the same table?

The answer was lying right there. Phones set down side by side already look like the tiles of a board; they just don't know about each other. Make each one aware of its neighbours and every pocket holds a piece of a shared game board, one that grows with every friend who joins.

What it does

An object crossing the gap between two phones

Bubble Games is a party game where the board is everyone's phones put together. Two to eight players lay their phones on the table and the screens join into one big playing surface: anything that leaves one screen crosses the gap and carries on onto the next.

It comes with 10 competitive minigames, and the twist is that every game rearranges the phones into a different board:

  • Pitch Cars: the phones form a winding race track that is randomly generated every round. Flick your car from phone to phone.
  • Hot Potato: phones in a ring. Swipe the potato to a neighbour before the fuse runs out.
  • Flood: two rows facing each other, two teams, one waterline. Tap to push it onto their screens.
  • Guac-a-Mole: avocados in your colour pop up on everyone's phone, so you play it leaning across the table.
  • …plus Paint War, Arena, Dodgeball, Cops & Robbers, Marbles Madness and Road Runner.

Game 1 Game 2

Between rounds, each phone shows where it goes next, with coloured stripes to line up against its neighbours. Any mix of phones works: the game knows every screen's real size in millimetres, so a marble is the same physical size on all of them.

Row and grid layouts Ring and path layouts

No account and no server. One phone hosts, and the others join over the same Wi-Fi or a hotspot with a QR code.

Free to play, one upgrade

Bubble Games is free, with six minigames ready to play out of the box. A one-time $3.99 USD upgrade unlocks the rest:

  • Four more minigames, for ten in total. (And more to come)
  • Pick your games. Choose exactly which minigames make up the session instead of leaving it to the lineup.

And the best part?

Only the host has to pay for premium! All the other players tag along!

We believe in good old fashioned games that aren't subscription based, and so we are proud to say that BubbleGames Premium requires NO SUBSCRIPTION: pay once and it's yours forever!

How we built it

We are a team of four software engineering student from Université Laval in Québec City. We used Flutter for its cross-platform mobile support, with Flame, Forge2D for physics and Rive for animation.

Under the games sits a small game engine we wrote:

  • One world, in centimetres. The host phone runs the only simulation, at 60 Hz. Every phone is a camera onto its own slice of that world. Physics keeps running in the gap between two screens, because the bezel is real space.
  • A layout engine. Each game asks for a shape (row, grid, brick, ring or random path) and the engine computes where every phone goes from its real dimensions.
  • A purpose-built game SDK. A game only declares how many players it takes, where the phones go, its rules and its pixels. Adding one is a folder and one line; networking, sync, layout and scoring never learn its name.
  • Local-only networking. WebSockets over the LAN, with discovery over UDP broadcast and Bonjour. No server and no HTTP requests, except for payments.

Scheme

Monetization with RevenueCat

One purchase, whole party unlocked. The game is a party game played across several phones, so the paywall had to fit that. The host buys Premium once, and every player who joins gets the premium games. Nobody else has to pay.

How RevenueCat is used

  • One entitlement, one product. A single premium entitlement gates the premium-tier games. It's sold as a one-time lifetime purchase with no subscription, and the paywall shows the localized price from the store.
  • Offerings drive the paywall. The paywall reads the current Offering and picks the lifetime package, so we can change price or packaging in the RevenueCat dashboard without shipping an app update.
  • One source of truth. A small PremiumStatus notifier initializes the SDK with the right key for iOS/macOS or Android. It listens to RevenueCat's customer-info updates, so the UI unlocks the moment an entitlement becomes active, even if the purchase finishes elsewhere.
  • Restore purchases. Restore returns a typed outcome (restored, already active, nothing found, offline, failed), so each case gets a clear message instead of a generic error.
  • Failures don't block the game. Store calls have a 10-second timeout and a retry path. A cancelled purchase is not treated as an error, and a missing or misconfigured key shows a friendly message instead of crashing.

The paywall

A sticker-style bottom sheet that matches the game's look. It lists the locked games as chips, shows the price, and has an Unlock Premium button plus Maybe later and Restore purchase links. It can be opened from a specific game ("X is a premium game…") or from the lineup picker.

## What we learned
RevenueCat removed the receipt validation and cross-platform entitlement logic we would otherwise have built ourselves. Most of our work went into the edge cases: offline restore, cancelled purchases, and keeping the UI in sync with the entitlement.

Challenges we ran into

Making the seam invisible. If each phone draws the latest state it received, an object steps sideways as it crosses the gap. So every phone, the host included, renders the world 80 ms in the past and interpolates between snapshots. 80 ms was the sweet spot: enough to hide network jitter, short enough to still feel responsive. One early version drifted by 0.8 mm between phones running at different frame rates; a test caught it.

Phones don't know how big they are. Flutter only reports an approximate pixel density, and a few percent of error is several millimetres of misalignment. We read the real DPI natively, and you can calibrate by holding a standard physical card against the screen.

The layout algorithm. It has to minimize the gaps between phones while maximizing the playing surface, with phones of different sizes, for any player count from two to eight.

NameDrop. Put the tops of two iPhones together and iOS covers the game with a contact-sharing sheet. This is enforced at the OS level and cannot be disabled automatically by the game. When triggered, this exits the game (quite problematic). To overcome this we use a clever algorithm that calculates the optimal phone configurations and picks the one that keeps the antennas apart.

Accomplishments that we're proud of

Bubble Games isn't a hackathon demo we'll forget next week. It's become our go-to party game: the phones come out at the end of the night, and nobody's looking down at their own screen anymore. Our friends ask for it by name, and some of the best moments we've had building this weren't writing code, but losing to them at our own games.

We're also proud of the engine underneath: all ten games are built on the same SDK, so a new game idea goes from sketch to playable on a table of phones without touching any existing code, networking or layout.

What we learned

This project taught us what it takes to ship a mobile app from A to Z. We went from a napkin idea to ten playable games, and we made everything ourselves along the way: the code, the art, the animations and every sound effect. Nobody on the team had done that before. We had to make product decisions ourselves too: which games make the cut, what's free and what's premium, and what a first-time player sees in their first thirty seconds.

The technical side stretched us just as much: real-time networking with no server, physics that has to agree across phones to the millimetre, native code to measure screens, and the geometry behind the layout engine. We started out using game engines; we came out knowing how to build one.

What's next for Bubble Games

  • Ship it to the App Store and Google Play, with the premium upgrade already wired in. We are halfawy through! The app is already submitted to both posts and pending review!
  • Open the SDK. We already build every game with it. Next is letting the community create their own games with pre-selected assets and sounds, and publish them to other players in one tap, like Geometry Dash's level editor.
  • More games !!

Built With

  • flame
  • flutter
  • forge2d
  • revenuecat
  • rive
  • soloud
+ 2 more
Share this project:

Updates

Submission history