Inspiration

I wanted a learning app that respects your time. Most "learn something" apps are either endless feeds or heavy courses you never finish. I wanted the opposite: one genuinely useful lesson a day, about five minutes long, the kind of thing you'd actually remember tomorrow. The name comes from "whit", as in "not one whit": a small amount that still counts.

What it does

  • One free lesson every day. Psychology, science, and everyday skills, each followed by a quick check question.
  • Streaks and progress. A streak counter and completed-lesson count build a gentle daily habit.
  • Whit Pro (via RevenueCat). Today's lesson is always free. A subscription unlocks the full archive, so you can reread anything you've finished and catch up on days you missed.
  • Paywall with real offerings. Monthly, Yearly (with a 7-day free trial), and Lifetime packages, loaded live from a RevenueCat offering, plus restore purchases.

How we built it

  • App: Expo / React Native with TypeScript, 10 screens (onboarding, sign up, log in, today, lesson, quiz, archive, paywall, settings, profile).
  • Monetization: the RevenueCat SDK (react-native-purchases) with a single whit_pro entitlement and a default offering. The demo uses RevenueCat's Test Store.
  • Backend: Node.js + Express + SQLite, seeded with 30 lessons. It handles accounts, streaks, and the paywall rule.
  • Server-side entitlement check: the app doesn't just trust itself. After a purchase, the backend asks RevenueCat's REST API (with a secret key that never ships in the app) whether the entitlement is active, and only then serves archived lessons. A webhook route keeps subscription status in sync.
  • Tests: 11 automated backend tests covering auth, the free-vs-premium gating rule, and both billing sync paths.

Challenges we ran into

  • Native dependencies on a brand-new Node version. The SQLite driver wouldn't compile until I upgraded it.
  • SDK versions matter. RevenueCat's Test Store needs a recent SDK, so I upgraded react-native-purchases from v8 to v10 and re-verified the purchase flow.
  • Keeping client and server in agreement. After a purchase, the backend knew the user was premium but one screen still showed the locked state. I fixed it so the UI reads the synced premium status.
  • iOS layout quirks. SafeAreaView ignores padding on iOS, so form fields ran edge to edge until I restructured the layout.
  • Designing the paywall rule. Deciding exactly what's free (today's lesson, always) versus paid (everything else, including rereads) took a few iterations to feel fair.

Accomplishments that we're proud of

  • A complete purchase loop: paywall → purchase → server-verified entitlement → archive unlocks.
  • Keeping the secret key strictly on the server and verifying purchases there.
  • A calm, cohesive design system (mauve, deep plum, teal, cream) that makes it feel like a daily ritual instead of another noisy feed.
  • 30 real, written lessons, not placeholder text.

What we learned

  • How entitlements, offerings, and packages fit together in RevenueCat, and why you verify entitlements server-side.
  • That monetization is product design: the free tier has to feel generous and the paid tier has to feel worth it.
  • A lot about the native build pipeline for React Native (CocoaPods, Xcode, simulators).

What's next for Whit

  • Publish on Google Play and the App Store with real store products connected to RevenueCat.
  • More lesson categories and a longer lesson library.
  • Push-notification reminders to protect streaks.
  • Paywall A/B tests with RevenueCat Experiments to tune pricing.
Share this project:

Updates

Submission history