Skip to content
← All work
2026LiveInvite-only

Lull

Calm lost my wife’s prepaid year somewhere between her subscription and her Apple ID, and had no fix to offer. The irony wasn’t lost on us. What she actually used took a morning to rebuild. Within two days it had grown into a daily practice, shared hand to hand.

Solo: spec, design and build (Claude Design, Claude Code)

Visit live ↗Source ↗Invite-only. Source on GitHub.
Prototype to working app
About 1.5 hours
Sounds
10, three recorded
Subscription
None
Tests
56

01 / problem

The problem

My wife paid Calm for a year in advance. Somewhere along the way the subscription came loose from her Apple ID, and Calm had no way to reconnect it. The company selling calm offered her a support loop and no solution. She had paid, and she couldn't use it.

The second irony was in the product itself. What she relied on each night was ocean waves without seagulls, a timer that fades to silence, and sound that keeps playing through her sleep headband with the phone locked. None of that needs a subscription platform. There is little in a commercial sleep app that can't be built from scratch, quickly, and made more personal than a product for millions will ever be.

02 / build

What I built

I designed a working prototype in Claude Design, wrote the spec from what she actually used, and directed Claude Code through the build. About an hour and a half later she had a working app, and the brand and polish were done the same morning.

Then it met real nights and real feedback, and it kept changing:

  • The ocean became real. A guest said the first ocean had a mechanical cadence and never broke. Now it's eight recorded breaking waves, scattered around the wave-rhythm setting at varied size, rate and angle, over the same beach heard from further off. Shore and Brook are real field recordings, and the stream bubbles.
  • A gong for breathing. It rings as each breathing session opens and closes.
  • A sheet made for bedtime. The sound settings became a mixer over a painted library: only what's playing tonight up top, and eleven moonlit paintings for the sounds below, made with my ComfyUI pipeline.
  • Haunt, for October. A wind-and-drone bed with whispers and screams at random moments, voiced with the same Chatterbox and ACE-Step tools from my other work. Not for sleeping. For fun.

Then it became a practice, and it started to spread:

  • A breathing practice with a memory. Every session of a minute or more is logged: pattern, time, length, and whether it ran to the end. It's saved on the phone first and synced to her own rows. Streaks, a daily goal of 5, 10 or 15 minutes, and a month calendar whose moons fill toward the goal, with a dot for each session, so practice spread through a day shows at a glance.
  • Shared the way good tools spread. Anyone can share Lull from the account menu: a QR code and a link that works once and expires after 30 days. Who invited whom forms a family tree. Members see their own branch, and I see the whole tree and can pause anyone's sharing.
  • Gentle nudges to breathe. Optional reminders at up to three times a day, skipped once the day's goal is met, worded around progress or the streak. A scheduled job in the database checks every 15 minutes, works out what's due in each person's own time zone, and never sends the same nudge twice.

Underneath, the parts that have to hold at 3am:

  • Sound that survives a locked phone. On iPhone, Lull renders the mix into a seamless loop and plays it through a plain audio element. iOS ignores volume there, so the fade is baked into the loop itself. Lock-screen play and pause work through Media Session.
  • A long fade to silence. From 15 minutes to all night, fading over 5, 10 or 20, with a near-black screen that dims itself.
  • Never locked out at 2am. It works offline once signed in, and never re-checks the session while sound is playing.
  • Theirs, and private. Invite-only accounts, no subscription, nothing to renew. Each person's practice is readable only by them, and sounds never leave the phone.

03 / signal

What it shows

A paid product failed its customer on something that had nothing to do with sleep. The replacement took a morning, because the hard part of a sleep app isn't the feature list. It's caring about one person's nights: the ocean without gulls, the fade that doesn't wake her, the phone that stays locked.

It also shows the loop I like to work in: ship something real fast, put it in front of the people it's for, and let what they notice drive the next version. An ocean that didn't break became recorded waves the next day. A breathing screen became a practice with streaks, a goal and reminders, and an app for one became something its users share with the people they love.

The source is on GitHub.

Gallery 1 / 12

The opening: a moonrise over still water, before the moon settles into the play button.

Listen

Rendered on the phone by Lull

Just the oceanRecorded waves, about one every 11 s

Ocean & brownOcean 65 · Brown 25

Rain on the roofRain 70 · Brown 30

45-second excerpts rendered by Lull’s own engine: recorded breaking waves scattered in time, over sound it generates. It’s the same offline render its lock-screen safe mode plays.