Inspiration

Anxiety rarely arrives as one big crisis. It shows up as a racing mind at 2 a.m., a message a manager hasn't answered, a thought loop you can't put down. Most wellbeing apps ask you to meditate for ten minutes or fill in a mood chart. MoodPalz was built for the other moments: the sixty seconds when you need something to hold on to right now.

MoodPalz is a calm companion for iPhone. A small cloud mascot, a handful of fast tools, and an AI companion that listens before it suggests anything.

What it does

  • SOS mode. One tap from the home screen into guided box breathing and a 5-4-3-2-1 grounding walk. Built for a panic spike, finished in under a minute.
  • Quiet a thought loop. A short, structured flow that separates the facts from the fears in one worry, then hands it to the companion if you want to talk it through.
  • Talk to MoodPalz. An AI companion trained on a warm, non-clinical system prompt: no advice lists, no "I understand" openers, under 120 words, and a clear line that it is not a crisis service.
  • Brain dump and Park a worry. Get it out of your head, set it down, and come back when you're ready.
  • Daily check-in and patterns. A three-tap mood check-in, weekly patterns, and a history of every hard moment and what helped.
  • Affirmations. Optional once- or twice-daily nudges.

Sign-in is passwordless: Apple, Google, or an email code.

How we built it

  • App: React Native with Expo (SDK 56), TypeScript, expo-router, react-query, Zustand.
  • Backend: Django REST Framework on PostgreSQL, deployed with Coolify behind Cloudflare Tunnel, with OpenTelemetry logs and analytics in PostHog.
  • AI: Google Vertex AI. The companion runs on Gemini 3.5 Flash-Lite with an automatic fallback to Gemini 3.1 Flash-Lite. Conversation turns are sent as structured roles so user text can never impersonate the system prompt.
  • Auth: Clerk, with the new Expo v4 API and email one-time codes.
  • Monetization: RevenueCat end to end.

RevenueCat

MoodPalz Pro is a single subscription group with a weekly and a yearly plan, both with a 14-day free trial, sold through one RevenueCat offering with $rc_weekly and $rc_annual packages.

  • The paywall reads prices, trial eligibility and the trial timeline from RevenueCat offerings, so the app has no hard-coded prices.
  • Access is gated by a single entitlement, Moodpal Pro. The Django backend receives RevenueCat webhooks and is the source of truth for entitlement state, including the billing grace period, so a mid-session lapse sends the user cleanly back to the paywall.
  • A /subscriptions/sync endpoint reconciles the client after a purchase or restore.
  • RevenueCat's Test Store let us develop and screenshot the full paywall in the iOS simulator with realistic prices, no sandbox account needed.
  • App Store product metadata, review screenshots and pricing were checked through RevenueCat's store-state tools before submission.

Challenges we ran into

  • The model queue was full. The first companion model was a Gemma model served as-a-service on Vertex. On three separate days it answered 429 RESOURCE_EXHAUSTED from the shared pool and every chat failed for our first tester. We added SDK retries with backoff, a fallback model, a timeout ladder that fits inside the worker timeout, and a client that quietly retries once and never loses the user's message. Then we ran a bake-off of every model the project could call, scored on warmth, rule-following and safety on ten companion scenarios, and moved to Gemini 3.5 Flash-Lite, which answered every scenario and costs well under a cent per reply.
  • Passwordless everything. Clerk's email-code flow, Apple and Google sign-in, and an App Review process that assumes a username and password. We wrote the review notes to explain it and attached a walkthrough video.
  • Getting a mental-health app through review prep. Age rating, App Privacy declarations for health data and user content, subscription review screenshots, and dropping iPad support so iPad screenshots weren't required. Every one of those turned out to matter.

Accomplishments that we're proud of

  • The SOS flow really does finish in a minute, and it works with no network.
  • Zero hard-coded prices, zero hard-coded entitlements. Change a plan in RevenueCat and the app follows.
  • A companion that stays warm under pressure. In our scenario tests it pointed a user in crisis toward real help without lecturing, every time.

What we learned

  • "Serverless" model endpoints still have queues. Design for the 429 on day one.
  • A paywall should tell people what happens on day 12 and day 14, not just today. Ours shows the whole trial timeline and the reminder is on by default.
  • Reliability is a stack of small things: retries, a fallback, sane timeouts, and an app that keeps your words when something fails.

What's next for MoodPalz

  • Android, using the same RevenueCat offering.
  • Widgets and a lock-screen SOS shortcut.
  • Gentle streak-free progress views and shareable "what helped" cards.
  • Localized paywalls and pricing experiments with RevenueCat Experiments.

Built With

Share this project:

Updates

Submission history