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 came from the same place. The app paints your emotional landscape, in watercolour at first and later in oil.

Most meditation apps hand you a library and let you guess what you need. When I am anxious or wrung out at 11pm, browsing a catalogue is work, and work is the one thing I can't 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 as an emotional state, matches it against 20 evidence-based techniques, and builds a guided session of 3 to 30 minutes, narrated in your language and in the voice you picked.

Afterwards you say how it went. That answer shapes your next session, per technique, so over time the app learns what helps you in particular.

  • 20 evidence-based protocols: cyclic sighing, box breathing, 4-7-8, body scan, NSDR (yoga nidra), grounding, loving-kindness, cognitive reframing, gratitude and more
  • Paced breathing that keeps exact time (new): box breathing is 4 seconds in, 4 hold, 4 out, 4 hold, and now the voice, the breath sounds and a breathing orb all follow that clock. The other breathing exercises are next.
  • Three ways in: a mood card, an intent card (sleep, focus, reset, morning, prep, gratitude), or a few lines in the journal
  • A one-tap SOS: 90 seconds, no choices, for when panic hits. You can pin it to the home or lock screen and start it before you unlock the phone.
  • 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, several 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, 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 right away
  • Breath audio: every breathing pattern is rendered offline into cycle files of the exact length. Spoken cues, breath sounds and silent holds are cut and mixed to fit, then played back to back.
  • Session selection: a per-user model that learns which techniques work for you and weights future sessions that way
  • Payments: RevenueCat. purchases_flutter and purchases_ui_flutter 10.7.0, the RevenueCat paywall UI, and a webhook that writes entitlements onto the user document, where they become the one tier field the app reads
  • Push and in-app messages: OneSignal, for the daily reminder, three Journeys and in-app messages
  • Art and motion: original oil and watercolour paintings. The short shore loops at the end of a session are made from those same paintings.
  • Site and video: Astro marketing site, Remotion promo-video pipeline

The referral system is the integration I like most. Rewards are granted as RevenueCat promotional entitlements, but a Firestore ledger is the source of truth for what was granted and why. RevenueCat mirrors that ledger. If the two ever disagree, the ledger wins, and every reward can be traced back.

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 opposite of what a meditation is for. Now the journal is only used to read your mood, and it is never quoted back inside the session.

Generated sessions were the wrong tool for the job. The first version also had an LLM write the whole guide for each session. The output was unpredictable, uneven and slow, and you can't afford any of that when someone is waiting to be talked down. I replaced it with a curated set of exercises, and I chiselled the guide text and the narration by hand. That was the biggest quality jump the app has had. The model still does the one job it is good at: reading a mood out of free text.

Breathing that keeps time. A breathing exercise only works if the timing is right. If the voice says "hold for four" and the next cue comes six seconds later, you lose the rhythm. ElevenLabs has no exact control over pauses, and breaths spoken by the voice model sounded wrong. So I took timing away from the voice model. Each cycle is built offline: the cues are cut from one take, breath sounds I picked by ear go between the words, the holds are silence, and the file is trimmed to the exact length of the pattern. The player plays those cycles back to back and moves the breathing orb from the audio position, so the picture can't drift away from the sound. The mix took a few rounds too. On paper the breaths were well under the voice, but on a phone speaker they sounded much louder, so I turned them down by ear.

Making synthesized narration calm enough to meditate to. Raw text-to-speech is not restful. Some clips had hiss, some had dead air, some were too loud or too quiet. Now every clip goes through a clean-up step before it ships: remove noise, trim the silence, cut the hiss, even out the level.

Audio that survives a backgrounded app. iOS would go silent when a session started after the app had sat in the background, because the audio session had quietly lost its claim. The fix was to play a short piece of real silence from a file first, which wakes the audio session up 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 you are still choosing a duration, and kept on the device after the first play.

Stacked prompts. Rate the app, turn on notifications, create an account, go Pro. Each one is fine alone and awful together. They now go through one coordinator that allows one ask per moment and at most one interrupt 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 still shipping: Play full rollout on Aug 4 2026, App Store on Aug 5 2026, now on the 1.6 line
  • 949 accounts as of Aug 25 2026, 33 of them new in the previous seven days, with 41 sessions completed in that same week
  • Box breathing in exact time, with voice, breath sounds and orb on one clock
  • The SOS widget: 90 seconds of paced grounding, reachable from the home or lock screen without unlocking the phone. If I could keep only one feature, I would keep this one.
  • Design polish in 1.6.8: smoother transitions and haptics, a custom loader (a slow tide line instead of a stock spinner), and short hand-painted loops of the shore when a session ends
  • Narration that stays calm: every clip is cleaned, trimmed and levelled before it ships
  • A curated library of 20 studied techniques, with guide text and narration tuned per exercise
  • 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
  • Push moved to OneSignal, with three Journeys that bring people back without spamming them
  • Original painted artwork, a private journal, anonymous by default, no ads
  • Built end to end by one person, in public

What we learned

Building in public changed the product more than any plan did. Most of the real changes 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. I added 3-minute micro sessions.
  • Guest progress was lost at sign-in. The guest account is now linked, so nothing is lost.
  • Prompts stacked on top of each other. Now there is one nudge per moment.
  • Cards broke at large text sizes. Fixed the layout.
  • Referrals shipped as give a month, get a month, with a rewards history in the app.

I also learned where to use a model and where not to. An LLM writing whole meditations gave worse sessions than a curated library. Using it for one small job, reading a mood out of a paragraph, works well. And personalization only feels real when you can see it. A line like "Your Tides: mostly steady this week" convinces people more than anything I could say about the algorithm.

What's next for Shora

  • Paced breathing for every breathing exercise. Box breathing is live. Cyclic sighing, 4-7-8, the energizing breath, diaphragmatic breathing, alternate nostril breathing, breath counting and the SOS reset come next.
  • An in-app message that invites people to journal. It is built on OneSignal and is on for test accounts now. It explains in a few lines why writing down what is on your mind helps, and its button opens the journal. It stops once you have saved an entry.
  • A monthly mood retro, as a painting. Your month of check-ins turned into one generated painting, something to keep instead of a chart to read.
  • Voice input. Say what is on your mind instead of typing it. Talking is easier than writing on the hard days, and the mood extraction works the same either way.
  • Offline playback. The audio cache is already on the device. It needs a proper download screen.
  • More languages, using the same pipeline as Romanian
  • A sharper feedback signal for the recommender, now that there is real usage to learn from
  • Still building in public

Built With

Share this project:

Updates

Submission history