A voice mission can be passed while someone is still half asleep.
I learned that the awkward way.
RYZA already had a voice-based alarm: read a sentence aloud, and the alarm stops. It worked. People could not just tap one button and roll over. But “worked” was not the same as “helped someone wake up.”
I could read a familiar sentence with almost no attention. I could say it from memory, get a passing result, and still feel like I had not really started the day. The alarm was gone. I was not awake.
That gap is the reason for Wake Sequence: a short follow-up challenge after the alarm. Instead of treating dismissal as one action, it asks the user to get through a small sequence first. That can mean recognizing a phrase, placing it in the right order, or working through a few more deliberate steps before the alarm session actually ends.
The important word is small. I did not want to build a morning exam.
Why the old flow was too easy
The original shape was clean:
Alarm rings
↓
Read a sentence aloud
↓
Speech matches
↓
Alarm ends
Nothing was technically wrong with it. It was already a better interruption than a standard alarm. But the flow had one weak point: success happened all at once. A single good reading could end the entire thing, and that is exactly as convenient for someone half asleep as it is for someone alert.
I want to be careful here. Not every alarm needs to be difficult. Someone with an early flight, a newborn, or a bad night does not need an app that treats sleep like a moral failure. But RYZA’s voice mission exists for people who want more friction than a button, and for that group I wanted something between “say one sentence” and “keep failing until you give up.” Wake Sequence is that middle option.
I started with the wrong kind of challenge
My first instinct was to make the task harder by adding more words. Bad idea. Longer text mostly produced a worse speech recognitionconverting spoken audio into text on the device, with no server round trip experience: more chances for a small error, more work for non-native speakers, and an alarm that started to feel like homework.
I also tried a stricter failure counter. Get an answer wrong, and the alarm gets more demanding. That felt satisfying to build. It gave failure a visible consequence. It was not pleasant at 6:40am, and it was the same mistake I had already made once, scoring a spoken match as pass or fail instead of something more forgiving.
The problem was that I was optimizing for resistance, not for waking up. Related, but not the same thing. Wake Sequence got better once I stopped asking “how do I make this hard to bypass” and started asking “what is the smallest action that makes someone pay attention.”
A sequence gives the user somewhere to go
The final shape is a short state machinea fixed set of moments and the rules for moving between them, so the alarm cannot jump straight from ringing to finished.
Alarm ringing
↓
Voice mission
↓
Wake Sequence round
↓
Next round or completion
↓
Alarm dismissed
It remembers progress. If the app gets interrupted, it knows whether the user was on the first round, the third, or already done, and that mattered more than I expected. Morning interactions are messy: the screen locks, recognition stops, the app gets interrupted, or someone just puts the phone down mid-round because they are, reasonably, not interested in debugging an alarm app before breakfast.
Lose the sequence state and the experience turns arbitrary. It becomes an undeserved reset, or an accidental dismissal. So I save the mission state: current mode, completed rounds, failure count, the selected text, and a version number for the sequence format itself. That version field is unglamorous but earns its keep. Once I changed how a sequence was built, I needed a safe answer for an older saved session already in progress. A format change should not corrupt someone’s alarm mid-recovery, which is close to the same promise I had to make for audio after a voice attempt: whatever else changes, the thing in progress does not just break.
Wrong answers need a response, not a punishment
A wrong answer should not quietly do nothing. In Wake Sequence it returns the user to an active alarm state: the app shows the next step or a retry prompt, and the sound comes back if it should.
But a wrong answer and an interruption are not the same event, and I keep them apart. A microphone cut off, or the app briefly losing the ability to listen, is not automatically a failed attempt. Counting every technical hiccup as user failure made the app feel unfair fast. An alarm can be firm without acting offended.
Those distinctions are mostly invisible when everything goes well. They matter when it does not.
I had to make text behave differently in five languages
The sequence also forced me to revisit text. English phrases are easy to picture as separate word cards. That mental model breaks fast in other languages. Japanese does not use spaces the same way. Korean particles can make a literal split feel unnatural. A phrase that reads well as a card may be too long to say comfortably into a recognizer.
I ended up writing language-aware segmentation instead of treating every quote as a row of English-shaped words. That work is less visible than the Wake Sequence screen itself, but it decides whether the challenge feels fair. A challenge is not a challenge if the rules are unclear because the text got cut in the wrong place.
I still do not think the current approach is perfect. Some short phrases produce better cards than others, which is why I added regression cases around the strings that already broke once, rather than trusting a general algorithm to handle every sentence forever.
The point is not to win against the user
I do not want Wake Sequence to be cleverer than the person using it. That is a trap in alarm apps: easy to build a feature that beats someone’s first attempt to dismiss it, much harder to build one that helps them feel awake without making them resent their phone.
The feature is meant to buy a few seconds of attention. Reading, recognizing, arranging, confirming. Nothing dramatic. The finished flow is deliberately uneven: some mornings one voice reading is enough, on others the sequence asks for more. The app does not need to treat every morning like it requires the same ritual.
Wake Sequence changed how I think about alarm dismissal. It is not the end of the alarm. It is the start of a small routine: enough activity to interrupt autopilot, not so much that the first thing someone does each day is fight their phone.