Inspiration
A prayer app that treats every Christian tradition as equally worth getting right, in that tradition's own words — Catholic (Latin or Eastern), Orthodox, Oriental Orthodox, Anglican, Lutheran, Reformed, Baptist, Methodist, Pentecostal, Evangelical, Mar Thoma, Assyrian Church of the East, or simply Christian — without ranking one as more complete than another, and without turning a missed day into a penalty.
What it does
GraceRhythm keeps a prayer rule of four fixed moments a day — morning, noon, evening, night — with guided sessions, a silence timer, a private prayer list (people, needs, promises, and how a prayer was answered), and a journal for reflection, gratitude, confession, intercession and answered prayers. Each kept moment lights a candle on a 28-day shelf: candles move through four kinds — tallow, beeswax, brass, gilded — as the cycle fills, a lit candle never goes out, a missed moment takes nothing away, and the shelf says honestly how many more moments the next kind needs. A follow-up card returns, gently and only in-app, to a prayer added days earlier and asks one thing: has anything changed? A library carries starter packs, tradition-specific packs and seasonal cards (Advent, Lent, Holy Week, Easter, Pentecost, ordinary time). Orthodox readers get a liturgical calendar with the fast of the day, the saints of the day and a name day. The app ships in 19 languages, keeps reminders off until the user turns them on, respects quiet hours, and never penalizes a missed day. There is no account and no analytics: the prayer rule, list and journal stay on the device, exportable or erasable at any time.
How we built it
Expo SDK ~54.0.37, React Native 0.81.5, TypeScript, Expo Router, Zustand for state, react-native-mmkv for local storage. Monetization runs on RevenueCat (react-native-purchases ^10.0.1): entitlement premium, offering default ($rc_monthly, $rc_annual — the annual plan carries the free trial shown on the store's own subscription screen). The free tier shows one AdMob banner (react-native-google-mobile-ads 15.8.3) in the Library and an opt-in rewarded video that unlocks one premium session until midnight; premium removes advertising entirely. Ads sit behind a build-time kill switch (EXPO_PUBLIC_ENABLE_ADS), and a release build without both RevenueCat keys refuses to build rather than shipping a paywall that silently reports "unavailable."
Challenges
Android's ad SDK turned out to be linked into the binary by autolinking regardless of whether the kill switch was on — so turning ads "off" by skipping the config plugin produced a guaranteed launch crash (MobileAdsInitProvider throws on an app process with no valid APPLICATION_ID in the manifest, before the first activity draws), while turning them "on" without an app ID crashed on a different check. The fix has the plugin always registered and the AdMob application ID always written, with the SDK's own tracking-permission plugin gated separately. A second, quieter failure: a production build with no RevenueCat keys did not crash at all — it built, shipped, and the paywall rendered its calm "not available" branch with nothing in the logs. Both are now hard build-time gates instead of runtime surprises.
Accomplishments
Nineteen languages with tradition-specific vocabulary that does not default to one denomination's terms; a monetization path with no dark pattern — no streak penalty, no countdown, no forced ad, no "last chance" language; a candle shelf that rewards without ever punishing (tiers only rise, nothing withers, the next tier is previewed with a real count); and a release pipeline that refuses to produce a broken build silently, for either the ad SDK or the paywall — including a bundle probe that proved the ad unit ids were being configured but never compiled in, and fixed it.
What we learned
A kill switch that only ever gates code paths is not enough for a linked native SDK — the manifest has to satisfy the library whether or not the feature is used, and the only reliable way to find that out was a crash log from a release APK, not a reading of the SDK's own documentation.
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.
Built With
- admob
- expo-router
- expo.io
- github-actions
- react-native
- react-native-google-mobile-ads
- react-native-mmkv
- react-native-purchases
- revenuecat
- typescript
- vitest
- zustand
Log in or sign up for Devpost to join the conversation.