Entered for the Influencer Award - Yoga & Fitness (Simone Sharice) and the RevenueCat Design Award.

Inspiration

FYR started from competitor reviews, not a feature list. In the face-yoga category the complaints were rarely about the movements. They were about friction: a sign-in before anything happens, a camera pointed at your face, ads inside a session, and a subscription whose boundary nobody could explain. My July market note lists those four, and the app was built against them.

The rest is personal. I wanted the app I would open on a tired evening, not a program with a schedule.

So I named it a ritual, not a workout. FYR hands you one thing: one button, one Day of a seven-day course, a voice saying where to put your fingers, and a timer that counts.

What it does

FYR is a self-care app for the face and neck. Everything inside it is Japanese, voice included. The demo video carries English captions.

A session runs itself. A recorded voice introduces each movement, an illustration animates to show where the fingers go, and a ring timer counts the seconds. Thirteen movements, from rolling the earlobes to easing the jaw muscles and stroking the neck. Nothing has to be memorized.

Together they make five routines: Face Basics (4 min, 7 steps), Face Full (6 min, 12 steps), Evening Wind-Down (3 min, 7 steps), Mouth and Smile Lines (1 min, 2 steps), Scalp and Eye Area (2 min, 3 steps).

Three questions at first launch shape what you see. The areas you care about reorder the routines and mark one as recommended, the time you have changes the guidance line on home, and morning or evening sets a reminder at 8:00 or 21:30.

Above them sits a seven-day course, 月が満ちる (The Moon Grows Full): one Day per calendar day, in order, and the moon on the home screen fills a little more with each Day.

Sessions are recorded and your run of days is shown. No sign-in, no camera, no advertising, no analytics; everything stays on the device.

Face Basics and Days 1 to 3 are free. Premium opens the other four routines and Days 4 to 7: $29.99 a year with a 7-day free trial, or $2.99 a month.

How I built it

FYR is an Expo app: SDK 54, React Native 0.81, TypeScript, expo-router for a four-screen stack, Reanimated, expo-audio.

Purchases run through RevenueCat. One entitlement, two packages, a 7-day free trial on the annual package in the US and Japan, restore on the paywall. The entitlement is never written to disk: the home screen re-fetches customer info on every focus, so the locks open the moment the paywall closes. The gate is a pure function in one file, shared by the home and care screens.

Sound needed its own module. A session sets the audio session to doNotMix, so another app's music pauses instead of fighting the voice; on exit the app returns it with a notification and that music resumes.

Japanese must not break mid-phrase, so a WrapText component renders each phrase of a pre-split sentence as an inline block.

The media is a mix, and I would rather say so. The two background tracks were generated with Suno. The narration was generated with a Japanese text-to-speech voice and chosen by ear, take by take. The illustrations are AI-generated line art, frame-selected and hand-tuned into flipbook sequences. I built the app alone, with Claude Code as my implementation partner.

Challenges I ran into

Background music that played in Expo Go and went silent in the production build. The expo-audio native source explained it. Pausing a player schedules the audio session for teardown a tenth of a second later unless every player sets keepAudioSessionActive, and play() does not wait for a 3 MB file to load. Three players change state at once, nothing is playing when the check runs, and the session drops. The narration takes it back on its next play call; the music never asks again.

That fix caused the next one. With the session held open, another app's music no longer picked up on exit, and the two apps traded it back and forth. One module with one timer settled it.

Japanese line breaks. A phrase split across two lines reads as a mistake, and no style property saves you in React Native. Sentences are stored pre-split.

The English store description. My first draft ran 4631 characters against a 4000 limit, and I had decided to promise nothing, so every promise-sounding word became an action word.

Accomplishments that I'm proud of

The app has no numbers to report yet; it reached the App Store on September 18, 2026. What I can point at is the build.

Thirteen movements, each with its own animated illustration. Thirty-three recorded audio files: twenty step narrations, four launch greetings that vary with the hour and with time away, seven course-day introductions, a full-moon narration, a completion jingle. Two background tracks. Five routines. Four screens, no tab bar. Zero data collection.

And the course does not scold. No reset after a gap, no penalty, no warning, and no stored count of missed days, so a screen that blames you cannot be added later.

What I learned

Production-only audio bugs live in the seam between two systems, not inside either one. Reading native source took an afternoon and ended the guessing.

Constraints improve copy. Being unable to promise an outcome forced me to describe what the user does, which is more specific and more honest.

Restraint is a feature you defend. Every time I wanted a new screen, the better move was to quiet the one I had.

What's next for FYR

Spanish. The app was built Japan-first on purpose; the recorded plan is a Japanese launch then Spanish localization.

More movements. The illustration pipeline that produced the current thirteen is still running, and most new movements are data, not screens.

The completion screen and the paywall. The Day 7 full-moon treatment and the paywall's decoration are the two places the code still marks deferred.

Nothing else is promised.

Built With

Share this project:

Updates

Submission history