-
-
Yu's room in 3D (2.0): she walks around, and when you tap "Good night" she turns off the lamp and watches over you.
-
37 ambient sounds on four channels at once, and in 2.0 you can start them before you even tap "Good night".
-
Wake up to a message Yu wrote about the night you actually had, plus the sleep points you earned.
-
Chat with Yu: ten places, visual-novel style. Free to try (10 messages a day); the Support Plan raises it to 30 and every place.
-
Yu's YouTube live schedule and archive, cached server-side and shown inside the app.
-
The ASMR video library, streamed with short-lived presigned URLs from a private Cloudflare R2 bucket.
-
App icon, 1024 x 1024, uncropped (new hand-drawn icon in 2.0).
Sleep apps ask for sensors, permissions and settings before you have even closed your eyes. We wanted the opposite: something as simple as telling someone good night and having them actually be there.
Yu (Reika Yu) is a ghost-girl VTuber who streams ASMR to a Japanese audience every night. Yu's Sleep is the app where she keeps that presence going after the stream ends — watching over your sleep, leaving you a message in the morning, and, since August, actually talking with you. Version 2.0 goes one step further and gives her a room: Yu now lives on the sleep tab in 3D.
What it does
Press "Good night," and Yu takes it from there.
- Yu's room, in 3D (2.0). The sleep tab is Yu's bedroom rendered live with three.js. She walks around it on her own, waves at you, walks over and switches off the lamp when you say good night, and switches it back on in the morning while her comment appears above her head. Drag to orbit, pinch to zoom; low-memory devices fall back to her 2D portrait automatically, and anyone can pick 2D in Settings.
- One-tap sleep log. No sensors, no data entry. Tap "Good night" / "Good morning" and the app tracks bedtime, wake time and roughly 90-minute sleep cycles, with history charts.
- Wake-up alarm. Pick a suggested wake time and the app sets the alarm. On iOS 26+ it uses Apple's new AlarmKit, so it rings full-screen even from a locked, silenced, force-quit phone; older iOS falls back to a burst of local notifications, and Android drives the stock Clock app through intents.
- Nap mode. 15/30/60/90-minute presets, kept out of your night-sleep statistics, firing exactly N minutes after you start it.
- Bedtime reminder. A local notification at your chosen bedtime, with a gentler follow-up ten minutes later if you still have not tapped.
- 37 ambient sounds on four simultaneous channels. 14 nature sounds, 10 ear-cleaning sounds, 4 ear-licking sounds, and 9 "onomatopoeia" tracks where Yu whispers the sound of the tool she is using. Each category is its own playback channel, so all four can layer at once and the mix is yours — and since 2.0 you can start them before you even tap "Good night." The whispered tracks are rendered through an HRTF binaural pass baked into the audio files, so left/right/center placement is physically correct rather than a pan slider.
- A word from Yu every morning. An LLM (Gemini) writes a short, in-character comment about the night you actually had, with hand-written fallback lines if the API is slow or unavailable.
- Chat with Yu — free to try since 2.0. Pick one of ten illustrated places (a rainy bedroom, a veranda at dusk, a bonfire in the woods, a night hot spring, fireworks over a river, the digital sea where she was born) and have a real conversation, presented like a visual novel: narration outside the bubbles, dialogue typed one character at a time, layered ambient BGM per scene. Yu keeps a single closeness value that changes how familiar she is with you, and remembers you through a profile you fill in yourself. Two places are open from the start; the other eight are unlocked with points you earn by actually sleeping. Everyone can chat (10 messages a day, and up to two places unlocked with points); the Support Plan raises that to 30 a day and every place.
- ASMR video library and live schedule. Watch Yu's works in-app with background playback and check her YouTube schedule and archive without leaving the app.
- A nickname just for you. Set what Yu calls you and it appears in every notification, comment, chat line and screen — stored only on your device.
- Account portability. Sign in with Apple (Google Sign-In on Android) to carry your sleep history to a new phone.
Traction since launch
Launched on the App Store on August 2, 2026, inside the Shipaton window, with zero marketing spend — every install so far is organic, from Yu's existing YouTube audience and App Store discovery.
The 30 days to September 19, 2026 (App Store Connect Analytics), against the first 17 days after launch:
- 213 first-time downloads, up from 88 — 31.2K impressions (from 8,760) and 1,480 product page views (from 472)
- $63 in proceeds, up from $30, across 35 in-app purchases (from 17)
- 18 active paid subscriptions and $19 MRR today — no free trials and no promo grants are included in that count
- The honest read: acquisition is compounding, paid conversion is not yet. Subscribers went 17 to 18 while downloads more than doubled, so the funnel we are working on now is the one inside chat rather than the store page.
Android shipped too. Google Play went to production on September 2, 2026 after clearing the closed-testing requirement, and added 30 device acquisitions, 39 monthly active devices and 2,400 JPY in its first 28 days. Yu's Sleep is now live on both stores.
What we did to get there: shipped 1.0.0 through 2.0.0 on the App Store in eight weeks, including a whole new premium pillar (chat with Yu) built, reviewed and released inside the event window; localized the store listing in Japanese and English and rebuilt the screenshots as a six-panel panorama with chat on panel 4, one swipe in; and put Yu's live schedule inside the app so the channel and the app feed each other. We also shipped home-screen and lock-screen widgets, so "Good night" is one tap away without opening the app.
Monetization strategy and results
One subscription, one entitlement. The Support Plan is $1.99/month, exposed through a single RevenueCat "monthly" offering shared by the iOS and Android SKUs and gated behind one "premium" entitlement. No ads, no consumables, no buyable currency. The only thing money buys is the plan.
Put the wall where the desire is, not at the door. Nothing is gated on first launch. Sleep logging, the cycle math, the morning message and the history charts are free forever, and 7 of the 37 sounds are free so you can hear what the paid ones are like. What the subscription unlocks is more of Yu: 30 chat messages a day instead of 10 and every place instead of two, the full sound library, unlimited history, the full video library. In 2.0 we opened chat to everyone, because a wall in front of the feature people come for means most of them never find out what they would be paying for.
The loop does the selling. Sleeping earns sleep points (0-15 a night, scaled by completed cycles, with a bonus for hitting your own bedtime). Inside chat, two places are open and the other eight cost 100 points each — roughly two weeks of actually sleeping per place. Free users can unlock two of them this way; supporters can unlock all eight. The free feature generates the currency, and the moment a free user has used their places, or their ten messages for the night, is the moment they most want to keep talking. We never interrupt a conversation to sell.
Why the plumbing matters. A subscription is worth nothing if entitlements are wrong. Our RevenueCat webhook never trusts webhook payload contents: it re-fetches authoritative state from the RevenueCat REST API on every event and upserts it into one subscriptions table, so transfers, cancellations-that-run-until-period-end and restores on a new device all resolve correctly. Every paid surface answers "is this user a supporter" through one shared helper reading that table, and a database error returns 500 rather than being rounded down to "not subscribed" — a transient outage never locks a paying supporter out of what they bought. The in-app economy is server-authoritative: unlocks spend points inside a single transaction behind an advisory lock, and the balance is derived from a ledger rather than a mutable counter.
Design: what to look at
The premise is an app you use with your eyes closed. Everything is built for a dark room and a person who is already tired: a single twilight-purple family with one accent (a moonlit amber), type set in M PLUS Rounded 1c whose soft terminals match how Yu speaks, and no bright surfaces anywhere.
Where to look, in order:
- Yu's room on the sleep tab (2.0). A live three.js scene in a WebView behind the native UI: the lamp going out is the "good night," and it pauses its render loop once you are asleep or the tab is hidden, because the screen stays on all night.
- Chat with Yu, "Night of the Fireworks." Presented like a visual novel: narration sits outside the speech bubbles, dialogue types out one character at a time with a beat between blocks, and Yu's face appears only on the first bubble of her turn. The typewriter recomputes its position from the wall clock every tick rather than accumulating, so it never strands a half-finished line when the JS thread stalls. Each place layers its own BGM — fireworks plus a wind chime, a bonfire plus forest — rather than playing one loop.
- The ambient mixer. Tap the ASMR button next to "Good night" to jump to the whole grid: four channels, 37 sounds, all playable at once.
- The morning result screen, where Yu comments on the night you actually had.
- The nickname system — design that lives in language. Stored text keeps a token where the name goes, so the nickname never leaves the device and changing it re-voices every past message.
How we built it
- Client: Expo SDK 57 (React Native, TypeScript, Expo Router). Sleep sessions are local-first and offline-capable, syncing to Supabase in the background, with recovery for apps force-quit mid-session.
- Backend: Supabase — anonymous Auth, Postgres, and 8 Deno Edge Functions covering presigned video URLs, the RevenueCat webhook, Apple token exchange and revocation, identity unlinking, account deletion, the YouTube feed cache, the morning comment, and the chat engine.
- Video delivery: ASMR videos live in a private Cloudflare R2 bucket; an Edge Function checks subscription status and mints a short-lived presigned URL per request, so egress costs nothing.
- Yu's room: a three.js scene (Yu, the room and her animations) built into a single HTML file and shown through
react-native-webview. Touch goes to the native view on top and is forwarded as orbit/zoom messages; textures are capped for iOS's shared GPU memory, which is what kept it from appearing on an iPhone 12 at first. - Native alarm layer: for iOS 26+ we wrote a local Expo Module in Swift wrapping AlarmKit. Our first attempt was a JS-driven foreground ringer, which died the moment the screen locked.
- Persona system: Yu's voice and the nickname system live in dependency-free shared TypeScript modules consumed by both the Deno functions and the Expo client through a symlink — one source of truth for how Yu talks, server-side and client-side.
Challenges we ran into
- AlarmKit only ships on iOS 26+, and the simulator is unreliable around it, so real alarm behavior could only be verified on a physical device.
- Android has no first-party alarm API. We drive the stock Clock app through intents, track "last applied" state ourselves, and reason carefully about already-fired versus not-yet-fired alarms — including timezone changes rewriting what "already fired" even means — so we never fire a dismiss intent at a UI the user is looking at.
- Making the LLM reliable enough to ship, twice. For the morning comment, an earlier model took 9-12 seconds, which is unusable right after waking up; we moved to a low-latency model with thinking disabled, a strict timeout and written fallbacks. Chat was harder: replies arrived truncated mid-sentence, and the cause turned out to be ours — the typewriter was accumulating ticks, so any dropped frame permanently ate the rest of the line.
- Not letting moderation dead-end a conversation. Prohibited words are masked and the message goes through, rather than being rejected, because a blocked send in a chat is a wall the user cannot get past. Doing that safely meant re-running the filter on a normalized copy, adopting the normalized text only when normalization is what exposed the word, and re-trimming afterward, since masking and normalization can both make a string longer.
Accomplishments that we're proud of
- Shipped a solo-built iOS app through App Store review with a working RevenueCat subscription, Sign in with Apple portability and a from-scratch AlarmKit integration — then kept shipping through the event window.
- A monetization loop we believe in: sleeping earns points, points open new places to talk, and talking is what the subscription is for. The paid feature is fed by the free one instead of competing with it.
- A server-authoritative economy with real transactional discipline on an indie budget.
- An offline-first sleep core that survives force-quits without losing a session.
What's next
- Growing the Android side now that Google Play is live — that listing is newer and far less tuned than the App Store one.
- A from-scratch Android alarm (AlarmManager plus a full-screen notification) so we stop depending on the stock Clock app.
- Google-to-Apple account transfer for users switching platforms.
- Giving Yu a live animated presence (Live2D) and eventually a synthesized voice in chat.
Awards we are entering, and why
- Grand Prize — first released inside the window (App Store August 2, Google Play September 2), then kept shipping: 1.0.0 through 1.5.2 in seven weeks and 2.0.0 (a 3D room and free chat) released on both stores on September 25, with every install organic.
- HAMM Award — one subscription, one entitlement, no ads and no buyable currency. Chat is free to try and the plan buys more of it; sleeping itself mints the points that open new places to talk, so the free feature feeds the paid one instead of competing with it.
- RevenueCat Design Award — an app built to be used with your eyes closed: one twilight-purple family with a single accent, no bright surfaces anywhere, a chat presented like a visual novel rather than a chat bot, and a 3D room where saying good night means watching the lamp go out.
- RevenueCat Peace Prize — the health features (logging, cycles, charts, the morning message) stay free forever, and the nickname you give Yu never leaves your device.
For judges: unlocking the premium features
Chat is free to try; the Support Plan raises the daily chat limit and the number of places you can unlock, and opens the full sound library and the full ASMR video library. An offer code for one free month (no auto-renew) is included with this submission's judging details, along with the redemption link.
Once it is redeemed, open the Chat tab and pick a place — two of the ten are open immediately, so there is no need to accumulate sleep points to see the feature. The ambient mixer is one tap away via the ASMR button next to "Good night" (it works before you go to sleep, too); headphones are worth it for the binaural tracks.
Built With
- alarmkit
- cloudflare-r2
- deno
- expo.io
- google-gemini
- postgresql
- react-native
- react-query
- remotion
- revenuecat
- supabase
- swift
- typescript
Log in or sign up for Devpost to join the conversation.