agentleFS
moasqmoasq/ios-dev-agent/.agents/skills/content-composer/SKILL.md

content-composer

Skill4 starsChanged 6 months agoMITView on GitHub

Use whenever writing or editing user-facing copy in the app — button labels, headers, section titles, card text, toasts, empty states, onboarding, paywalls, notifications, App Store metadata, release notes. Covers the voice, tone, and mechanics of mobile UI microcopy: length caps per element, banned characters (em-dash never, ellipsis rarely), banned AI phrases (unlock, discover, embark, dive in), active-verb CTAs, sentence case vs Title Case, and copy-review checklist. Trigger on any word change to a SwiftUI `Text`, `Label`, `Button` label, navigation title, or any string literal that will be displayed to a user.

The file

We split this skill into the rules it gives an agent

5 rules. About 0 are common, 3 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈3

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Every user-facing string in this app must pass this skill's rules.

    line 8
  2. Very specific:

    Ellipsis: use a real … (U+2026), not three dots ....

    line 17
  3. Very specific:

    Eyebrows / kickers / section labels: ALL CAPS with kerning (kerning(1.2)).

    line 52
  4. Distinctive:

    Always start with a verb.

    line 88
  5. Distinctive:

    Run this on every new string before committing:

    line 106

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Content Composer — Mobile UI Copy Rules

Every user-facing string in this app must pass this skill's rules. The point is simple, human, skimmable copy that fits a small screen and doesn't sound like a marketing template or an LLM.

The One Rule About Characters

No em-dashes (—). Ever.

LLMs love em-dashes. Humans typing on phones do not. Every — in UI copy is a tell that the text came from an AI and wasn't revised. Replace with a period, comma, or split into two sentences. The same applies to en-dashes in prose (–); keep en-dashes only for numeric ranges (3–5 min).

Other character rules:

  • Ellipsis: use a real … (U+2026), not three dots .... Use only for "in progress" indicators (Loading…). Never in button labels or headers.
  • Smart quotes (" " ' ') for prose inside cards, never in code identifiers.
  • Middle dot (·) is allowed as a separator (Level 17 · Run 3). Keep it short.
  • No emoji in body copy. Icons belong in Image(systemName:), not inline text.

Voice

  • Second person. "You're on fire." not "The user is on fire."
  • Active verbs in every CTA. "Continue drills", "Start speaking", "Retry run". Never "Continuation of drills".
  • Present tense by default. "You practiced today." not "You have practiced today."
  • Concrete over abstract. "3 runs to Level 18" beats "More progress awaits".
  • No marketing dust. Ban: "unlock", "discover", "embark", "dive in", "journey awaits", "unleash". These are AI filler.
  • No hedging. Ban: "Feel free to…", "You can now…", anything ending in "!" more than once per screen.
  • No clichés. "A thousand-mile journey…", "Rome wasn't built in a day…" — kill on sight.

Length Caps (Mobile)

ElementMax lengthExample
Primary CTA button3 words, ≤ 20 charsContinue drills
Secondary button2 words, ≤ 14 charsTry again
Card title / headline5 words, ≤ 38 charsEnterprise tier pre-brief
Card eyebrow (ALL CAPS kicker)3 words, ≤ 20 charsNEXT CHALLENGE
Card subtitle1 sentence, ≤ 64 chars2 of 3 drills passed
Section header2–3 wordsRecent activity
Inline toast / snackbar1 short sentence, ≤ 60 charsSaved to your library
Empty state title≤ 6 wordsNo sessions yet
Empty state body1–2 short sentences, ≤ 120 charsFinish a challenge to see it here.
Navigation title1–3 wordsYour Journey

The test: can a skimmer understand the screen in under 2 seconds? If the eye lingers, copy is too long.

Casing

  • Buttons, titles, headings: sentence case. "Continue drills", not "Continue Drills".
  • Eyebrows / kickers / section labels: ALL CAPS with kerning (kerning(1.2)). "NEXT CHALLENGE".
  • Run/level names retain the product-specific capitalization from the data ("Enterprise tier pre-brief").
  • Product names stay exact. For example: "RevenueCat", "App Store Connect", and the app's configured product name.

Banned Phrase Cheat Sheet

BanWhyReplace with
"Unlock your potential"Marketing fillerStart the next run
"Embark on your journey"ClichéOpen the roadmap
"Discover…", "Explore…" aloneVague verbsConcrete verb: See your progress
"Feel free to…"HedgingDirect imperative
"Seamlessly", "intuitively"Marketing adjectivesDelete the word
"—"AI tell., ,, or split
"Loading..." (three dots)Typography"Loading…" (real ellipsis)
"Oops!", "Uh oh!"Fake casualDescribe the problem directly
"We're sorry but…"Apologetic fluffSay what to do

Error Messages — Microcopy Rules

Three parts, in order:

  1. What happened — short, no blame.
  2. What the user can do — single clear action.
  3. Optional retry / help — one button.

Bad: "Oops! Something went wrong — please try again later." Good: "Can't complete that right now. Check your connection, then retry."

Empty / Loading / Error States

  • Empty: one sentence + one CTA. No illustration caption.
  • Loading: one word (Loading…) or skeleton. No spinner text.
  • Error: see Error Messages rule.

CTAs — Button Label Discipline

  • Always start with a verb.
  • Match the user's mental model, not implementation terminology. "Continue" not "Advance state".
  • Same action = same label everywhere in the app. If it says "Continue drills" on Home, it must say "Continue drills" in the detail sheet, not "Resume drills".
  • Disabled state still has a label. Don't change wording — only the state.

Before / After Examples (real app)

BeforeAfterWhy
"On fire — tap for stats"Remove line; let icon + number speakEm-dash + redundant instruction
"Every tier, every run. Embark on your journey.""6 tiers · every run on one map"Concrete, shorter, no cliché
"You've unlocked Level 17!""Level 17 unlocked"No exclam, fewer words
"Analyzing your session…"Keep — real ellipsis, verb-firstGood
"Results update: new pricing at 60 days"Keep if user-facing and factualGood
"Oops! Recording failed. Let's try again.""Recording failed. Retry."Direct, no apology

Review Checklist

Run this on every new string before committing:

  • Zero — characters
  • Zero ... (use … if needed)
  • Starts with a verb if it's a CTA
  • Under the length cap for its element
  • Sentence case (not Title Case) unless it's an ALL-CAPS eyebrow
  • No banned phrases from the cheat sheet
  • Same action uses the same label elsewhere in the app
  • Read aloud: sounds like a person, not marketing copy
  • Second person (you/your) where the user is the subject
  • Present tense unless history is the point

What This Skill Is Not For

  • Code comments, DocC, API docs — keep natural engineering prose.
  • Server-returned user-generated content (session titles, run names). Those are data; don't rewrite them.
  • Log messages (logger.info). Those go to Logger, not users.

Sources

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.