Notifications & Toasts Skill
How this skill behaves (read first)
This is a generative skill. The default failure modes: urgency inflation (everything is an alert; success messages interrupt), frequency abuse (repeat pings for the same event until users kill all notifications), and attention disrespect (badges for non-notifications, pings with no user value). A notification spends the user's attention — the type must match the message's actual urgency, and the system must stay worth listening to. This skill gates:
- Establish urgency, audience moment, and channel — these pick the type.
- Apply the always-true core — type-urgency match, frequency discipline, content brevity, user control.
- Surface the engagement levers (push strategy, personalization, rich media) with trade-offs — this is dark-patterns-adjacent territory.
Then it hands off to ux-heuristics-audit, ux-accessibility-audit, ux-aesthetics-audit, ux-microcopy-audit, and ux-dark-patterns-audit for validation.
Step 0 — Establish context before designing
Ask if not known; state the assumption if proceeding without an answer:
- How urgent is the message, really? Needs action now (failed payment) → persistent alert. Useful soon (storage near limit) → warning. FYI (saved, sent) → transient snackbar/toast. Just "something's new" → badge. Be honest — urgency inflation is the root failure.
- Where is the user? In the app and active → don't interrupt: increment a badge or insert the update inline. Away → push (if opted in). Mid-task → batch for later.
- Whose goal does it serve? A notification that serves only the business (re-engagement nag) costs trust. If users wouldn't thank you for it, reconsider.
- Platform — Android toasts/snackbars vs. iOS conventions; push character limits (~39 title / ~150 body).
The always-apply core (correct for almost every case)
Match the type to the urgency
- Badge — dot (or count) top-right of an icon, for unread notifications only — never scores, weather, or marketing. Dot shape, conventional placement; disappears once seen.
- Status badge — at-a-glance state (online, in-progress, completed) — informational, not a ping.
- Banner — temporary strip (top/bottom) for events worth a glance (new message preview); doesn't block.
- Snackbar — bottom-of-screen confirmation in context, often with one action ("Message sent" + Undo). Never covers a FAB or important controls.
- Toast — low-priority system messages; can't be dismissed, can stack — use sparingly.
- Alert — persists until resolved; for things that demand attention. Success = green + check, auto-dismissing; info = ℹ; warning = time-to-act heads-up; error = red + exclamation, immediate action. Don't dress an info message as a warning.
- Push — reaches users outside the app; the highest-cost channel, opt-in and easiest to lose (see gated table).
Frequency discipline
- One event, one notification. No re-pings for the same unread message; group related notifications instead.
- Foreground grace: when the app is open, update the badge or insert content into the view — don't fire a system notification at someone already looking at the screen.
- Contextual and personal beats broadcast: segment, reference the user's actual journey (usage limit approaching, feature they use), never spray.
Content
- Concise and scannable: short title carrying the message, plain language, no jargon. Push: ~39-char title, ~150-char body — shorter is better.
- Actionable where possible: snackbar Undo, push actions that resolve without opening the app.
User control (non-negotiable)
- Easy to mute or turn off — globally and per-type, with frequency options. Users who can tune notifications keep them; users who can't, kill them (or the app).
- No blame or shame in opt-out flows.
The context-dependent decisions (surface, don't auto-apply)
| Decision |
Apply when |
Avoid / adapt when |
Default recommendation |
| Push notifications at all |
Time-sensitive, user-valued updates (order shipped, message received) |
Re-engagement nags, generic promos — the fastest route to opt-out |
Transactional first; promotional only with explicit, granular opt-in |
| Push opt-in ask |
Primed, at a relevant journey moment, with the value stated |
Raw system dialog at first launch |
Prime → ask in context (see ux-modals-and-dialogs for permission patterns) |
| Personalization |
Name, past behavior, preferences — measurably higher engagement |
Creepy specificity; data users didn't expect you to use |
Personalize from in-app behavior; stay transparent |
| Rich media (images/GIFs) |
Visual content adds real information (product image, delivery photo) |
Decoration that bloats a simple message |
Text-first; media when it informs |
| Location-based (geofencing) |
Genuine contextual value (gate change, store nearby with an active order) |
Surveillance-flavored marketing pings |
High bar; explicit permission, obvious value |
| Timing optimization |
Send in users' active hours, their time zone |
Optimizing for clicks over usefulness (11pm "we miss you") |
User-behavior-based timing, capped frequency |
| Badge counts vs. dots |
Counts for countable unread items (inbox) |
Counts that grow unbounded and induce anxiety |
Dot for "something new"; count where the number helps |
| Performance monitoring |
Track opens/CTR and opt-outs/mutes as fatigue signals |
Celebrating opens while opt-outs climb |
Treat opt-out rate as the primary health metric |
Validate the result (orchestration)
Hand-offs name each lens by its installable skill name. Invoke one only if that skill is installed; if it isn't, this skill's own core already carries these rules — proceed without it rather than blocking.
After generating or revising, hand the result to the audit lenses rather than declaring it done. These are candidate lenses — posture is set by docs/orchestration-policy.md, or route the whole thing through ux-design-review. Here, heuristics, microcopy, and dark-patterns are Tier A (auto-run); accessibility, aesthetics, and mobile-responsiveness are Tier B (offered) — under an existing design system aesthetics is suppressed and accessibility narrows to usage; mobile-responsiveness applies only on mobile. If the user invoked this skill for one specific thing, respect that scope.
ux-heuristics-audit (Tier A) — visibility of system status without disruption, match between urgency and presentation, user control and freedom.
ux-accessibility-audit (Tier B — offer; narrow under a design system) — color-plus-icon urgency coding (never color alone), screen-reader announcement of transient messages, snackbar timing sufficient to read.
ux-aesthetics-audit (Tier B — offer; suppress under a design system) — alert styling restraint, badge/banner visual noise across the interface.
ux-microcopy-audit (Tier A) — title/body brevity, plain language, CTA verb quality, opt-out wording.
ux-dark-patterns-audit (Tier A) — the backlog flags this skill as attention-respect territory: manufactured urgency, nag loops, buried mute settings, guilt-trip opt-outs.
ux-mobile-responsiveness-audit (Tier B — offer; applies only on mobile) — when the context is mobile: snackbar/FAB layout, push rendering across OSes.
If the audits surface a conflict (e.g., engagement targets vs. notification fatigue), resolve back toward the primary task: a notification system only works while users trust it — protect that trust over any single campaign.
Common do/don't patterns
| ❌ Don't |
✅ Do |
| Every message styled as an urgent alert |
Type matched to real urgency; most messages are quiet |
| Re-ping the same unread message hourly |
One event, one notification; group the rest |
| System notification while the user is in the app |
Badge increment or inline insert |
| Badge count showing the weather |
Badges for unread notifications only |
| Success modal interrupting the flow |
Auto-dismissing snackbar/success alert |
| Snackbar covering the FAB |
Snackbar above all content, clear of controls |
| Push permission dialog at first launch |
Primed, contextual ask with stated value |
| "We miss you 😢" at 11pm |
Time-zone-aware, behavior-based, user-valued pings |
| Mute buried four screens deep |
Per-type controls, easy global off |
| 150 characters of jargon |
~39-char title that carries the message |
| Ship without checking |
Hand off to heuristics + accessibility + aesthetics + microcopy + dark-patterns |
Source lessons (Uxcel)
1---2name: ux-notifications-and-toasts3description: Design or critique notifications — pick the right type (badge, banner, snackbar, toast, alert, push) for the message's urgency, and respect user attention with timing, frequency, and opt-out controls. Trigger when the user asks to design or review notifications, toasts, snackbars, badges, banners, alerts, push notifications, or a notification strategy.4license: MIT5---67# Notifications & Toasts Skill89## How this skill behaves (read first)1011This is a **generative** skill. The default failure modes: **urgency inflation** (everything is an alert; success messages interrupt), **frequency abuse** (repeat pings for the same event until users kill all notifications), and **attention disrespect** (badges for non-notifications, pings with no user value). A notification spends the user's attention — the type must match the message's *actual* urgency, and the system must stay worth listening to. This skill gates:12131. **Establish urgency, audience moment, and channel** — these pick the type.142. **Apply the always-true core** — type-urgency match, frequency discipline, content brevity, user control.153. **Surface the engagement levers** (push strategy, personalization, rich media) with trade-offs — this is dark-patterns-adjacent territory.1617Then it **hands off to `ux-heuristics-audit`, `ux-accessibility-audit`, `ux-aesthetics-audit`, `ux-microcopy-audit`, and `ux-dark-patterns-audit`** for validation.1819---2021## Step 0 — Establish context before designing2223Ask if not known; state the assumption if proceeding without an answer:2425- **How urgent is the message, really?** Needs action *now* (failed payment) → persistent alert. Useful soon (storage near limit) → warning. FYI (saved, sent) → transient snackbar/toast. Just "something's new" → badge. Be honest — urgency inflation is the root failure.26- **Where is the user?** In the app and active → don't interrupt: increment a badge or insert the update inline. Away → push (if opted in). Mid-task → batch for later.27- **Whose goal does it serve?** A notification that serves only the business (re-engagement nag) costs trust. If users wouldn't thank you for it, reconsider.28- **Platform** — Android toasts/snackbars vs. iOS conventions; push character limits (~39 title / ~150 body).2930---3132## The always-apply core (correct for almost every case)3334### Match the type to the urgency3536- **Badge** — dot (or count) top-right of an icon, for *unread notifications only* — never scores, weather, or marketing. Dot shape, conventional placement; disappears once seen.37- **Status badge** — at-a-glance state (online, in-progress, completed) — informational, not a ping.38- **Banner** — temporary strip (top/bottom) for events worth a glance (new message preview); doesn't block.39- **Snackbar** — bottom-of-screen confirmation in context, often with one action ("Message sent" + Undo). Never covers a FAB or important controls.40- **Toast** — low-priority system messages; can't be dismissed, can stack — use sparingly.41- **Alert** — persists until resolved; for things that demand attention. **Success = green + check, auto-dismissing; info = ℹ; warning = time-to-act heads-up; error = red + exclamation, immediate action.** Don't dress an info message as a warning.42- **Push** — reaches users outside the app; the highest-cost channel, opt-in and easiest to lose (see gated table).4344### Frequency discipline4546- **One event, one notification.** No re-pings for the same unread message; group related notifications instead.47- **Foreground grace:** when the app is open, update the badge or insert content into the view — don't fire a system notification at someone already looking at the screen.48- **Contextual and personal beats broadcast:** segment, reference the user's actual journey (usage limit approaching, feature they use), never spray.4950### Content5152- **Concise and scannable:** short title carrying the message, plain language, no jargon. Push: ~39-char title, ~150-char body — shorter is better.53- **Actionable where possible:** snackbar Undo, push actions that resolve without opening the app.5455### User control (non-negotiable)5657- **Easy to mute or turn off** — globally and per-type, with frequency options. Users who can tune notifications keep them; users who can't, kill them (or the app).58- **No blame or shame in opt-out flows.**5960---6162## The context-dependent decisions (surface, don't auto-apply)6364| Decision | Apply when | Avoid / adapt when | Default recommendation |65|---|---|---|---|66| **Push notifications at all** | Time-sensitive, user-valued updates (order shipped, message received) | Re-engagement nags, generic promos — the fastest route to opt-out | Transactional first; promotional only with explicit, granular opt-in |67| **Push opt-in ask** | Primed, at a relevant journey moment, with the value stated | Raw system dialog at first launch | Prime → ask in context (see `ux-modals-and-dialogs` for permission patterns) |68| **Personalization** | Name, past behavior, preferences — measurably higher engagement | Creepy specificity; data users didn't expect you to use | Personalize from in-app behavior; stay transparent |69| **Rich media (images/GIFs)** | Visual content adds real information (product image, delivery photo) | Decoration that bloats a simple message | Text-first; media when it informs |70| **Location-based (geofencing)** | Genuine contextual value (gate change, store nearby with an active order) | Surveillance-flavored marketing pings | High bar; explicit permission, obvious value |71| **Timing optimization** | Send in users' active hours, their time zone | Optimizing for clicks over usefulness (11pm "we miss you") | User-behavior-based timing, capped frequency |72| **Badge counts vs. dots** | Counts for countable unread items (inbox) | Counts that grow unbounded and induce anxiety | Dot for "something new"; count where the number helps |73| **Performance monitoring** | Track opens/CTR *and* opt-outs/mutes as fatigue signals | Celebrating opens while opt-outs climb | Treat opt-out rate as the primary health metric |7475---7677## Validate the result (orchestration)7879> Hand-offs name each lens by its installable skill `name`. Invoke one only if that skill is installed; if it isn't, this skill's own core already carries these rules — proceed without it rather than blocking.8081After generating or revising, hand the result to the audit lenses rather than declaring it done. These are **candidate** lenses — posture is set by `docs/orchestration-policy.md`, or route the whole thing through `ux-design-review`. Here, **`heuristics`, `microcopy`, and `dark-patterns` are Tier A (auto-run); `accessibility`, `aesthetics`, and `mobile-responsiveness` are Tier B (offered)** — under an existing design system `aesthetics` is suppressed and `accessibility` narrows to usage; `mobile-responsiveness` applies only on mobile. If the user invoked this skill for one specific thing, respect that scope.8283- **`ux-heuristics-audit`** *(Tier A)* — visibility of system status without disruption, match between urgency and presentation, user control and freedom.84- **`ux-accessibility-audit`** *(Tier B — offer; narrow under a design system)* — color-plus-icon urgency coding (never color alone), screen-reader announcement of transient messages, snackbar timing sufficient to read.85- **`ux-aesthetics-audit`** *(Tier B — offer; suppress under a design system)* — alert styling restraint, badge/banner visual noise across the interface.86- **`ux-microcopy-audit`** *(Tier A)* — title/body brevity, plain language, CTA verb quality, opt-out wording.87- **`ux-dark-patterns-audit`** *(Tier A)* — the backlog flags this skill as attention-respect territory: manufactured urgency, nag loops, buried mute settings, guilt-trip opt-outs.88- **`ux-mobile-responsiveness-audit`** *(Tier B — offer; applies only on mobile)* — when the context is mobile: snackbar/FAB layout, push rendering across OSes.8990If the audits surface a conflict (e.g., engagement targets vs. notification fatigue), resolve back toward the primary task: a notification system only works while users trust it — protect that trust over any single campaign.9192---9394## Common do/don't patterns9596| ❌ Don't | ✅ Do |97|---|---|98| Every message styled as an urgent alert | Type matched to real urgency; most messages are quiet |99| Re-ping the same unread message hourly | One event, one notification; group the rest |100| System notification while the user is in the app | Badge increment or inline insert |101| Badge count showing the weather | Badges for unread notifications only |102| Success modal interrupting the flow | Auto-dismissing snackbar/success alert |103| Snackbar covering the FAB | Snackbar above all content, clear of controls |104| Push permission dialog at first launch | Primed, contextual ask with stated value |105| "We miss you 😢" at 11pm | Time-zone-aware, behavior-based, user-valued pings |106| Mute buried four screens deep | Per-type controls, easy global off |107| 150 characters of jargon | ~39-char title that carries the message |108| Ship without checking | Hand off to heuristics + accessibility + aesthetics + microcopy + dark-patterns |109110---111112## Source lessons (Uxcel)113114- [Notification Types & When to Use Them](https://uxcel.com/lessons/notification-types-756)115- [Best Practices for Designing Notifications](https://uxcel.com/lessons/notifications-best-practices-164)116- [Push Notification Strategies That Drive Engagement](https://uxcel.com/lessons/push-notification-strategies-that-drive-engagement-774)117- [Designing Mobile Notifications & Dialogs](https://uxcel.com/lessons/mobile-notifications--dialogs-142)