Skip to content

Personal project · 2026

MoodUs

A couples' mood-sharing app where the widget is the product: how your partner feels, at a glance, on your home and lock screen.

Role
Sole engineer and designer — brand, architecture, iOS and Android widgets
Year
2026
Status
In progress
Stack
React Native · Expo SDK 57 · TypeScript · Zustand · Firebase · Cloud Functions · SwiftUI WidgetKit · Expo native modules

The problem

Couples want a quiet sense of how the other person is doing, without opening an app. The app itself stays thin; the widget carries the product.

Approach

Widgets are native, so one shared widget-state contract is rendered twice: in SwiftUI for the iOS home and lock screens, and as an Android home-screen widget. A custom Expo native module bridges the app and the iOS widget through an App Group.

The data layer started mock-first behind a swappable interface, so the whole app ran before Firebase existed; the real implementation then dropped in without touching the screens. Firestore rules validate a blind-join pairing flow.

I chose a brand-new Expo SDK on purpose and wrote down the fallback: validate every native library as it is added, and downgrade if one blocks. None did.

How it flows

  1. 01

    Partner A picks a mood

    Expo app · Zustand store

  2. 02

    Firestore

    One couple document, realtime

  3. 03

    Partner B's app

    Live listener while open

  4. 04

    Shared widget state

    One contract · App Group / widget storage

  5. 05

    Native widgets

    SwiftUI on iOS home + lock screen · Android home screen

  6. 06 · Next

    Push refresh

    Updates widgets in the background — next phase

What I built

  • Invite-code pairing with anonymous auth
  • Realtime mood, status and a live timer
  • A miss-you counter and a “together” status
  • iOS home and lock-screen widgets and an Android home-screen widget
  • Ten written architecture decision records

Where it stands

Running on iOS and Android with live Firebase, and the widgets work on both: iOS home and lock screen, Android home screen, verified on the simulator and emulator. Next: push-driven widget refresh and real-device testing.