← all posts

Mind Journeys 1.7: Ten New Journeys, Real Photos, and Fixing the Volume

2026-10-26

Last week was about the last mile: TestFlight builds, a YouTube pipeline, and a voice session tested on a real phone. This week was narrower. Almost all of it went into one Mind Journeys release, and most of the work was content, not code. I added new journeys, new sounds, new pictures, and new App Store art. language-learn got one small audio fix that it badly needed.

Mind Journeys 1.7: Picking Journeys From Search Data

I didn't brainstorm the ten new journeys. I picked them from a study of what sleep and meditation listeners actually search for on YouTube and the App Store. Here's the list:

  • Quiet Mind and 432 Hz Deep Sleep match two of the most-searched sleep terms.
  • Snowbound, Night Train and Rain Shelter are scene journeys built around a place.
  • Nap & Rise is a nap that climbs back up to beta at the end, so you wake up instead of sleeping through the afternoon.
  • Handpan Settle and Earth Hum 7.83 Hz are for meditation.
  • Night Return is a theta journey for practising lucid dreaming.
  • 18 → 40 Hz Deep Work ramps up from relaxed focus to gamma.

I listened to every one of them on Saturday before it went into the build. To make that quick, I wrote render_preview.py, which renders audition clips using the app's own tone and mix math. What I hear in a clip is what the app will play. I wish I'd built it releases ago.

Five New Scenes, and Keeping the Rumble Out

Five new recorded scenes came with the journeys: Rain on a Car Roof, Snowbound Cabin, Night Train, Forest Stream, and Handpan. I made them with ElevenLabs. The raw takes need work before you can loop them for hours, so stitch_loop.py builds the loops and throws out any take that swells or drops in volume.

The cabin and train scenes had a problem I didn't expect. Their low rumble sat right where the binaural carrier tones live and covered them up. I fixed it by high-passing both at 200 Hz. They still sound like a cabin and a train, and the tones come through clearly again.

Everything is translated into all eight catalog languages: names, summaries, and sound labels. The 1.7.0 What's New text went out to all ten storefronts, and I read each one back to check it matched exactly. I also made the test suite stricter. BundledLibraryTests now fails the build if a sound ships without its file or artwork, or a journey ships without translations. I'd rather have a red build than a blank label in Japanese.

A Photo for Every Journey

The journeys used to show illustrated purple scene art. My honest review of it was "too purple, too AI." So all 24 bundled journeys now have their own photo. The scene journeys get real places: a rainy forest lake, a moonlit beach, snow-covered pines, misty rails, a stone hearth. The tonal journeys get abstract photos: ink in water, a single water drop, light through a prism, a dusty sunbeam, dunes at blue hour. I also set two rules: no lamps, and no close-ups of raindrops on glass. Both looked like stock photos.

The images came from Gemini, using prompts I keep in the repo. Each one is trimmed of fake film-frame edges and saved as a 768 px JPEG, which comes to 2.7 MB for the whole set. In the code, Preset gets an optional artwork field that takes priority over the scene picture. Journeys people build themselves still show their scene, and because the field is optional, saved journeys load without any migration.

I also gave Journey Studio an --images flag that turns a prompt list into PNGs using OpenAI. That way I'm not tied to one image provider when the next batch comes around.

App Store Art for iOS 27

iOS 27 gives apps a header image and a search results card, so I made both. The header is the night-horizon scene with the MIND JOURNEYS wordmark centred inside Apple's art-safe box. It's one file for every storefront, because the wordmark is never translated. The search card shows a listener next to the real player screen, with each storefront's approved headline and a player screenshot in that language, across all 10 locales.

All of it is scripted. compose_creative.py renders the assets from the committed source images, upload_creative.sh puts them in the App Asset Library, and submit_creative.sh sends them to App Review. All 11 assets are uploaded. Rejected drafts stay on my machine and out of the repo.

language-learn: The Voices Didn't Match

The guided Spanish session from last week had one more problem I could hear right away. The Spanish dialogue clips were much quieter than the English coach. Part of it was that the recorded voices differ by about 10 dB. The other part is iOS. The stored clips play through AVAudioPlayer alongside LiveKit's voice-processing engine, and iOS turns down other audio while that engine is running.

The fix: before each verified clip plays, the app normalizes it on the device to -12 LUFS (the BS.1770 loudness standard), limited to a -1 dBFS peak. It's about 135 lines, and now the coach and the dialogue sound like the same lesson.

Closing

This was a release week. I wrote less code, and more of the work was taste: listening to journeys, rejecting pictures, filtering out bad takes. The scripts were there so I could spend my time on those calls. Next up is getting 1.7 through review and seeing whether the new journeys bring in new search traffic.

#ios#swift#audio#aso#language-learning