Inspiration
I started out doing two things separately: journaling, to work out what I was actually feeling, and practising mindfulness meditation. The meditation half kept letting me down. The sessions were bland and generic, and depending on how I felt or what I needed in that moment, they simply did not fit. So I wanted to combine the two into one app.
The first iteration was deeply flawed. Partly because of the text-to-speech generation lag, but mostly by design: it wove details from your journal entry into the meditation itself. That turned out to be exactly backwards. It made me think about the things bothering me more, not less. The point of a meditation is to quiet the default mode network and get your mind off the daily things that bug you. So I pivoted. Shora now composes sessions from pre-built exercises and pre-generated speech segments, and the journal entry is used only to extract your mood. The algorithm matches that mood to a session.
I also had no access to a meditation specialist who could write me guided sessions for every mood and every intent. Around that time I was listening to the Huberman Lab podcast, which kept coming back to specific breathing and visualization protocols for calming down or sharpening up. I started practising them, and they worked for me. So I compiled a library of exercises that have actually been studied, organised by the mood you are in and what you want to get out of it. Most of them turn up in ordinary mindfulness practice anyway, which suggested I was on the right track.
The cherry on top is the feedback loop. As in therapy, not every patient responds to the same treatment the same way. So at the end of every session Shora asks whether it worked. The next time it builds you a session for that mood or purpose, it takes that answer into account. Oversimplified: if box breathing did not calm you down, next time it tries a physiological sigh. If that works, it leans on it more for you from then on.
The nautical theme comes from my own safe space. A beach is my favourite place to meditate. Two phrases stuck with me over the years: that I am but a fragile wreck on a storm of emotion, and the idea of painting an emotional picture. That is where it landed: Shora helps you navigate your emotions and get you back to shore. The visual style followed from the same place — the app paints your emotional landscape, watercolour at first and steered towards oil painting later.
The through-line in all of it: most apps hand you a library and let you guess what you need. That is the exact moment the tool fails you, because when you are anxious, foggy or wrung out at 11pm, browsing a catalogue is work, and work is the one thing you cannot do right then.
What it does
Shora is meditation for how you feel right now.
You check in — tap a mood card, nudge four sliders, or just write what is on your mind. Shora reads that into an emotional state, matches it against 20 evidence-based techniques, and composes a 2–10 minute guided session narrated in your language and chosen voice.
Afterwards you say how it went. That feedback tunes the next session, per user and per technique, so the app forms an opinion about what actually helps you.
- 20 evidence-based protocols — cyclic sighing, box breathing, 4-7-8, body scan, NSDR (yoga nidra), grounding, loving-kindness, cognitive reframing, gratitude, and more
- Three ways in — a mood card, an intent card (sleep, focus, reset, morning, prep, gratitude), or a free-text journal entry
- A one-tap SOS — 90 seconds, no choices, auto-paced, for the moments when panic hits. It can be pinned to the home or lock screen and started before the phone is even unlocked.
- 3-minute micro sessions for when ten minutes is too much
- A private journal whose entries become sessions
- Streaks, mood-shift tracking, and a shareable post-session card
- English and Romanian, multiple voices
- Free to start — Pro unlocks the full library and longer sessions
How we built it
Solo developer, Romania. Flutter front end, Firebase back end.
- App — Flutter with Riverpod
- Back end — Firebase Cloud Functions v2 in TypeScript, Firestore, Auth, FCM, App Check
- Mood extraction — Vertex AI (Gemini 2.5 Flash Lite) turns a few written lines into the emotional state the matcher works from
- Voice — ElevenLabs text-to-speech, generated ahead of time, cleaned up, and cached so a session starts immediately
- Session selection — a per-user model that learns which techniques work for you and weights future sessions accordingly
- Payments — RevenueCat: purchases_flutter and purchases_ui_flutter 10.7.0, with the RevenueCat paywall UI rendering the paywall, and a webhook that projects entitlements onto the user document, which derives the single tier field the app reads
- Site and video — Astro marketing site, Remotion promo-video pipeline
The referral system is the integration I am most pleased with. Rewards are granted as RevenueCat promotional entitlements, but a Firestore ledger is the source of truth for what was granted and why — RevenueCat is treated as a projection of that ledger rather than the system of record. That split is what makes a reward auditable if the two ever disagree.
Challenges we ran into
Talking about your problem is not the same as helping with it. The first version wove details from your journal entry into the meditation script. It felt clever and it was wrong: hearing your own worries read back to you keeps the default mode network busy, which is the exact opposite of what a meditation is for. The fix was to use the journal only to read your mood, and never to quote it back inside the session.
Generated sessions were the wrong tool for the job. The first version also had an LLM write the entire guide text for each session. The output was unpredictable, uneven in quality, and slow — none of which you can afford when someone is waiting to be talked down. Replacing it with a curated set of pre-made exercises, where both the guide text and the narration have been chiselled by hand, was the single biggest quality jump the app has had. The model still does the one job it is genuinely good at: reading a mood out of free text.
Making synthesized narration calm enough to meditate to. Raw text-to-speech is not restful. Some clips carried hiss, some had dead air, some sat at the wrong level. So the audio now goes through a clean-up pipeline before it ships — de-noising, trimming empty space, reducing hiss, and levelling — and nothing reaches a user until it has been through it.
Audio that survives a backgrounded app. iOS would go silent when a session started after the app had sat in the background — the audio session had quietly lost its claim. The fix was to play a short piece of real silence from a file first, reactivating the session before the guide audio begins.
Latency you cannot hide. A composed session needs many narration clips, and generating them on demand is far too slow to sit behind a tap. Everything is now generated and cached ahead of time, prefetched while the user is still choosing a duration, and kept on the device after first play.
Stacked prompts. Rate the app, enable notifications, create an account, go Pro — each reasonable alone and awful together. They now pass through one coordinator that allows at most one ask per moment, with interrupts capped at one per day.
Greeting new accounts with a paywall. Shipped, wrong, removed after feedback.
Accessibility under real conditions. Cards overflowed at large Dynamic Type on narrow phones — caught and fixed after launch.
Accomplishments that we're proud of
- Live on both stores and shipping — Play full rollout Aug 4 2026, App Store Aug 5 2026, now on version 1.5.4 (build 24)
- 949 accounts as of Aug 25 2026, 33 of them new in the previous seven days, with 41 sessions completed in that same window
- The SOS widget — 90 seconds of auto-paced grounding, reachable from the home or lock screen without unlocking the phone. It is the feature I would keep if I could keep only one, and nothing else in the category has it in that form.
- An audio pipeline that makes synthesized narration genuinely restful — de-noised, trimmed, de-hissed and levelled, so the voice guiding a session never breaks the calm it is trying to create
- A curated library of 20 studied techniques with guide text and narration tuned per exercise, rather than generated per request
- Fully localized in English and Romanian — interface, guide text and narration
- A referral program that grants real entitlements through RevenueCat, with an auditable ledger behind it
- Original painted artwork, a private journal, anonymous by default, no ads
- Built end to end by one person, in public
What we learned
Shipping in public changed the product more than any plan did. Almost every meaningful change this cycle came from someone telling me something was wrong:
- New accounts were greeted by the Pro paywall — removed after feedback
- iOS went silent after a long spell in the background — fixed by playing silence from a file
- Ten minutes was "too much" for some people — 3-minute micro sessions added
- Guest progress was lost at sign-in — a link-first upgrade now keeps it
- Prompts stacked on top of each other — one nudge per moment
- Cards broke at large text sizes — reflow fix
- Referrals shipped as give-a-month, get-a-month, with an in-app rewards history
The deeper lesson was about where to use a model and where not to. Letting an LLM write whole meditations produced worse sessions than a curated library did, while using it narrowly — to read a mood out of a paragraph — works well. The other lesson: personalization only earns trust when the user can see it. "Your Tides — mostly steady this week" does more for belief than any claim about the algorithm ever could.
What's next for Shora
- A monthly mood retro, as a painting. Your month of check-ins rendered as a personal generated painting — your emotional landscape for that month, something to keep rather than a chart to read.
- Voice input. Speak what is on your mind instead of typing it. Talking is easier than writing on the days that matter most, and the mood extraction works the same on either.
- Offline playback — the device audio cache already exists; it needs a real download-and-manage interface
- More languages, following the English/Romanian pipeline already in place
- A sharper feedback signal on the recommender, now that there is enough real usage to learn from
- Continuing to build in public
Log in or sign up for Devpost to join the conversation.