Inspiration
The idea began with a tiny moment of panic: an unexpected notification lighting up a partner’s phone. A phone is the closest thing most of us have to a diary, but it is messier and often more honest. Maps remember where we stopped, calendars expose conflicts, photo metadata preserves dates, and deleted conversations are rarely as gone as people hope.
I wanted to turn that guilty intimacy into a mystery game without dressing it up as hacking. The fantasy is not “break into a system.” It is “notice the one ordinary detail that changes how you understand a relationship.”
What it does
Not Your Phone is an anthology investigation game in which every case places the player inside someone else’s fully fictional phone. There is no checklist of clues and no glowing “correct” object. Players move freely through familiar apps, cross-reference details, and answer the protagonist’s questions one at a time in their own words.
In one case, The Bride Missing From the Group, Nao sees a wedding-planning notification on her fiancé Ken’s phone. Their wedding was meant to be a dinner for 12; his messages reveal a shrine ceremony, 42 seats, a paid deposit, and a bride who was never consulted. Across Messages, Mail, Calendar, Photos, Maps, call history, Notes, and more, the player has to work out what happened before the shower stops.
The anthology currently contains 21 playable cases, with 40–76 minutes of play per case, localized in English, Japanese, Korean, and Traditional Chinese.
How I built it
I built the client with Expo SDK 57, React Native, TypeScript, and Expo Router. A reusable phone engine renders a believable home screen, device state, gestures, and a core set of 16 simulated apps. React Native Reanimated and Expo Haptics make interactions such as calendar navigation, photo zooming, music scrubbing, deleted-message recovery, and the question drawer feel tactile rather than decorative.
Each case is authored as typed, declarative JSON and served from PocketBase with a responsive image ladder. This separates story content from the app engine: a new case, locale, clue photo, wallpaper, icon order, or device time can ship without rebuilding the client.
Free-text answers are judged by a Cloudflare Worker using Workers AI. The judge accepts paraphrases across languages and returns correct, near, or wrong, so a player who has the right idea but misses one specific is nudged instead of being told to search for a completely different answer. Exact matches skip inference; model responses use a strict schema at temperature 0; requests are authenticated and rate-limited; and completion is revalidated on the server.
Progress is local-first with AsyncStorage and mirrored to PocketBase. Story content is protected server-side, so changing a flag in the client cannot unlock a paid case.
How RevenueCat powers the business model
RevenueCat is the access-control spine of the game, not just the checkout screen. A single pro entitlement powers the in-world Master Key and is attached to two packages: a yearly subscription with a store-managed free trial, and a one-time lifetime purchase. This gives subscription readers and premium-game buyers different ways to pay for the same clear promise: every case, ad-free hints, and future stories.
The localized RevenueCat Paywall presents both packages, reads prices and offer terms from the store, and can be iterated without shipping a new app build. RevenueCat Customer Center provides purchase restoration and subscription management. Live customer-info updates keep access current after renewals, cancellations, refunds, and restores.
The app starts RevenueCat anonymously, then identifies the player with the same private PocketBase user ID used for progress. RevenueCat webhooks mirror the subscription lifecycle into PocketBase, where the full story payload is gated. That keeps the on-device entitlement and the protected content backend in sync across devices. AdMob rewarded unlocks use a separate signature-verified path, but they coexist with the same access rule: free story, active RevenueCat entitlement, temporary ad rental, or permanently completed case.
Challenges I faced
The hardest challenge was believability. Every simulated app had to behave closely enough to a real phone that the interface disappeared, while the surrounding game retained its own design language. Small interactions—private browsing, archived mail, locked albums, call duration, long-press actions—often mattered more than large visual effects.
The second challenge was writing a fair nonlinear mystery. Evidence can live across several apps, but every answer still needs one defensible interpretation. I built content validators to catch missing evidence, broken references, inconsistent dates, and localization drift before a case reaches players.
The third challenge was natural-language judging. Exact string matching punished correct paraphrases, but an unconstrained model could reward vague guesses. The three-way verdict, deterministic settings, explicit accepted facts, and server-side recheck gave me a practical middle ground.
The fourth was joining store purchases to protected story content. A purchase could activate locally while PocketBase still refused the case. Giving RevenueCat and PocketBase one anonymous user identity, then mirroring lifecycle events by webhook, made entitlement changes reliable without trusting the client.
Built With
- cloudflare
- expo.io
- react-native
- revenuecat


Log in or sign up for Devpost to join the conversation.