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
01
Partner A picks a mood
Expo app · Zustand store
02
Firestore
One couple document, realtime
03
Partner B's app
Live listener while open
04
Shared widget state
One contract · App Group / widget storage
05
Native widgets
SwiftUI on iOS home + lock screen · Android home screen
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.