Earning a Moment
Delight is a budget, not a style, and the default answer is no. This skill exists to reject nine ideas so the tenth is worth building — a product with one earned moment and uniform polish everywhere else beats a product with six flourishes and a broken focus ring. Boundary with motion: this skill decides whether a moment gets extra craft; motion decides how it moves. Nothing here contains a duration, an easing curve, or a transform — the instant the answer is yes, hand the moment to motion (one element), transitions (a sequence), or gestures (pointer-driven) and stop. If someone is asking which curve their confetti uses, they have already skipped the decision this skill makes.
Read the product's existing personality before proposing anything. Count what is already there: a sound file, a navigator.vibrate call, a confetti dependency (canvas-confetti, react-rewards), a celebration component, a mute preference, a prefers-reduced-motion block. A product with zero flourishes has a deliberate register that one addition changes; a product with four has a consistency problem, and the right proposal is usually to remove three. Whatever survives uses the project's existing motion, sound, and token systems — a delight moment is the worst possible reason to introduce a second animation library.
Quick Reference
| Topic |
Where |
| Once the frequency tier is fixed and you need the concrete moments that have historically earned their place at that tier — plus the ones that never do |
moments.md |
The Delight-Impact Curve
Benji Taylor's formulation: "the potential for delight increases as the frequency of feature usage decreases." Rauno Freiberg is credited in Taylor's own /family-values footnotes as a co-source on the frequency-and-novelty axis. Emil Kowalski's frequency gate gives the same curve as four operating rows, and this is the decision procedure — score the moment before discussing it:
| How often the user sees it |
Verdict |
100+ / day (command palette, keyboard nav, tab switch) |
No flourish. Ever. No animation either. |
tens / day (hover, list navigation, save) |
Strip whatever is there. |
| Occasional (modal, drawer, toast) |
Standard treatment only — correctness, not character. |
| Rare / first-time / celebration |
Delight is available. It is still not automatic. |
Score by the frequency of the outcome, not the action. The four-hundredth message send of the day is top row; the send that completes a year-long streak is bottom row, even though the button is identical. This is the only legitimate way a high-frequency control ends up with a moment attached to it.
Core Principles
Uniform polish is a precondition, not a companion. Taylor's dirty-bathroom rule, credited in his own margin note to Paco Coursey: "our ability to introduce delight anywhere depends on achieving a consistent level of polish everywhere." A celebration in a product with a missing :focus-visible ring reads as a distraction from the mess. Concrete gate: if any interactive element in the same view lacks a hover, focus, active, disabled, or loading state, the budget goes there first and the moment is deferred. Exception: a throwaway demo or pitch prototype whose entire purpose is the one moment being demonstrated.
One delight moment per flow. "Mastering delight is mastering selective emphasis" — Taylor. Two celebrations in one flow do not double the feeling; they cancel, because emphasis is defined by what surrounds it. Count moments per flow, not per screen: 1. Exception: a genuinely multi-day flow (a course, an onboarding that spans weeks) may carry one per session, provided the sessions are far enough apart that nobody sees two in a row.
State the payload, or reject. Every proposal fills three fields in one sentence each — Frequency, Payload, If removed — in the block at the end of this file. If If removed answers "nothing", remove it; that is not a bar to clear, it is the default outcome. Reject in writing rather than silently, so the idea does not return next quarter. Exception: none — an unfilled field is itself a rejection.
Sound is composed to the interaction, not attached to it. On Honk, Taylor credits Ethan Mueller with composing the sound to match the interaction's timing — a stock library sample fired on an arbitrary event is noise wearing a costume. Hard constraints regardless: never play audio before a user gesture (browsers block it and users hate it), ship a mute control honored on first paint, and default the web to muted. Exception: a product whose output is audio, where sound is the content and not the garnish.
A haptic marks a transition, and in a shared moment it fires for everyone. Taylor's Honk example is a simultaneous haptic felt by both users at once — that simultaneity is the entire social payload, not the buzz. Platform truth on the web: navigator.vibrate is Android-only and iOS Safari has no haptic API at all, so never design a moment whose only payload is a haptic. Exception: native and React Native shells, where Haptics.impactAsync-class APIs are real on both platforms and a haptic can carry the moment alone.
Deliberate friction is a delight instrument when it changes behavior. Taylor reports that having people sign their name on screen "noticeably reduced bad behaviour in random chats" — the friction is the moment. Justify it by naming the behavior it suppresses; if you cannot name one, you have added a step. Exception, absolute: never add friction to a recovery path — undo, cancel, sign-out, close, delete-my-account stay frictionless no matter how much friction the forward path carries.
An easter egg must be unreachable by accident and free to miss. It sits on the path to 0 tasks, changes 0 state, and is the only route to 0 features — a "hidden" feature that users need is a discoverability bug. Exception: none — anything failing one of the three is a feature, and gets designed as one.
Under prefers-reduced-motion: reduce, celebration is the category that drops to zero movement. Elsewhere reduced motion means gentler, not absent; confetti, screen shake, and physics bursts are the exception — keep the words and the color, remove the travel entirely. Exception: none. Motion sickness is not a taste question.
Take having fun seriously. Taylor's phrase, and it is an engineering instruction: a moment ships with a spec, a review, and a prefers-reduced-motion path, or it does not ship. A half-built flourish is worse than none, because it reads as the level of care the whole product received. The aggregate is the mechanism — Paul Graham, quoted by Emil Kowalski: "a thousand barely audible voices all singing in tune." Most of that singing is invisible correctness; the audible note only works because of it. Exception: none — an unfinished moment is cut, not shipped rough.
Smell / Fix
| Smell |
Fix |
| Confetti on a daily action |
Score the outcome's frequency; if it is not the bottom row, cut it |
| Two celebrations in one flow |
Keep the one nearest the real outcome, delete the other |
| A flourish proposed while focus rings are missing |
Fix the states first; the moment is deferred, not rejected |
| Stock sound effect on a generic event |
Compose to the interaction or ship silent |
| Sound with no mute, or audio before a user gesture |
Mute honored on first paint; default muted on web |
| A moment whose only payload is a haptic |
Redesign for the visual channel; iOS Safari has no haptic API |
| Friction added to a cancel or undo path |
Remove it — recovery paths are exempt, without exception |
| An easter egg that is the only route to a feature |
Promote it to a real feature and design it as one |
Celebration with no prefers-reduced-motion path |
Words and color only; remove all travel |
| "It would be cool if…" with no named payload |
Apply Principle 3; reject in writing |
Output format
A delight proposal is one block, and a rejection uses the same block so both are comparable:
Moment: <what happens, in one sentence>
Frequency: <100+/day | tens/day | occasional | rare-first-celebration> ← scored on the OUTCOME
Payload: <the feeling being bought>
If removed: <what specifically gets worse>
Precondition: <state-coverage check in this view: pass | fail>
Verdict: Earned → hand to `motion` / `transitions` / `gestures` | Rejected → reason
Checklist
1---2name: delight3description: Use when deciding whether a moment earns extra craft: the delight-impact curve, easter eggs, celebration, sound and haptics, and deliberate friction. Decides whether, not how.4---567# Earning a Moment89Delight is a budget, not a style, and the default answer is no. This skill exists to reject nine ideas so the tenth is worth building — a product with one earned moment and uniform polish everywhere else beats a product with six flourishes and a broken focus ring. **Boundary with `motion`:** this skill decides *whether* a moment gets extra craft; `motion` decides *how* it moves. Nothing here contains a duration, an easing curve, or a transform — the instant the answer is yes, hand the moment to `motion` (one element), `transitions` (a sequence), or `gestures` (pointer-driven) and stop. If someone is asking which curve their confetti uses, they have already skipped the decision this skill makes.1011**Read the product's existing personality before proposing anything.** Count what is already there: a sound file, a `navigator.vibrate` call, a confetti dependency (`canvas-confetti`, `react-rewards`), a celebration component, a mute preference, a `prefers-reduced-motion` block. A product with zero flourishes has a deliberate register that one addition changes; a product with four has a consistency problem, and the right proposal is usually to remove three. Whatever survives uses the project's existing motion, sound, and token systems — a delight moment is the worst possible reason to introduce a second animation library.1213## Quick Reference1415| Topic | Where |16| --- | --- |17| Once the frequency tier is fixed and you need the concrete moments that have historically earned their place at that tier — plus the ones that never do | [moments.md](references/moments.md) |1819## The Delight-Impact Curve2021Benji Taylor's formulation: **"the potential for delight increases as the frequency of feature usage decreases."** Rauno Freiberg is credited in Taylor's own `/family-values` footnotes as a co-source on the frequency-and-novelty axis. Emil Kowalski's frequency gate gives the same curve as four operating rows, and this is the decision procedure — score the moment before discussing it:2223| How often the user sees it | Verdict |24| --- | --- |25| `100+ / day` (command palette, keyboard nav, tab switch) | No flourish. Ever. No animation either. |26| `tens / day` (hover, list navigation, save) | Strip whatever is there. |27| Occasional (modal, drawer, toast) | Standard treatment only — correctness, not character. |28| Rare / first-time / celebration | Delight is *available*. It is still not automatic. |2930Score by the frequency of the **outcome**, not the action. The four-hundredth message send of the day is top row; the send that completes a year-long streak is bottom row, even though the button is identical. This is the only legitimate way a high-frequency control ends up with a moment attached to it.3132## Core Principles33341. **Uniform polish is a precondition, not a companion.** Taylor's dirty-bathroom rule, credited in his own margin note to Paco Coursey: *"our ability to introduce delight anywhere depends on achieving a consistent level of polish everywhere."* A celebration in a product with a missing `:focus-visible` ring reads as a distraction from the mess. Concrete gate: if any interactive element in the same view lacks a hover, focus, active, disabled, or loading state, the budget goes there first and the moment is deferred. *Exception:* a throwaway demo or pitch prototype whose entire purpose is the one moment being demonstrated.35362. **One delight moment per flow.** *"Mastering delight is mastering selective emphasis"* — Taylor. Two celebrations in one flow do not double the feeling; they cancel, because emphasis is defined by what surrounds it. Count moments per flow, not per screen: `1`. *Exception:* a genuinely multi-day flow (a course, an onboarding that spans weeks) may carry one per session, provided the sessions are far enough apart that nobody sees two in a row.37383. **State the payload, or reject.** Every proposal fills three fields in one sentence each — `Frequency`, `Payload`, `If removed` — in the block at the end of this file. If `If removed` answers "nothing", remove it; that is not a bar to clear, it is the default outcome. Reject in writing rather than silently, so the idea does not return next quarter. *Exception:* none — an unfilled field is itself a rejection.39404. **Sound is composed to the interaction, not attached to it.** On Honk, Taylor credits Ethan Mueller with composing the sound to match the interaction's timing — a stock library sample fired on an arbitrary event is noise wearing a costume. Hard constraints regardless: never play audio before a user gesture (browsers block it and users hate it), ship a mute control honored on first paint, and default the web to `muted`. *Exception:* a product whose output *is* audio, where sound is the content and not the garnish.41425. **A haptic marks a transition, and in a shared moment it fires for everyone.** Taylor's Honk example is a simultaneous haptic felt by both users at once — that simultaneity is the entire social payload, not the buzz. Platform truth on the web: `navigator.vibrate` is Android-only and iOS Safari has no haptic API at all, so never design a moment whose only payload is a haptic. *Exception:* native and React Native shells, where `Haptics.impactAsync`-class APIs are real on both platforms and a haptic can carry the moment alone.43446. **Deliberate friction is a delight instrument when it changes behavior.** Taylor reports that having people sign their name on screen *"noticeably reduced bad behaviour in random chats"* — the friction *is* the moment. Justify it by naming the behavior it suppresses; if you cannot name one, you have added a step. *Exception, absolute:* never add friction to a recovery path — `undo`, `cancel`, `sign-out`, `close`, `delete-my-account` stay frictionless no matter how much friction the forward path carries.45467. **An easter egg must be unreachable by accident and free to miss.** It sits on the path to `0` tasks, changes `0` state, and is the only route to `0` features — a "hidden" feature that users need is a discoverability bug. *Exception:* none — anything failing one of the three is a feature, and gets designed as one.47488. **Under `prefers-reduced-motion: reduce`, celebration is the category that drops to zero movement.** Elsewhere reduced motion means gentler, not absent; confetti, screen shake, and physics bursts are the exception — keep the words and the color, remove the travel entirely. *Exception:* none. Motion sickness is not a taste question.49509. **Take having fun seriously.** Taylor's phrase, and it is an engineering instruction: a moment ships with a spec, a review, and a `prefers-reduced-motion` path, or it does not ship. A half-built flourish is worse than none, because it reads as the level of care the whole product received. The aggregate is the mechanism — Paul Graham, quoted by Emil Kowalski: *"a thousand barely audible voices all singing in tune."* Most of that singing is invisible correctness; the audible note only works because of it. *Exception:* none — an unfinished moment is cut, not shipped rough.5152## Smell / Fix5354| Smell | Fix |55| --- | --- |56| Confetti on a daily action | Score the outcome's frequency; if it is not the bottom row, cut it |57| Two celebrations in one flow | Keep the one nearest the real outcome, delete the other |58| A flourish proposed while focus rings are missing | Fix the states first; the moment is deferred, not rejected |59| Stock sound effect on a generic event | Compose to the interaction or ship silent |60| Sound with no mute, or audio before a user gesture | Mute honored on first paint; default `muted` on web |61| A moment whose only payload is a haptic | Redesign for the visual channel; iOS Safari has no haptic API |62| Friction added to a cancel or undo path | Remove it — recovery paths are exempt, without exception |63| An easter egg that is the only route to a feature | Promote it to a real feature and design it as one |64| Celebration with no `prefers-reduced-motion` path | Words and color only; remove all travel |65| "It would be cool if…" with no named payload | Apply Principle 3; reject in writing |6667## Output format6869A delight proposal is one block, and a rejection uses the same block so both are comparable:7071```72Moment: <what happens, in one sentence>73Frequency: <100+/day | tens/day | occasional | rare-first-celebration> ← scored on the OUTCOME74Payload: <the feeling being bought>75If removed: <what specifically gets worse>76Precondition: <state-coverage check in this view: pass | fail>77Verdict: Earned → hand to `motion` / `transitions` / `gestures` | Rejected → reason78```7980## Checklist8182- [ ] Frequency scored on the outcome, not the action, and written down83- [ ] Top two rows of the curve produce a rejection, always84- [ ] State coverage in the same view verified before any moment is approved85- [ ] Exactly one delight moment in this flow86- [ ] Payload and removal cost named in one sentence each87- [ ] Sound composed, muted by default, mute honored on first paint88- [ ] No moment depends on a haptic alone89- [ ] Friction justified by a named behavior, and absent from every recovery path90- [ ] Easter eggs off-path, stateless, and non-essential91- [ ] Reduced-motion path removes travel from celebration entirely92- [ ] Verdict recorded; timing and curves handed to `motion`, never decided here