-
-
Icon
-
Main screen with daily reflection (light wellbeing theme)
-
Main screen with daily reflection (dark wellbeing theme)
-
Voice and text emotion analysis
-
Voice analysis, habit and wins detection (light wellbeing theme)
-
Voice analysis, habit and wins detection (dark glass theme)
-
Insights & wins
-
Insights & sleep patterns
-
Sleep x mood correlations details
-
HRV x mood details
-
Statistic
-
Statistic
-
Smart notifications after walk
Inspiration
I tried a bunch of journaling apps, and most of them were exactly that: a place to put text. You write, it saves, maybe it tags a mood. But I didn't only want to write things down. I wanted to see things: does a bad night of sleep show up in how I feel the next day? Do I actually feel better on days I move? The data was already sitting in Apple Health, and no journal was connecting it to what I was saying.
Then there was the voice. When I talk about my day, how I say it often says more than the words. A flat "I'm fine" after four hours of sleep is not fine. I couldn't find a journaling app that listened to the voice itself, so I built one.
What it does
You talk (or type) for a couple of minutes. That's it.
It understands the entry. Emotions, topics, a short summary, and a follow-up question if you want to go deeper. With Pro, you also get daily, weekly and monthly insights about your entries.
It listens to how you sound. Pitch, energy, pauses, speech rate and other voice markers are measured on your phone, alongside an on-device ML model for vocal emotion, and compared with your own baseline, not an average person's. A "Voice analysis" card describes how your tone landed next to your words, and points out when they don't agree. Free for everyone.
It connects mood to your life. Sleep, steps, heart-rate variability and workouts from Apple Health, lined up against your mood. A pattern only shows up if the statistics actually hold; otherwise the app tells you it needs more data instead of making something up.
It logs habits you mention. Say "went for a run" and the habit ticks itself (with undo).
It remembers your wins. Good moments are pulled out of each entry and collected into a weekly wins card.
It rewards showing up. A little pixel creature is revealed one journaling day at a time, a new one every month.
Privacy first. Your recordings stay on your device and in your own iCloud, encrypted. Our server doesn't store your journal. iCloud backup is free for all users!
How I built it
Solo. Swift, SwiftUI and SwiftData, synced with CloudKit. On-device: the Speech framework for transcription, Accelerate for the voice signal processing, and a Core ML model for emotion in the voice. A Python (FastAPI) backend handles the AI analysis. Subscriptions run on StoreKit 2 with server-side validation, plus the RevenueCat SDK in observer mode, which let me add RevenueCat without touching the purchase flow.
I actually started fully on-device, with Apple's Foundation Models. It was great for privacy, but two things pushed me to the cloud: the on-device model wasn't always strong enough for nuanced emotional analysis and long-term insights, and it only runs on Apple Intelligence devices, which would have left a lot of iPhones out. So the analysis moved to the backend, and the on-device version stays on the roadmap.
Challenges I ran into
The app got sleep wrong, in more than one way. First, it showed 2.74 hours a night while Apple Health said 4h45: the app was saving a snapshot of your health data at the moment you journaled, but sleep syncs later. Then the night owls: a night that crosses midnight was split across two calendar days, and a nap or a second tracker on the wrist got added on top of the real night. Now per-day data is read straight from Apple Health, sleep samples are merged into sessions, and the main night is assigned to the day you wake up. On the nights I checked, it matches Apple Health within a couple of minutes.
The app was an optimist. After months of journaling, I had several "great" days and not a single "awful" one. The reason turned out to be math, not mood: the scoring made "awful" almost unreachable. Only one emotion scored low enough to get there, so it showed up in about 0.1% of emotion combinations. On top of that, "calm" doubled as the label for neutral entries and was scored as clearly positive, so every flat day counted as a good one. The fix: a real "neutral", five new emotions (like despair and exhaustion), and a recalibrated bottom threshold.
iCloud sync froze code that hadn't changed. The journal screen was fine until sync went live. Then every time iCloud delivered changes, they were merged into the same main-thread context the UI reads from, and the screen rebuilt every entry and its whole history on the main thread. Moving that work to a background actor fixed it. The lesson came from measuring it: under the debugger the rebuild took ~6.9 seconds, in a normal run 80 ms. The debugger was making it look ~85× worse than it was, so now I only trust measurements from Release builds with no debugger attached.
Accomplishments that I'm proud of
Voice analysis measured against your own baseline, in an everyday journal, calculated on device.
No journal storage on the backend. Entries live on your device and in your iCloud, because privacy was the main goal. And Jorai still has a memory: the daily, weekly and monthly insights quote your own entries back to you, including things you've probably already forgotten :)
Data. A journal needs a lot of entries and time before it can be honest about patterns, so I kept journaling with it almost every day. Many of the issues above only showed up after months of real entries, never in test data.
Statistics that are honest enough to say "not enough data yet".
What I learned
Building is the easy half. Nobody wakes up and searches for "voice journal", so distribution is the real problem, and it's one I'd never had to solve before. Asking other developers in public taught me more about it than any tool did: where to put the paywall, which ads were a waste of money, and what to try next.
What's next for Jorai
Product: 2.1 just shipped: photos in entries, and a one-time Pro offer that appears after your first entry is analysed rather than straight after sign-up (an idea that came directly from other developers). Next, bringing more of the analysis back on-device as Apple's models improve. AI analysis entry improvements, auto-detection of repeated actions/habits/etc., so Jorai can suggest repeated actions, etc., smart notifications, Siri integration, insights with your memories from photos, support for more languages.
Marketing: I'm running short-form video tests on TikTok to find the angle that makes people want to try it, and keep building in public on X and Reddit. The app is already in 2 languages.
Log in or sign up for Devpost to join the conversation.