Following a routine day by day
I built Roona as a skincare journal that connects daily routines with a longer-term record. Today shows the routines due, their product steps, and what you've completed. You can also record how your skin feels and take progress photos, keeping observations alongside the routine history.
Routines is where you organize morning, evening, or custom plans, set schedules and reminders, and pause a routine. The Shelf view holds your products; Progress brings the journal history and photos together for looking back. The screenshots below show example routines and products.
A journal that works locally
Recording a routine step shouldn't depend on a network request. Roona keeps its working copy in SQLite, using Drizzle for the data layer. Transactional writes save a journal change and its sync outbox entry together, so an offline action can wait for account sync. Supabase handles that sync separately from the local recording flow.
This means the interface has to distinguish an empty journal from one that's still loading or has failed to load. A failed local read gets a retry state rather than an invitation to start over. Completion indicators come from the saved journal data, keeping Today and the routine history tied to the same record.
Shared UI, native boundaries
Roona uses Expo and React Native with Expo Router. Shared components and semantic colors keep Today, Routines, and Progress consistent in light and dark themes, while translation resources support English and Indonesian. RevenueCat manages tracker capacity and optional Plus services separately from the journal data.
Camera and purchase integrations require a native development build. Expo Go and web can't stand in for checking those interactions, and real camera capture needs a physical device. That boundary matters for a journal where photos are part of the record, not just decoration.

