Cherishly — Project Story
Inspiration
Cherishly started from a simple observation: remembering someone we have lost is deeply personal, cultural, and often shared across generations.
A memorial can be much more than a photograph and a date. Families may remember a loved one through stories, voice recordings, religious observances, anniversaries, personal rituals, or simply by revisiting the moments that made that person who they were.
I wanted to build a place that could preserve those memories without forcing every family into the same idea of remembrance.
That meant supporting different ways of remembering — including Gregorian and Hijri dates — while allowing each family to decide what matters to them.
The goal became simple:
Help families preserve the people they love, and remember them together.
What it does
Cherishly is a private memorial and remembrance app designed to preserve more than photographs.
Families can:
- Preserve rich memories — Create private profiles for loved ones with photos, voice recordings, written stories, tributes, and important dates.
- Remember together — Family Circle allows family members to share and contribute to memories rather than keeping them on one person's device.
- Respect different traditions — Cherishly supports culturally relevant remembrance dates, including Hijri and Gregorian calendars, with multi-locale support.
- Create personal remembrance routines — Families can create custom recurring tasks for religious observances, charitable acts, visits, or any personal tradition they want to remember.
- Keep memories available offline — A local-first architecture allows the app to remain usable even without an internet connection, while encrypted backup and synchronization provide additional protection against loss.
- Make remembrance feel personal — The experience was deliberately designed to feel like a place of remembrance rather than a generic photo album, with a bespoke visual language built around warmth, dignity, and continuity.
Cherishly is built around a simple philosophy:
Pay Once, Remember Forever.
There are no recurring subscriptions for the core lifetime plans. The intention is to make remembrance a lasting part of a family's digital life, rather than another service that disappears when a subscription ends.
How I built it
Cherishly is built with Expo and React Native, using Firebase Firestore, Cloud Functions, and Storage for synchronization and backend services, alongside SQLite for local-first persistence.
The application was designed around an important requirement: memories should remain accessible and reliable even when connectivity is imperfect.
For culturally-aware remembrance dates, I researched and cross-checked historical dates against verifiable sources rather than relying on AI-generated datasets. Where historical precision is uncertain, the data is deliberately labeled rather than presented with false certainty.
The Hijri calculation system models lunar-cycle offsets rather than relying solely on a fixed lookup table. For n lunar cycles, the approximate elapsed days are calculated using the mean synodic month:
$$ d = \lfloor 29.53059 \times n \rfloor $$
Family sharing uses a tombstone-based synchronization system, with soft-delete propagation and server-side cascading operations so that changes made on one device can safely propagate across the family.
Monetization & RevenueCat
Cherishly uses RevenueCat to manage its lifetime purchases and premium access across iOS and Android.
I deliberately chose a one-time lifetime purchase model rather than recurring subscriptions:
"Pay Once, Remember Forever."
RevenueCat serves as the purchase and entitlement source across the client applications and backend. Purchases are synchronized through RevenueCat webhooks and Firebase Custom User Claims, allowing server-side security rules to enforce access to premium capabilities.
The architecture also supports discounted lifetime upgrades, so a user who starts with a lower tier can move to a higher tier without simply being charged the full Premium price again.
The client derives active access from RevenueCat's current entitlements rather than assuming that ownership of an historical product ID means permanent access. This helps keep access synchronized when purchases are refunded or otherwise change state.
Challenges I ran into
Making family synchronization trustworthy
Family Circle introduced a level of complexity far beyond storing data in a single user's account.
I had to solve subtle issues involving iOS temporary file paths, asynchronous background processing, Firestore/SQLite timestamp differences, deletion propagation, and synchronization conflicts.
The goal was not simply to make synchronization work when everything goes perfectly — it was to make it behave predictably when devices go offline, files disappear, or changes happen at different times.
Protecting the Premium experience
I discovered and closed a client-side tier bypass that could have allowed a Free user to unlock Premium functionality locally.
That led to a stronger architecture where entitlement information is verified through RevenueCat and enforced server-side through Firebase Custom Claims and Firestore Security Rules.
Protecting identity during purchases
Purchases can occur while authentication state is changing. I implemented explicit identity protection during checkout so purchases are not accidentally associated with an anonymous RevenueCat customer instead of the authenticated family member.
Respecting cultural and religious nuance
Cherishly includes editable starting points such as "40th Day Fatiha" or "Ramadan Charity," but deliberately does not present them as religious authority or universal requirements.
Families remain free to decide what remembrance means to them.
Making recurring remembrance actually recur
A recurring task cannot simply remain marked "complete" forever.
Annual remembrance tasks needed to treat each occurrence as a new event while retaining the history of previous occurrences. Solving this required separating the task itself from the completion state of each individual occurrence.
What I learned
Building Cherishly taught me that a product can require a different standard of care when its users may be preserving memories of someone they have lost.
Technical correctness mattered, but so did the emotional consequences of getting something wrong.
I learned to be much more deliberate about:
- verifying information instead of trusting confident-looking generated data;
- designing for imperfect connectivity and real-world device behavior;
- treating privacy and access control as fundamental product features;
- respecting cultural and religious differences without pretending to speak for them; and
- designing technology around people's memories rather than forcing people's memories into the limitations of the technology.
Most importantly, I learned that "remembering" is not a single action. It can be a story, a voice, a photograph, a date, a prayer, a charitable act, or simply something a family does together.
Cherishly is designed to make space for all of those.
What's next for Cherishly
Cherishly is now available on the App Store, with the Android release progressing through Google Play testing.
The next stage is to deepen the idea of Cherishly as a long-term family memory platform.
I plan to explore:
- a living family tree that connects generations and their stories;
- richer ways for families to contribute memories together;
- short-form video memories, building on the existing photo and voice-recording capabilities; and
- additional ways for families to preserve the stories and traditions that might otherwise disappear with time.
The long-term vision is not simply to create another place to store photographs.
It is to create a place where the people we remember remain part of the stories we continue to tell.
Built With
- aes-cbc
- apple-sign-in
- cloud-functions
- expo-file-system
- expo-image
- expo-local-authentication
- expo-router
- expo-sqlite
- expo.io
- fcm
- firebase
- firebase-auth
- firebase-storage
- firestore
- fluent-ffmpeg
- google-sign-in
- hijri-calendar
- jest
- pbkdf2
- react-native
- react-native-svg
- revenuecat
- sqlite
- typescript
Log in or sign up for Devpost to join the conversation.