All skills
simota avatar

/prose

@35ffd55
by shingo imotasimota/agent-skills85 stars
15

Writing user-facing UX text including microcopy, error messages, voice and tone design, onboarding copy, and accessibility text. Use when UX writing or content strategy is needed.

Use this Skill: https://skilld.dev/gh/simota/agent-skills/prose

This session only. Nothing lands on disk.

referencenotification-copy.md

≈2.4k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Notification Copy Reference

Purpose: Design push, email, in-app, and SMS notification copy with channel-specific length budgets, tone rules, and CTA patterns. Each channel has distinct constraints; one notification copy does not fit all channels.

Scope Boundary

  • prose notification: Channel-specific notification copy (this document).
  • prose microcopy (elsewhere): Static UI copy. Notifications are transactional/triggered.
  • prose errors (elsewhere): Failure messages inside the UI. Notifications can be error-adjacent (e.g., "payment failed") but use the notification format.
  • gateway (elsewhere): Messaging integration and delivery infrastructure. Prose owns copy; gateway owns transport.
  • Growth (elsewhere): Re-engagement campaign strategy. Prose writes the copy; Growth decides who/when/what.

Channel Length Budgets

Channel Primary Secondary Hard Limit
iOS push Title ≤ 50 chars Body ≤ 120 chars (lock screen truncates at ~60) 178 chars combined
Android push Title ≤ 50 chars Body ≤ 120 chars System varies; 240 combined is safe
Web push Title ≤ 50 chars Body ≤ 120 chars Browser-dependent
Email subject ≤ 50 chars (mobile inbox cuts at ~40) — Gmail truncates at ~70 on desktop
Email preheader ≤ 100 chars (shown after subject) — Do not duplicate subject
Email body Fit the ask above the fold — No hard cap; concise wins
In-app (toast / banner) Body ≤ 160 chars Optional CTA ≤ 24 chars 160 preferred
In-app (modal) Headline ≤ 60 chars Body ≤ 2 paragraphs Respect a11y focus
SMS Message ≤ 160 chars (incl. opt-out) — Multi-part SMS costs more; avoid

Copy Structure Per Channel

Push (iOS / Android / Web)

TITLE  : [subject — who/what happened]
BODY   : [value to user — why they should tap]
DEEPLINK: [exact screen / resource ID]

Rules:

  • Title should stand alone on lock screen (user may not expand).
  • Body adds value, not repetition: "Order delivered" / "Open to rate" — not "Your order delivered. Your order was delivered".
  • Never fake urgency (no "⚠️ URGENT" for non-urgent things).
  • Use emoji sparingly; at most one, at position-0, only if brand-voice allows.

Email

SUBJECT   : [benefit or clear action]
PREHEADER : [context that earns the open]
HEADER    : [headline matching subject]
BODY      : [single ask, one paragraph]
CTA       : [button text + URL]
FOOTER    : [unsubscribe, legal]

Rules:

  • Subject + preheader act as a pair — preheader extends the subject, does not repeat it.
  • One primary CTA above the fold. Secondary actions as text links.
  • First 40 chars of subject are the most-seen real estate.
  • Avoid all-caps and excessive punctuation (spam triggers).
  • Identify sender clearly (brand name, not just "no-reply").

In-App (toast / banner / modal)

TITLE (optional) : [verb-led outcome]
BODY             : [one sentence of context]
PRIMARY CTA      : [2-4 words]
DISMISS          : ["Dismiss" or "X" — always available]

Rules:

  • Never block the user's primary task with a modal unless critical.
  • Toasts auto-dismiss (5s default); do not hide critical info in toasts.
  • Destructive / one-way actions need modal confirmation, not toast.

SMS

MESSAGE: [BrandName] [short value + action]. [Reply STOP to opt out.]

Rules:

  • Include brand identifier (carrier trust).
  • Include opt-out phrase when regulated (TCPA, CASL, CAN-SPAM).
  • Never send marketing SMS without prior consent.
  • Short codes require pre-registration; long codes are more flexible.

Notification Types

Type Example Channel priority
Transactional (user acted) "Order shipped" push + email + in-app
Social (someone acted toward user) "Alice mentioned you" push + in-app
System (state change) "Trial ends in 3 days" email + in-app banner
Re-engagement "Haven't seen you in a while" email (pull back), in-app (returning user)
Critical (security, billing) "Password changed", "Payment failed" email + push + in-app; SMS if severe
Summary / digest "Your weekly summary" email only

Channel selection rules:

  • High-urgency + short info → push.
  • Medium-urgency + needs context → email.
  • In-session acknowledgment → in-app toast.
  • Critical compliance → multi-channel.

Voice and Tone

Context Tone
Transactional confirmation Warm, concrete ("Order #1234 is on its way")
Social Conversational, human ("Alice gave your post a high-five")
System / billing Calm, direct ("Your trial ends on Friday")
Critical security Unambiguous, actionable ("Your password was changed. Not you? Tap to secure.")
Re-engagement Inviting, low-pressure ("Come back to see what's new")
Marketing Respectful of the opt-in ("A 20% code, because you're a member")

Follow the project's established brand voice; if none exists, run Prose's tone recipe first.

Deeplink Contract

Every push notification should carry a deeplink so tapping opens the exact screen:

{
  "notification": {
    "title": "Your order shipped",
    "body": "Order #1234 is on its way. Track it live."
  },
  "data": {
    "deeplink": "app://orders/1234/tracking",
    "type": "order_shipped",
    "order_id": "1234"
  }
}

Missing deeplink = tap drops user in home screen = low CTR.

Accessibility Notes

  • Push notifications should be concise — screen readers read them verbatim on unlock.
  • Use plain language; no ambiguous abbreviations.
  • For in-app toasts: wire to aria-live="polite" region for SR announcement.
  • For critical alerts: use aria-live="assertive" sparingly (interrupts screen reader).
  • Provide a visible dismiss affordance — do not rely on time-out alone for a11y.

Opt-Out / Preferences

  • Every channel must respect user preferences.
  • First-time push permission prompt must have a pre-permission UI explaining value.
  • Email unsubscribe = one-click (CAN-SPAM), accessible within 10 seconds.
  • SMS opt-out = reply "STOP" (honored within 24h per TCPA).
  • Never send further messages after opt-out.
  • In-app notification center: allow user to set quiet hours, types, and frequency.

Output Template

## Notification Copy: [Event Name]

### Scenario
- **Trigger**: [what triggers this notification]
- **Recipient**: [persona / segment]
- **Urgency**: [critical / high / medium / low]
- **Channel(s) selected**: [push / email / in-app / SMS — with rationale]

### Copy per Channel

#### Push
- Title (≤50 chars): "..."
- Body (≤120 chars): "..."
- Deeplink: `app://...`

#### Email
- Subject (≤50 chars): "..."
- Preheader (≤100 chars): "..."
- Body paragraphs: [...]
- Primary CTA: "..." → `https://...`

#### In-app
- Style: [toast / banner / modal]
- Title (optional): "..."
- Body (≤160 chars): "..."
- Primary CTA: "..."

#### SMS (if applicable)
- Message (≤160 chars incl. opt-out): "[Brand] ... Reply STOP to opt out."

### Tone & Voice
- Selected tone: [see voice-tone-framework]
- Rationale: [why this tone for this message]

### Telemetry (Pulse)
- Event: `notification_sent` / `notification_opened` / `notification_dismissed`
- Payload: channel, type, deeplink destination, user segment

### Compliance Check
- [ ] Opt-in verified
- [ ] Opt-out copy present (SMS / marketing email)
- [ ] Quiet hours respected
- [ ] Regional compliance (TCPA, CAN-SPAM, GDPR, CASL)

### Handoffs
- gateway (delivery infrastructure)
- Polyglot (i18n)
- Pulse (open / CTR measurement)
- Growth (campaign strategy)
- Cloak / Canon[regulatory] (regulated channels)

Anti-Patterns

Anti-pattern Why Fix
"🚨 URGENT" on everything Habituation, distrust Reserve for true urgency
Marketing push without opt-in TCPA / app-store violation Require explicit opt-in
Email subject = preheader Wastes real estate Preheader extends subject
Push without deeplink User lands on home, drops off Always deeplink
SMS without opt-out Regulatory violation Include "Reply STOP"
Same copy across channels Ignores channel constraints Rewrite per channel
No sender identity on SMS Carrier spam filter Start with "[Brand]"
All-caps subject Spam filter Title case
"no-reply@" as sender Lowers open rate, blocks replies Use a monitored address or clear brand name
Push waking user at 3 AM Lost trust Respect timezone + quiet hours

Deliverable Contract

When notification completes, emit:

  • Channel selection with rationale per type and urgency.
  • Per-channel copy block respecting length budgets.
  • Deeplink (for push) and URL (for email) pointing to exact resource.
  • Tone alignment with voice framework.
  • Telemetry plan (Pulse events).
  • Compliance checklist (opt-in / opt-out / quiet hours / regional law).
  • Handoffs: gateway, Polyglot, Pulse, Growth, Cloak/Canon[regulatory].

References

  • Apple HIG — Notifications
  • Material Design — Notifications
  • CAN-SPAM / TCPA / CASL / GDPR / ePrivacy — opt-in and opt-out law
  • Intercom — "The Rules of Re-engagement" (notification cadence)
  • Airship / Braze / OneSignal — push notification best practices
  • Mailchimp / Litmus — email subject line and preheader studies

Source: SKILL.md on GitHub

No alerts13d5 checks · Risk SAFE
  • Gen Agent Trust Hub13d

    The 'Prose' skill is a professional UX writing and content strategy library for AI agents. It provides comprehensive guidelines for accessibility, error messages, and microcopy design. No security risks, malicious code, or exfiltration patterns were detected across the skill's instructions or reference files.

  • Socket13d

    No alerts

  • Snyk13d

    Risk: LOW · No issues

  • Runlayer6mo

    6 files scanned · No issues

  • ZeroLeaks5mo

    Score: 93/100 · 2 sections analyzed

Signed by skilld at 35ffd55. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 2 days ago.

Activeupdated 2 weeks ago

README badge

README badge for simota/agent-skills/prose