Inspiration
Most habit trackers punish you. Miss a day and the streak snaps, the counter resets, the calendar turns red. We wanted the opposite: a tracker where what you have built stays built, and where the record of your effort is something you actually want to look at.
So we borrowed a metaphor from the night sky. Every completed habit lights a star. Hold the rhythm through a month and those stars gather into a celestial object of its own — a nebula, a lone star, an aurora, a comet. Skip a day and the light only dims. It never erases.
What it does
- One screen a day. Today's habits, a couple of taps to close them, gentle reminders at your hour. No feed, no ads, no endless settings.
- A cosmos that grows with you. Each month is rendered from your own data: the steadier the habits, the richer the object. Months are sealed when they end and kept in your collection; year after year they form a galaxy that is only yours.
- A missed day erases nothing. No red failure badges, no counters reset to zero.
- Friends alongside. Add friends, watch their universes grow, share your cosmos as a single image. Profiles are private by default.
- Your data is yours. Full JSON export and one-tap account deletion right in Settings. No ads, no data selling.
- Nebula Plus. An optional subscription that unlocks one exclusive form for your cosmos each month. A month you light with Plus keeps that form for good — even after the subscription ends.
How we built it
- React Native + Expo (SDK 57) for iOS and Android, sharing a single core package (
@nebula/core) with the web app. - React Native Skia renders the cosmos: every object is drawn procedurally from the month's completion data, with parallax star layers and a deterministic seed so a month always looks the same on every device.
- Reanimated + Gesture Handler for the swipeable form tiles, the sky hand-over crossfade between months, and the first-star moment.
- Supabase (Postgres + RLS + Edge Functions) for accounts, sync, friends and monthly snapshots; Sign in with Apple and Google.
- RevenueCat powers Nebula Plus: entitlements, the 7-day trial, restore, and cross-platform state. The paywall closes itself the moment RevenueCat reports the entitlement.
- Sentry for telemetry; a CI of ~2,000 tests, many of them guards that pin invariants of the rendering and billing layers and are proven by mutation.
Challenges we ran into
- Making a month "sealed". The month you light with Plus must keep its form forever, even after the subscription lapses. That meant a server-side snapshot of each month's form at the moment it ends, and a client that trusts the snapshot over the live entitlement.
- Cold start on a cosmos. Rendering a year of procedural objects on first launch was slow; we persist query results to disk and fade the sky in instead of blocking on it.
Accomplishments that we're proud of
- A rendering engine where no two months look alike, and where the design comes from the user's own consistency rather than from a theme picker.
- The "nothing is erased" promise held all the way through the product: no streak-breaking UI anywhere.
- The whole project — web, iOS, Android, backend — built and shipped by one person; the mobile apps went from first store build to a paid release within the Shipaton window.
What we learned
- Reviewers read the first path you give them and stop at the first blocker. Every screen needs an exit.
- A subscription lands better when it adds something to a product that is already complete for free.
What's next for Nebula
A new exclusive form every month for Plus, now on both the App Store and Google Play.
Built With
- android
- expo.io
- ios
- postgresql
- react
- react-native
- react-native-skia
- reanimated
- revenuecat
- sentry
- supabase
- typescript
- vercel