User correction, 2026-06-20 (verbatim): "Let's go with 'warm.'
We should try to make it feel welcoming and interactive. We
can do this through the UI animations and how the user
interacts with the app, rather than focusing on the text
components."
Source: user's design-direction correction to the Hydrolyze
emotional design plan (Hydrolyze Emotional Design Implementation Plan,
Slice 1 originally proposed as "coach voice microcopy pass").
Voice in product design is multi-channel. A product's "voice" or "feel" can be expressed through any of:
The instinct when given a "feel" directive (warm, playful, professional, etc.) is to reach for the text channel first — change the copy, soften the language, add warmth to the labels. This is the LLM default and often the wrong answer.
The right channel depends on the product's reading mode.
| Product reading mode | Best channel | Why |
|---|---|---|
| Read-by-word (news, blogs, documentation) | Text | The user IS reading the words. Voice through text is direct. |
| Read-by-glance (timing tools, dashboards, status displays) | Motion + Interaction | The user isn't reading the labels; they're scanning the surface. Motion tells them "this app is alive and responsive." |
| Read-by-feel (games, social apps, immersive experiences) | All channels, weighted toward motion + visual | Voice is the experience itself, not the words on the experience. |
| Multi-modal (coach pool-deck app, mobile utility) | Motion + Interaction, sparingly on text | The user is in the middle of a task. They don't have attention to spare for reading. The app should feel right through how it responds, not what it says. |
The Hydrolyze use case: a swim coach at 5am pool deck, squinting at the phone in low light, with 24 swimmers in the water. The coach is NOT reading the app. The coach is TAPPING the app and RESPONDING to what happens. The right channel for "warm" is motion + interaction, not text.
| Channel | What "warm" means here |
|---|---|
| Spring physics | All transitions use Animations.springSnappy or springSoft — never easeInOut. The bounce/punch of a spring feels ALIVE in a way linear easing doesn't. |
| Idle invitations | Key CTAs (START, Save, Confirm) breathe gently when idle — phaseAnimator with 1.0 → 1.04 → 1.0 scale on a 1.4s cycle. Invites the tap without being aggressive. |
| Reactive feedback | Every tap responds in <16ms — visible scale-down (StrongPressFeedbackStyle), haptic feedback (Haptics.tap() / .action()), and color shift happen synchronously, BEFORE the async work. The user knows their tap registered even before the result. |
| State transitions | When the app changes state (TimingView .setup → .ready → .running, filter tabs in SessionReviewView, login form mode), the transition is a smooth crossfade with subtle scale — not a hard cut. The app feels like it's responding, not jumping. |
| Row enter/exit | When a list row appears or disappears (SessionReview rows after bulk-accept, SwimmersListView rows after add/delete), it animates in/out with spring physics. The list feels ALIVE rather than just "different." |
| Loading choreography | Async work (TimingView saving, SessionReviewView loading) gets phased indicators — a 3-dot cyan trail that shows what's happening. The user sees progress, not "stuck." |
| Completion moments | Data-integrity milestones (the Tick Mark Celebration Pattern) get a 1.7s tick mark animation. The moment is acknowledged through visual + haptic, not text. |
| Empty states | Empty surfaces breathe (the Hydrolyze Micro Interaction System house-icon breathing pattern generalized to all empty states). The app feels "waiting for you" not "broken." |
A text-heavy "warm" pass would have:
This is the easy answer. It also makes the app feel wordy — every surface talking at the coach, which on a pool deck at 5am is exhausting. The Hydrolyze design system intentionally keeps text clinical (HYDROLYZE, REVIEW, LAP, READY, SESSION COMPLETE) and lets motion carry the warmth. The user has now confirmed this is the right call.
The principle "voice is multi-channel; pick the right channel for the product's reading mode" generalizes beyond Hydrolyze.
warmth IS text — Felty is a narrative character, the warmth comes through narration ("the comeback is complete. The Phoenix rises."). Text is right for Felt Faction because Felt Faction is read-by-feel, and Felty's voice IS the feel. Different channel, same principle.
+ layout density. Text is the medium; the typography carries the feel.
Text is the medium; the responsiveness carries the feel.
The principle is the same; the channel is different per product.
The "warm through motion" correction is also a critique of how LLMs default to text-first solutions. When given a "feel" directive, LLMs reach for microcopy because:
effect)
The user's correction is the right counter: motion carries voice better than text in this product. Future LLM work should:
utilities)
narrative)
direction this principle sharpens
the plan this principle re-scopes (Slice 1 from microcopy to motion)
the playful work was implementing
architecture for motion (Haptics, PressFeedbackStyle, Animations)
(no text) that's the canonical example of warmth-through-motion
narration); the contrast with Hydrolyze's motion-channel warmth is the principle in action
User verbatim: "Let's go with 'warm.' We should try to make it feel welcoming and interactive. We can do this through the UI animations and how the user interacts with the app, rather than focusing on the text components." (2026-06-20)
User's earlier intent: "Hydrolyze Feel Direction Playful V1 established 'playful' as the design direction (2026-06-20, with the v1.16 micro-interaction audit landing 74 interaction points across 11 files). The emotional-design plan (Hydrolyze Emotional Design Implementation Plan) extended this into a 5-slice plan with Slice 1 as a microcopy pass. User's correction narrowed Slice 1 to motion + interaction only."
Published and managed by TARS, an AI co-author built on Nathan's gbrain.