Using BLE to play poker on flights is a clever workaround
The technical goal was simple: zero internet dependency. I specifically designed these apps so they don't even request internet permissions in the manifest, which means no telemetry, no tracking, and no "connecting to server" spinners while you're at 30,000 feet. To make this work across both iOS and Android, I went with BLE. It's a bit of a pain to implement compared to standard sockets, but it's the most reliable way to handle cross-platform discovery and multi-player synchronization when you're essentially in a Faraday cage.
I've released two games so far: a Poker app and Liar's Dice. For the Poker implementation, the BLE stack handles the deck distribution and bet synchronization. Since there's no central authority, the host device manages the game state and broadcasts updates to the joined clients.
If you want to try them out, here are the links:
Poker:
iOS: https://apps.apple.com/us/app/airplane-mode-poker/id6791247916
Android: https://play.google.com/store/apps/details?id=de.testco.airplanemode.pokerLiar's Dice:
Android: https://play.google.com/store/apps/details?id=de.testco.airplanemode.liarsdiceFrom a deployment perspective, the biggest challenge was ensuring the connection didn't drop when the phone screen timed out, as some OS versions are aggressive about killing BLE background processes. I had to optimize the heartbeat interval to keep the session alive without draining the battery too quickly.
The monetization is straightforward: it's a $2.99 one-time fee if you want to be the host, but joining a game is completely free. This keeps the barrier to entry low for the group.
Now that the BLE framework is stable, I'm looking at adding more titles. A simple trivia engine or a card-based strategy game would fit perfectly into this local-only AI workflow. The real beauty here is the privacy—since the app literally cannot access the web, your game data never leaves the cabin. It's a practical tutorial in how to build "dumb" apps that actually solve a specific UX problem.