Built a local-first mood journal in React Native — and the boring sync parts nearly broke it
After tense conversations, I used to open Notes, type half a paragraph, and delete it. Not because the feeling wasn't real—because Notes felt like the wrong container. Too easy to sync into places I didn't want. Too unstructured to help me see patterns later. And every "mood tracker" I tried pulled me toward something else: emoji grids that felt like homework, couple apps that need two people…
After much deliberation, the author had finally found a suitable outlet for their emotional outbursts. Traditional methods like writing paragraphs in Notes proved ineffective, as the platform felt overly accessible and unstructured for the intended purpose. The author had tried various mood trackers, but they all led to disappointment, with emoji grids resembling homework and apps requiring multiple users online or chatty AI coaches that were intrusive.
The author needed a more subdued, private space to express emotions directed at others without turning it into therapy or a social platform. Thus, MoodMO was born—a React Native/Expo application designed for personal use exclusively.
The app is currently exclusive to iOS due to the writer's current resources. In this section, the author delves into the specific challenges faced during development, the decisions made, and the trade-offs that were required to create a trustworthy, privacy-focused product. The primary focus is on the sync and privacy aspects that consumed considerable engineering time.
The author acknowledges that MoodMO is not a comprehensive solution but rather a tool tailored to meet a specific need. They emphasize that it is not a therapy, diagnosis, or crisis support tool. If the reader requires immediate help, they are encouraged to contact local emergency services or a trusted hotline in their area.
The writer deliberately avoids medical framing, conversational AI coaches, or couple co-writing features, opting instead for a single-player loop that records emotions and allows the user to review their entries later. Privacy is a top priority, with no intention to collect or transmit personal data. Entries are stored locally by default, with cloud sync available as an optional feature.
The author addresses the potential concerns around the use of a Groq key for AI processing, explaining that it is present at build time and is a trade-off for the simplicity of the client-side architecture. This key is embedded within the app bundle, making it readily accessible to anyone with access to the IPA. While this is a deliberate decision for an indie app without a backend, the author acknowledges it as a potential security risk that needs to be addressed as the app grows.
The application features a weather component to indicate emotional intensity, a garden for growth visualization, and a people/trigger tagging system to categorize entries. A gentle "when might I talk about this?" prompt encourages users to reflect on their emotions, while a person timeline provides context for their entries. The app also includes a release ritual, allowing users to dispose of words they no longer need, and a small home-screen widget that displays weather and growth stage information without exposing diary text or other sensitive data.
It's important to note that the app does not enforce application-layer encryption for at-rest data, which is acknowledged as a known gap. Soft delete functionality allows users to mark entries as deleted, which can be restored on their device, but purged entries cannot be resurrected from other devices. The cloud table containing tombstones does not have an automatic expiry job, meaning that as long as those rows remain, the guarantee of data permanence holds.
The sync process is deliberate and user-controlled, with separate actions for uploading and pulling data. Users have the option to choose between pushing changes to the cloud or pulling updates, with the latter confirming the replacement of cloud versions on id collision. The widget operates as a hostile multi-process storage, containing only a whitelist snapshot of user data, and it runs independently of the diary entries.
Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.
This story
This is one outlet's version. Read the fullest account.