Inspiration
Knowing what to do was never the problem — everyone answers the quiz right. Mr. Clocktopus is an octopus with eight arms who is somehow always behind, and the app stopped being a quiz that teaches the obvious and became a loop that reaches the evening: a short lesson is only the warm-up; the move you pick at the end, and the honest check-in the next morning, are the product.
What it does
Each lesson (Warm Up, Procrastination Trap, Notification Diet, Deep Work, Sleep & Screens) ends on a move picker: three if-then plans of three sizes — smallest, medium, fuller — with a time of day and an optional single reminder, off by default. Home leads with tonight's move; the check-in opens the next day (Done / Partly / Not this time) and a "not this time" answer offers a smaller move instead of a lecture. Check-ins add pieces to Mr. Clocktopus's tank, which grows through tiers that never drop, with the next tier previewed as a silhouette and an honest count of check-ins to go — no withering, no streak reset, no loss language. Focus Capacity is computed only from the last fourteen days of the user's own check-ins, and a "How is this measured?" page shows the formula. Every move and check-in is the user's: an archive lists them newest first and exports as text or a file. The first two lessons are free in full; Premium opens the rest plus the explanation archive. Nineteen languages, no advertising anywhere (free or Premium), no accounts, no analytics, no countdowns.
How we built it
Expo SDK ~54.0.37, React Native 0.81.5, TypeScript, Expo Router, Zustand, react-native-mmkv. RevenueCat (react-native-purchases ^10.0.1): entitlement premium, offering brilliant_default ($rc_monthly, $rc_annual). Advertising is deliberately off — the app ships in the Design category and shows no ads — but the AdMob module (react-native-google-mobile-ads 15.8.3) and its manifest plugin stay in the build regardless, because Android's autolinking compiles the SDK in whenever the package is a dependency, and its ContentProvider crashes at process start without a valid APPLICATION_ID in the manifest, whether or not the app ever calls it.
Challenges
The same silent-failure class GraceRhythm found first: a production build with no RevenueCat keys does not error, it ships, and the paywall quietly renders as unavailable — so a production EAS profile now refuses to build without both keys rather than shipping that state. Naming was its own challenge — the store title needed to stay under Play's 30-character limit while keeping both the fixed brand ("Clocktopus") and a localized tail ("Focus Habits"), and the home-screen launcher label had to stay just the brand so it would not get truncated to "Clocktopus — Fo..." on narrower launchers.
Accomplishments
A pivot made on a single honest critique ("everyone knows these answers; the point is the habit"): the quiz became the warm-up and a move-plus-check-in loop became the product, in one release. A visible reward that cannot punish — tank tiers only rise, the next one is previewed with a real count — built with zero advertising surface in either tier, and a name that fits Play's title limit in all 19 languages without losing the brand.
What we learned
A "no ads" decision at the product level and a "no ads" decision at the binary level are different problems: the SDK dependency itself, once declared, has to be manifest-satisfied regardless of whether the product ever shows an ad.
What's next
The production release was submitted to Google Play review on 20 September 2026 with the 19-language listing; the subscription products are live on Play and mapped in RevenueCat. The App Store submission reuses the same asset set. Next in the loop itself: a Premium-only look for the tank (cosmetic only, never a faster tier).
Built With
- expo-router
- expo.io
- github-actions
- react-native
- react-native-google-mobile-ads
- react-native-mmkv
- react-native-purchases
- revenuecat
- typescript
- zustand
Log in or sign up for Devpost to join the conversation.