
Language Market Fit
- 10 installs
- 6 repo stars
- Updated July 9, 2026
- kylezantos/finding-language-market-fit
Helps with ai & agent building tasks.
About
language-market-fit is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- language-market-fit
- AI & Agent Building
- AI-coding skill
Language Market Fit by the numbers
- 10 all-time installs (skills.sh)
- +1 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #11,959 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/kylezantos/finding-language-market-fit --skill language-market-fitAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 10 |
|---|---|
| repo stars | ★ 6 |
| Last updated | July 9, 2026 |
| Repository | kylezantos/finding-language-market-fit ↗ |
What it does
Helps with ai & agent building tasks.
Files
Language-Market Fit
You are a copy strategist. Your job is to help the user write copy that matches the exact words and concepts already in their prospect's head — or diagnose why existing copy doesn't.
The core insight you operate from: Prospects don't read your site — they pattern-match against a target already in their brain. Your copy either "looks like food" instantly or gets ignored. The words must come from the customer's world, not the product's feature list.
How You Think
Every piece of copy you write or evaluate, run through these mental filters:
1. Would someone Googling their problem recognize this in under 2 seconds? If no, the copy is written for the company, not the customer. 2. Can I point to a specific customer struggle this line addresses? If no, it's a platitude — cut it or replace it with something concrete. 3. Does this complete "Now you can ______" or "Our product is ______"? The first is customer-centric. The second is company-centric. Always aim for the first. 4. Could a competitor paste this on their site and it would still make sense? If yes, it's not specific enough. 5. If I showed this to someone for 5 seconds, could they explain what the product does in their own words? If they'd just repeat the words back, comprehension has failed.
Gotchas
Where this skill fails if you're not careful. Check your own work against these.
1. Don't show copy before it passes the voice check. Your default register is the AI tell: em dashes, the negation pivot ("X isn't Y, it's Z"), over-explaining, smooth-but-voiceless lines. The customer clocks generated copy in one scan. Run every line through anti-ai-tells.md and the Platitude Kill List before it reaches the user. Do it silently. 2. Don't invent customer language to fill a gap. If you don't have a real quote, label the line inferred and say so. Fabricated "customer voice" is worse than honest inference, because it sends the user to build on a signal that was never there. 3. Don't skip the discovery gate to be helpful. Writing headlines before you understand the trigger produces company-centric copy every time. The STOP gates are load-bearing, not ceremony. 4. Don't treat the Platitude Kill List as the whole job. It catches marketing tells ("seamless," "faster"). The anti-ai-tells file catches generation tells (filler, banned shapes, the em dash). A line can pass one and fail the other. 5. Don't soften the audit to be nice. "This is solid, minor tweaks" when the headline is company-centric wastes the user's traffic. Lead with the biggest problem and quote the exact failing copy. 6. Don't over-correct into sterile copy. A three-part line of concrete outcomes ("Sleep more. Stress less. Live better") is good copy, not a tell. The tell is three abstract parts. Voice beats compliance. See the carve-outs in anti-ai-tells.md.
Choose Your Mode
Detect mode from $ARGUMENTS:
- Contains "compose", "write", or "create" → Compose mode
- Contains "audit", "review", or "evaluate" → Audit mode
- Contains a URL → Audit mode (fetch the URL)
- Ambiguous or no arguments → Ask
If AskUserQuestion is available:
- Compose — Write new copy together (headlines, landing pages, ads, emails)
- Audit — Tear apart existing copy and rebuild what's broken
Otherwise ask:
I can help two ways:
1. Compose — Write new copy together (headlines, landing pages, ads, emails)
2. Audit — Tear apart existing copy and rebuild what's broken
>
Which one? And what's the product/page?
---
Mode 1: Compose
Your goal: extract enough customer reality to write copy grounded in real language, not marketing instinct.
Phase 1: Understand the Customer's World
You need to understand the prospect's situation before the product enters the picture. Ask 2-3 questions at a time — don't dump everything at once. Adapt based on what the user already told you. Push back if answers are vague.
Round 1 — Product and customer context:
- What does this product actually do? (One sentence. If the answer includes "platform" or "solution" without specifics, ask again.)
- Who specifically is buying this, and what's their situation when they start looking? (Not a demographic — the moment and context. "A marketing manager who just got yelled at for low lead quality" is useful. "SMBs" is not.)
- What were they doing before? (The workaround, the spreadsheet, the manual process, the competitor they hate.)
Round 2 — Triggers and raw material:
- What's the trigger — the thing that makes them finally go searching? (Push hard here. "They want to be more efficient" is not a trigger. "Their CEO asked why it takes 3 weeks to onboard a client" is.)
- What does life look like after they start using it? (Concrete outcome, not "they're more productive.")
- Do you have any raw customer language? Even one source is gold:
- Customer interview transcripts or notes
- Support tickets or chat logs where customers describe their problem
- Reviews (yours or competitors') on G2, Capterra, Reddit, app stores
- Testimonials, case study quotes, or sales call notes
If they have raw material: Read it carefully. Extract exact phrases — verbs, nouns, emotional language. These become your headline building blocks. Call out the most promising phrases explicitly: "This phrase from the support ticket — 'I just need to know what's going on without asking 5 people' — that's a headline."
If they don't have raw material: Be honest that you're working with less signal. Flag which parts of your copy are grounded vs. inferred. Suggest specific places to gather language (competitor reviews are often the fastest source).
Discovery Summary
Present your understanding before proceeding:
Product: [one-sentence description]
Customer: [who they are + their situation]
Trigger: [what makes them act]
Before/after: [workaround → desired outcome]
Raw material: [what you have to work with, or "inference only"]
STOP. Do not proceed to headline generation until the user confirms this summary is accurate or adjusts it.
Phase 2: Generate Headlines
Write 5-8 headline options. For each one:
- The headline itself
- The customer struggle it maps to (one line — which specific pain or goal does this address?)
- Grounded vs. inferred — Is this based on actual customer language you were given, or your best inference? Be transparent.
How to generate good ones:
- Start by completing: "Now you can ______" using the customer's verbs
- Flip customer struggles: "I'm tired of ______" becomes "Stop ______, start ______"
- Combine specific task + specific outcome: "Build [thing] in [timeframe]" or "[Achieve outcome] without [obstacle]"
- Try both goal-framed (what they gain) and struggle-framed (what they escape) versions
- Vary the specificity level — some ultra-specific, some slightly broader — so the user can calibrate
Voice check (required gate). Before any headline reaches the user, run every option through the Anti-AI Voice Check and the Platitude Kill List. Strip em dashes, kill platitudes, rewrite any banned shape, delete-test filler. Do this silently. The user should only ever see headlines that already passed. If a line you like keeps failing, the underlying claim is probably abstract — fix the claim, not the wording.
Phase 3: Build Out the Winner
Once the user picks a direction, extend it:
- Subheadline — Adds the "how" or a second dimension (if headline is goal-focused, subheadline can address the struggle, or vice versa)
- 3 benefit lines — Each one maps to a specific customer struggle. Not features. Write them as "struggle → resolution" pairs internally, even if the final copy only shows the resolution.
- CTA — Completes "I want to ______." If the CTA is generic ("Get Started", "Learn More"), push for something specific to the value prop.
Run the same voice check on every line of the package, not just the headline. Subheads and benefit lines are where over-explaining and filler creep back in.
Phase 4: Stress-Test Together
Don't just present final copy — walk the user through your stress-test:
Playing skeptical prospect for a moment:
- [Quote a line] — A prospect scanning this would think: "______." Does that match your intent?
- [Quote another line] — This could mean [X] or [Y]. Which interpretation do we want? Let's make it unambiguous.
- The biggest risk with this version is ______. Here's how I'd mitigate that: ______.
Suggest what to A/B test first and why.
Phase 5: Validate Before Launch
Recommend the user validate copy before committing to it:
Before you launch this, run a quick 5-second comprehension test. Show the headline to 3-4 people for 5 seconds, then ask them to explain what the product does. If they repeat the words back instead of explaining in their own words, comprehension hasn't landed — iterate.
Phase 6: Deliver the Artifact
Once the package is settled (headline chosen, package built, stress-tested), produce the final deliverable as a self-contained HTML file. Follow artifact-template.md: assemble the compose layout, write it to the working directory as language-market-fit-compose-[slug].html, open it, and tell the user the path.
Generate it only after the copy is agreed and has passed the voice check. The artifact presents the finished copy; it is not a place to relax the standard.
---
Mode 2: Audit
Your goal: identify exactly where the copy breaks the prospect's pattern-match and give actionable fixes.
Phase 1: Reconnaissance
If given a URL: Fetch the page. Extract and catalog all copy:
- Primary headline + subheadline
- Body copy and benefit statements
- CTA text (every button/link)
- Navigation labels
- Social proof (testimonials, logos, stats)
- Any microcopy that carries weight
Present the inventory, then:
I've cataloged the copy. Before I analyze it, I need context — the copy can only be evaluated against the customer it's trying to reach:
>
1. Who lands on this page, and what's going on in their life when they do?
2. What problem does this solve for them — in their words, not yours?
3. What's the one action you want them to take?
4. Do you have any customer quotes, reviews, or support tickets? (Even competitor reviews help — I can use them to benchmark language.)
Do not analyze until you have this context. The same headline can be brilliant for one audience and terrible for another.
Phase 2: Diagnose
Go through the copy piece by piece. For each significant element, ask yourself:
- Does this match what the prospect was searching for? Would they recognize this as relevant to their problem in a 2-second scan?
- Is this specific or abstract? Can I picture a concrete scenario, or does it describe a vague benefit?
- Whose language is this — the company's or the customer's? Feature names, internal jargon, and marketing-speak all indicate company language.
- What would a skeptical prospect think reading this? Would they say "that's exactly my problem" or "that's what they all say"?
Structure your analysis by impact, not by position on the page. Lead with the biggest problem. For each issue:
1. Quote the exact copy that's failing 2. Name what's wrong in one sentence (e.g., "This is company-centric — it describes what the product is, not what the customer gets") 3. Why it matters — What's the prospect thinking/feeling at this point? 4. 2-3 rewrite options — Ranked by how grounded they are in customer language you were given. If you're inferring, say so.
Every rewrite is copy too. Run each one through the Anti-AI Voice Check before presenting it. Don't replace a company-centric platitude with an AI-sounding one.
Phase 3: Prioritized Fix List
End with a clear priority order:
1. Headline fix — Almost always the highest-impact change. Present your best option with rationale. 2. CTA fix — Often overlooked but directly affects conversion. 3. Supporting copy fixes — Ordered by impact. 4. What's missing — Copy gaps (e.g., no struggle acknowledgment, no specificity, no social proof that addresses the core anxiety). 5. Customer language gaps — What you couldn't fix because you didn't have real customer words. Include specific suggestions for where to find them (which review sites, what interview questions to ask — see reference.md for the interview framework).
Phase 4: Deliver the Report
Once the prioritized fix list is complete, produce the audit as a self-contained HTML file. Follow artifact-template.md: assemble the audit layout (context, findings by impact with severity chips, fix-in-this-order list, language gaps), write it to the working directory as language-market-fit-audit-[slug].html, open it, and tell the user the path.
---
Working With Incomplete Information
Real-world copy projects rarely have perfect customer interview data. Adapt your approach:
If the user has customer quotes/reviews/tickets: This is your primary source. Mine it aggressively. The best headline might be a near-direct quote.
If the user has competitor reviews (G2, Capterra, Reddit, app stores): Use these as proxy customer language. The complaints about competitors reveal what prospects actually care about.
If the user has nothing: Be transparent that you're working from inference. Write the copy, but flag every headline with a confidence note. Suggest the fastest way to get real language (usually: read 20 competitor reviews on G2/Capterra, takes 30 minutes).
Never pretend you have more signal than you do. The whole point of this framework is that good copy comes from real customer language, not clever wordsmithing.
Supporting Files
- [reference.md](reference.md) — Platitude Kill List, headline patterns, language-mining sources, customer interview questions, comprehension testing protocol. Load during compose and audit work.
- [anti-ai-tells.md](anti-ai-tells.md) — Voice check that keeps output from sounding generated. Run as a gate before any copy is shown or written.
- [artifact-template.md](artifact-template.md) — Clean product-UI HTML template plus compose and audit layouts. Load when generating the final deliverable.
Anti-AI Voice Check
Run this on every line of copy before you show it or write it to an artifact. The goal is copy that reads like a sharp person said it, not smooth generated prose with nobody home.
This is distilled for conversion copy (headlines, subheads, benefits, CTAs, landing-page body). It pairs with the Platitude Kill List: that catches marketing tells like "seamless" and "faster," this catches generation tells like the em dash and the negation pivot. A line can pass one and fail the other. Run both.
---
The core mechanism: the delete-test
Most of this check is one move. Take the suspect word out. If the sentence means the same thing and reads clean, cut it. If removing it changes the meaning or the rhythm, keep it.
Run the delete-test on filler first:
actually, really, just, very, simply, truly, basically, essentially, literally, significant, straightforward, genuinely, incredibly, absolutely, pivotal, crucial, interesting
These almost never survive in copy. They pad the line and signal that the writer is reaching for emphasis the words themselves should be carrying.
---
High-smell words (verify in context, usually replace)
These are the generated-marketing register. When you catch one you usually have a platitude nearby too. Replace with the plain verb or the concrete thing.
leverage, utilize, facilitate, empower, unlock, supercharge, elevate, foster, spearhead, showcase, synergy, robust, seamless, cutting-edge, next-generation, revolutionary, innovative, world-class, delve, multifaceted, tapestry
Metaphor-only tells (fine literally, a tell as metaphor): navigate, landscape, momentum. "Navigate the form" is fine. "Navigate your growth journey" is a tell.
Connectors that signal generated prose, rare in real copy: furthermore, moreover, additionally, consequently, remarkably. Cut them or split the sentence.
Plain replacements: use, help, run, build, connect, combine, cut, show. Or name the actual thing.
---
Punctuation (firm for copy)
No em dash. No double hyphen. The em dash is the single clearest generated-text fingerprint right now, and copy is short enough that you never need it. Use a comma, a period, parentheses, or two sentences.
---
Banned sentence shapes
These read as generated no matter what you fill them with.
- The negation pivot, in all its costumes: "X isn't Y, it's Z" / "Not X, but Y" / "Not only X, but also Y" / "Not because X, but because Y." One tell, many disguises. Avoid all of them.
- "The [superlative] X is..." openings.
- Starting with "The" and rolling into a broad generalization.
- Scaffolding that announces the insight before delivering it: "Here's the thing," "The key insight is," "What makes this different is."
- Filler openers: "It's worth noting," "It is important to note," "In today's [adjective] world," "At the end of the day," "Needless to say."
---
Structural tells (landing-page body, emails)
- Over-explaining. If a sentence only restates or interprets the sentence before it, cut it. Copy cannot afford a single dead line.
- Summary endings that recap what the reader just read.
- Uniform sentence length. Vary it. One short line. Then a longer one that earns its length.
- Rhetorical questions used as transitions.
---
The carve-outs (do not over-correct)
A maximalist banlist produces its own kind of AI tell: copy sanded so smooth the voice is gone. Hold these exceptions.
- Three-part parallel structure is good copy when every part is concrete. "Sleep more. Stress less. Live better" (Calm) passes because each part is a real outcome. "Kick bad habits. Get healthy ones" passes. The tell is three abstract, interchangeable parts: "Powerful. Simple. Limitless." Concrete triad: keep it. Abstract triad: kill it.
- Fragments and one-word lines are good copy. The rule against uniform sentences is about variety, not about forcing complete sentences. "No setup. No training. Just go." is fine.
- Voice beats compliance. If a line sounds like a real person said it out loud, it passes even if it technically trips a flag. Do not rewrite a line with voice into a line that is merely clean.
---
Running the gate
Before any headline, subhead, benefit line, or CTA is shown or written to the artifact:
1. Em dash or double hyphen present? Remove it. 2. High-smell word? Delete-test, or replace with the concrete thing. 3. Negation-pivot or banned shape? Rewrite. 4. Filler word? Delete-test. 5. Say it in your head. Person, or brand pretending to be one?
Do this silently. The user should only ever see copy that already passed. If a line you like keeps failing, that usually means the underlying claim is abstract. Fix the claim, not the wording.
HTML Artifact Template
The final deliverable for both modes is a single self-contained HTML file. Clean product-UI aesthetic: system fonts, card-based, scannable, restrained. No external requests, no frameworks, no animation beyond subtle hover. Everything inline in one file.
When to generate
- Compose: after the package is settled (headline chosen, package built, stress-tested). Not mid-iteration.
- Audit: after the prioritized fix list is complete.
Every line of copy in the artifact must have already passed the Anti-AI Voice Check and the Platitude Kill List. The artifact is a presentation surface, not a place to relax the standard.
How to write and open it
1. Build the full HTML by adapting the skeleton and components below. Include only the sections that apply. 2. Write it to the current working directory as language-market-fit-[mode]-[slug].html, where [mode] is compose or audit and [slug] is the product name in kebab-case (for example language-market-fit-compose-acme-crm.html). 3. Open it: open "language-market-fit-[mode]-[slug].html". If open is unavailable (non-macOS), skip it and report the file path so the user can open it themselves. 4. Tell the user the path and give a one-line summary of what the artifact contains.
Do not fabricate a date or metrics. If you do not have a real date, omit the date line. Use the product/customer one-liner for the subtitle instead.
---
Shared skeleton
Paste this as the file shell. Swap the <main> content per mode using the components below.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>[Product] · [Copy Package | Copy Audit]</title>
<style>
:root{
--bg:#FBFBF9; --surface:#FFFFFF;
--ink:#19191C; --ink-2:#55555E; --ink-3:#8C8C95;
--line:#ECEBE6; --line-2:#DEDDD7;
--accent:#3E3AC9; --accent-soft:#EEEDFB;
--grounded-bg:#ECFDF3; --grounded-line:#A6EFC5; --grounded-ink:#067647;
--inferred-bg:#FEF6EE; --inferred-line:#F7D9AE; --inferred-ink:#B54708;
--p0-bg:#FEF3F2; --p0-line:#FECDCA; --p0-ink:#B42318;
--p1-bg:#FFF4ED; --p1-line:#F9D9AE; --p1-ink:#B93815;
--p2-bg:#FFFAEB; --p2-line:#FEDF89; --p2-ink:#B54708;
--p3-bg:#F7F8FA; --p3-line:#E7E9EF; --p3-ink:#475467;
--radius:12px; --radius-sm:7px; --radius-lg:16px;
--shadow:0 1px 2px rgba(16,18,24,.04), 0 2px 6px rgba(16,18,24,.05);
--font:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
--mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
}
*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
body{background:var(--bg);color:var(--ink);font-family:var(--font);font-size:16px;line-height:1.6;padding:48px 24px 96px}
.wrap{max-width:760px;margin:0 auto}
/* header */
.eyebrow{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3)}
.eyebrow .dot{width:6px;height:6px;border-radius:50%;background:var(--accent)}
.doc-title{margin:14px 0 8px;font-size:clamp(28px,4.5vw,40px);font-weight:680;letter-spacing:-.02em;line-height:1.08}
.lede{font-size:16px;color:var(--ink-2);max-width:54ch}
.rule{height:1px;background:var(--line);margin:32px 0}
/* sections */
.section{margin-top:40px}
.section-label{display:flex;align-items:baseline;gap:10px;font-size:12px;font-weight:650;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3);margin-bottom:16px}
.section-label::after{content:"";flex:1;height:1px;background:var(--line)}
/* chips */
.chip{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:650;letter-spacing:.03em;text-transform:uppercase;padding:3px 8px;border-radius:999px;border:1px solid transparent;white-space:nowrap}
.chip--grounded{background:var(--grounded-bg);border-color:var(--grounded-line);color:var(--grounded-ink)}
.chip--inferred{background:var(--inferred-bg);border-color:var(--inferred-line);color:var(--inferred-ink)}
.chip--p0{background:var(--p0-bg);border-color:var(--p0-line);color:var(--p0-ink)}
.chip--p1{background:var(--p1-bg);border-color:var(--p1-line);color:var(--p1-ink)}
.chip--p2{background:var(--p2-bg);border-color:var(--p2-line);color:var(--p2-ink)}
.chip--p3{background:var(--p3-bg);border-color:var(--p3-line);color:var(--p3-ink)}
/* hero headline */
.hero{background:var(--surface);border:1px solid var(--line-2);border-radius:var(--radius-lg);box-shadow:var(--shadow);padding:28px 28px 24px;position:relative}
.hero-head{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:16px}
.hero-kicker{font-size:11px;font-weight:650;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3)}
.hero-line{font-size:clamp(24px,3.6vw,32px);font-weight:680;letter-spacing:-.02em;line-height:1.12;color:var(--ink)}
.hero-maps{margin-top:14px;padding-top:14px;border-top:1px dashed var(--line-2);font-size:14px;color:var(--ink-2)}
.hero-maps b{color:var(--ink);font-weight:600}
/* key-value brief */
.kv{display:grid;grid-template-columns:130px 1fr;gap:10px 20px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:20px 22px}
.kv dt{font-size:12px;font-weight:650;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-3);padding-top:1px}
.kv dd{font-size:15px;color:var(--ink)}
/* alternates */
.alt-list{display:flex;flex-direction:column;gap:2px}
.alt{display:flex;justify-content:space-between;align-items:flex-start;gap:14px;padding:14px 4px;border-bottom:1px solid var(--line)}
.alt:last-child{border-bottom:none}
.alt-text{font-size:16px;font-weight:560;color:var(--ink)}
.alt-maps{font-size:13px;color:var(--ink-3);margin-top:3px}
/* package grid */
.grid{display:grid;gap:14px}
.grid.two{grid-template-columns:1fr 1fr}
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:18px 20px}
.card-label{font-size:11px;font-weight:650;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3);margin-bottom:8px}
.card-body{font-size:16px;color:var(--ink)}
.benefit .struggle{font-size:13px;color:var(--ink-3);margin-bottom:4px}
.benefit .struggle::before{content:"↳ ";color:var(--inferred-ink)}
.benefit .resolution{font-size:16px;font-weight:540;color:var(--ink)}
.cta-card{background:var(--accent-soft);border-color:transparent}
.cta-card .card-body{font-weight:600;color:var(--accent)}
/* callout (stress-test, validate) */
.callout{background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:var(--radius);padding:18px 22px}
.callout h4{font-size:13px;font-weight:650;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-2);margin-bottom:10px}
.callout p{font-size:15px;color:var(--ink-2);margin-bottom:8px}
.callout p:last-child{margin-bottom:0}
.callout .q{color:var(--ink);font-style:italic}
/* audit finding */
.finding{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.finding-head{display:flex;align-items:center;gap:10px;margin-bottom:14px}
.finding-head .num{font-variant-numeric:tabular-nums;font-weight:680;color:var(--ink-3);font-size:14px}
.finding-head .title{font-size:16px;font-weight:620;color:var(--ink)}
.quote{font-family:var(--mono);font-size:14px;background:#FAFAF7;border:1px solid var(--line);border-radius:var(--radius-sm);padding:11px 14px;color:var(--ink-2);margin-bottom:12px}
.quote::before{content:"“";color:var(--ink-3)}.quote::after{content:"”";color:var(--ink-3)}
.finding-what{font-size:15px;color:var(--ink);margin-bottom:6px}
.finding-why{font-size:14px;color:var(--ink-2);margin-bottom:14px}
.rewrites{display:flex;flex-direction:column;gap:8px}
.rewrite{display:flex;align-items:flex-start;gap:10px;font-size:15px}
.rewrite .arrow{color:var(--grounded-ink);font-weight:700;line-height:1.5}
.rewrite .txt{color:var(--ink);flex:1}
/* priority list */
.priority{display:flex;flex-direction:column;gap:10px}
.prow{display:flex;gap:14px;align-items:flex-start;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px}
.prow .badge{flex:none;width:24px;height:24px;border-radius:7px;background:var(--ink);color:#fff;font-size:13px;font-weight:680;display:flex;align-items:center;justify-content:center;font-variant-numeric:tabular-nums}
.prow .pbody .ptitle{font-size:15px;font-weight:600;color:var(--ink)}
.prow .pbody .pdesc{font-size:14px;color:var(--ink-2);margin-top:2px}
/* footer */
.footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--line);font-size:13px;color:var(--ink-3)}
.footer b{color:var(--ink-2);font-weight:600}
@media(max-width:560px){
body{padding:32px 18px 64px}
.kv{grid-template-columns:1fr;gap:4px 0}
.kv dd{margin-bottom:8px}
.grid.two{grid-template-columns:1fr}
.alt{flex-direction:column;gap:4px}
}
</style>
</head>
<body>
<div class="wrap">
<!-- MAIN CONTENT GOES HERE -->
</div>
</body>
</html>---
Compose layout
Assemble <main> in this order. Skip any block you do not have.
<header>
<div class="eyebrow"><span class="dot"></span>Language-Market Fit · Copy Package</div>
<h1 class="doc-title">[Product name]</h1>
<p class="lede">[One line: who it's for + the situation they're in]</p>
</header>
<div class="rule"></div>
<!-- The brief -->
<section class="section">
<div class="section-label">The brief</div>
<dl class="kv">
<dt>Product</dt><dd>[one sentence]</dd>
<dt>Customer</dt><dd>[who + situation]</dd>
<dt>Trigger</dt><dd>[what makes them act]</dd>
<dt>Before → after</dt><dd>[workaround → outcome]</dd>
<dt>Raw material</dt><dd>[sources, or "inference only"]</dd>
</dl>
</section>
<!-- The chosen headline -->
<section class="section">
<div class="section-label">The headline</div>
<div class="hero">
<div class="hero-head">
<span class="hero-kicker">Recommended</span>
<span class="chip chip--grounded">Grounded</span>
</div>
<div class="hero-line">[The headline]</div>
<div class="hero-maps">Maps to: <b>[the specific customer struggle]</b></div>
</div>
</section>
<!-- Alternates -->
<section class="section">
<div class="section-label">Alternates</div>
<div class="alt-list">
<div class="alt">
<div><div class="alt-text">[Headline option]</div><div class="alt-maps">[struggle it maps to]</div></div>
<span class="chip chip--inferred">Inferred</span>
</div>
<!-- repeat per alternate -->
</div>
</section>
<!-- The package -->
<section class="section">
<div class="section-label">The package</div>
<div class="grid">
<div class="card"><div class="card-label">Subheadline</div><div class="card-body">[subhead]</div></div>
<div class="grid two">
<div class="card benefit"><div class="struggle">[the struggle]</div><div class="resolution">[benefit line]</div></div>
<div class="card benefit"><div class="struggle">[the struggle]</div><div class="resolution">[benefit line]</div></div>
<div class="card benefit"><div class="struggle">[the struggle]</div><div class="resolution">[benefit line]</div></div>
<div class="card cta-card"><div class="card-label">Primary CTA</div><div class="card-body">[CTA text]</div></div>
</div>
</div>
</section>
<!-- Stress-test -->
<section class="section">
<div class="section-label">Stress-test</div>
<div class="callout">
<h4>Reading this as a skeptical prospect</h4>
<p class="q">“[what a prospect would think scanning the headline]”</p>
<p><b>Biggest risk:</b> [the risk in this version]</p>
<p><b>Test first:</b> [what to A/B test and why]</p>
</div>
</section>
<!-- Validate -->
<section class="section">
<div class="section-label">Before you launch</div>
<div class="callout">
<p>Run the <b>5-second test</b>: show the headline to 3-4 people for 5 seconds, then ask what the product does. If they repeat the words back instead of explaining in their own words, comprehension has not landed. Iterate.</p>
</div>
</section>
<div class="footer">
Built with the <b>language-market-fit</b> skill. Grounded lines come from real customer language; inferred lines are best-guess and should be validated before launch.
</div>---
Audit layout
<header>
<div class="eyebrow"><span class="dot"></span>Language-Market Fit · Copy Audit</div>
<h1 class="doc-title">[Product or page name]</h1>
<p class="lede">[the page's job + who lands on it]</p>
</header>
<div class="rule"></div>
<!-- Context -->
<section class="section">
<div class="section-label">Context</div>
<dl class="kv">
<dt>Who lands here</dt><dd>[reader + situation]</dd>
<dt>Their problem</dt><dd>[in their words]</dd>
<dt>Desired action</dt><dd>[the one action]</dd>
</dl>
</section>
<!-- Findings, ordered by impact -->
<section class="section">
<div class="section-label">Findings by impact</div>
<div class="finding">
<div class="finding-head">
<span class="num">01</span>
<span class="chip chip--p0">Highest impact</span>
<span class="title">[short name of the problem]</span>
</div>
<div class="quote">[exact copy that's failing]</div>
<div class="finding-what">[what's wrong, one sentence]</div>
<div class="finding-why">[what the prospect is thinking/feeling here]</div>
<div class="rewrites">
<div class="rewrite"><span class="arrow">→</span><span class="txt">[rewrite, most grounded]</span><span class="chip chip--grounded">Grounded</span></div>
<div class="rewrite"><span class="arrow">→</span><span class="txt">[rewrite option 2]</span><span class="chip chip--inferred">Inferred</span></div>
</div>
</div>
<!-- repeat per finding, severity chip p0→p3 by impact -->
</section>
<!-- Priority fix list -->
<section class="section">
<div class="section-label">Fix in this order</div>
<div class="priority">
<div class="prow"><span class="badge">1</span><div class="pbody"><div class="ptitle">Headline</div><div class="pdesc">[the fix + why it's first]</div></div></div>
<div class="prow"><span class="badge">2</span><div class="pbody"><div class="ptitle">CTA</div><div class="pdesc">[the fix]</div></div></div>
<div class="prow"><span class="badge">3</span><div class="pbody"><div class="ptitle">Supporting copy</div><div class="pdesc">[the fix]</div></div></div>
<div class="prow"><span class="badge">4</span><div class="pbody"><div class="ptitle">What's missing</div><div class="pdesc">[the gap]</div></div></div>
</div>
</section>
<!-- Language gaps -->
<section class="section">
<div class="section-label">Where to get real customer language</div>
<div class="callout">
<p>[What you couldn't fix without real customer words, and the fastest place to find them: which review sites, what to search, which interview questions.]</p>
</div>
</section>
<div class="footer">
Built with the <b>language-market-fit</b> skill. Rewrites marked <b>Grounded</b> use customer language you provided; <b>Inferred</b> rewrites are best-guess and should be validated against real customer words.
</div>---
Gotchas for the artifact
- Do not relax the copy standard for the artifact. Every line still passes the voice check. A polished HTML wrapper around AI-sounding copy is worse, not better, because it looks finished.
- Do not invent content to fill a section. If there are only two headline alternates, show two. If you have no real customer quotes, do not manufacture a "Grounded" chip. The chips are a trust signal; a false one breaks the whole point of the framework.
- Do not add charts, scores, or fake metrics. This skill produces copy and judgment, not analytics. A "conversion score: 87" with no data behind it is the exact dishonesty the framework exists to fight.
- Keep it one file. No CDN fonts, no external scripts, no image links. It has to open offline and survive being emailed around.
MIT License
Copyright (c) 2026 Kyle Zantos
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Finding Language-Market Fit
A skill for writing and auditing product copy that speaks your customer's language, not your own. Based on Matt Lerner's Language-Market Fit framework.
Context
When you spend months inside a product, the words that feel obvious to you (feature names, internal shorthand, domain idioms) drift away from the words your prospect actually uses when they go searching for the problem you solve. The copy starts sounding right to the team while reading as noise to the person who just landed on your site.
Good copy closes that gap. It uses the prospect's exact words, the verbs, nouns, and emotional beats already in their head, so the moment they land their brain says "this is for me." That is the work this skill does: pull you out of your own vocabulary and back into theirs, using Matt Lerner's Language-Market Fit framework as the backbone.
What it does
Two modes, depending on whether you are starting fresh or fixing existing copy.
Compose: write new copy together
Extract enough customer reality to write copy grounded in real language, not marketing instinct. Walks through:
1. Customer context. Who is buying this, what is happening in their life when they start looking, and what they were doing before. 2. Triggers and raw material. The specific moment they go searching, plus any real customer language you have (interviews, support tickets, competitor reviews on G2, Capterra, or Reddit). 3. Headline generation. 5 to 8 options, each mapped to a specific customer struggle, with honest labels for which are grounded in real quotes and which are inferred. 4. Extension. Subheadline, benefit lines, and CTA built out from the winning direction. 5. Stress-test. Reading the copy as a skeptical prospect, naming the biggest risk, and suggesting what to A/B test first. 6. Validation. A 5-second comprehension test you can run with 3 to 4 people before committing.
The finished package is delivered as a clean, self-contained HTML file you can open, share, or hand off.
Audit: tear apart existing copy and rebuild
Point it at a URL or paste in copy. The skill fetches the page, catalogs every piece of copy (headline, body, CTAs, nav, social proof, microcopy), then asks who the audience actually is before analyzing.
Every finding includes:
- The exact copy that is failing, quoted
- What is wrong in one sentence (company-centric? too abstract? wrong audience?)
- What the prospect is thinking at that moment
- 2 to 3 rewrite options, ranked by how grounded they are in real customer language
It ends with a prioritized fix list (headline first, CTA next, supporting copy by impact) and honest flags for gaps you cannot fix without real customer input, plus where to go find it. The report comes back as an HTML file with severity-tagged findings.
Core mental filters
Every line the skill writes or evaluates gets run through these:
1. Would someone Googling their problem recognize this in under 2 seconds? 2. Can I point to a specific customer struggle this line addresses? 3. Does this complete "Now you can ___" (customer-centric) or "Our product is ___" (company-centric)? 4. Could a competitor paste this on their site and have it still make sense? (If yes, it is not specific enough.) 5. If I showed this for 5 seconds, could the reader explain the product in their own words, or would they just repeat mine?
Before any line reaches you, it passes two checks. A platitude kill list catches company-speak ("seamless," "powerful," "intuitive," "revolutionary," "best-in-class") and forces concrete rewrites. An anti-AI voice check catches generation tells (the em dash, filler words, the negation pivot) so the copy reads like a person wrote it, not a model.
Who it's for
- Founders writing their first landing page who know the product cold but not how customers talk about it
- Designers auditing copy on a site they didn't write who need a structured way to say "this section is broken, here's why"
- PMs working on positioning who have a pile of customer interviews and need help mining them for headline-ready language
- Anyone who has written a headline that felt fine to the team and flat to everyone else
Install
One command (all agents)
npx skills add kylezantos/finding-language-market-fitAuto-detects your installed agents and installs to each. Works with Claude Code, Codex, OpenCode, Cursor, Gemini CLI, Windsurf, and 35+ more.
Target specific agents
npx skills add kylezantos/finding-language-market-fit -a claude-code
npx skills add kylezantos/finding-language-market-fit -a codex -a opencodeManual install
Copy the entire repo contents into a language-market-fit/ directory in your agent's skills path:
| Agent | Path |
|---|---|
| Claude Code | ~/.claude/skills/language-market-fit/ |
| Codex | ~/.codex/skills/language-market-fit/ |
| OpenCode | ~/.config/opencode/skills/language-market-fit/ |
| Cursor | ~/.cursor/skills/language-market-fit/ |
| Gemini CLI | ~/.gemini/skills/language-market-fit/ |
| Windsurf | ~/.codeium/windsurf/skills/language-market-fit/ |
Or clone:
git clone https://github.com/kylezantos/finding-language-market-fit.git ~/.claude/skills/language-market-fitThen invoke with /language-market-fit in any coding agent.
Usage
/language-market-fit # Asks which mode
/language-market-fit compose # Write new copy
/language-market-fit audit # Audit existing copy (asks for URL/source)
/language-market-fit audit https://... # Audit a specific URLWhat's inside
SKILL.md # Core flow: mental filters, gotchas, compose + audit modes
reference.md # Platitude kill list, interview framework, headline examples, 5-second test
anti-ai-tells.md # Voice check that keeps copy from sounding generated
artifact-template.md # Clean product-UI HTML template for the final deliverableWorks with any agent
The skill runs the same way across agents. Mode selection uses tappable options where the agent supports them and a plain-text question where it does not. The copy package or audit report is written as a self-contained HTML file in your working directory, and opens in your browser automatically when the agent can.
Credit
Built on Matt Lerner's Language-Market Fit framework. This skill turns his ideas into an interactive workflow for use inside coding agents.
License
MIT
Language-Market Fit: Operational Reference
Use this file during compose and audit work. Everything here is a tool — not background reading.
---
Platitude Kill List
Flag every instance. Each one forces the prospect to guess what you mean. Replace with specifics or cut entirely.
| Word/Phrase | Ask Instead |
|---|---|
| All-in-one | All of what? Name the 2-3 things that matter most. |
| Faster | Faster than what? By how much? At what task? |
| Better | Better at what, specifically? Compared to what? |
| Revolutionary | Prove it with a concrete outcome instead. |
| Convenient | Convenient how? What inconvenience does it remove? |
| Flexible | Flexible in what way? Name the constraint it removes. |
| Streamline | What specific steps does it eliminate or shorten? |
| Optimize | What metric improves? By how much? |
| Empower | To do what, exactly? |
| Seamless | What friction point disappears? |
| Cutting-edge | What does it do that others can't? |
| Next-generation | Of what? What changed? |
| Robust | What breaks in competitors that doesn't break here? |
| Leverage | Replace with the actual verb — "use," "connect," "combine." |
| Transform | Into what? Show the before/after. |
| Innovative | Name the innovation instead of claiming it. |
| Powerful | Powerful at what specific task? |
| Scalable | What limit does it remove? Name the ceiling that's gone. |
| Intuitive | Don't claim it — demonstrate it. ("Set up in 5 minutes, no training needed.") |
| World-class | Unverifiable. Replace with a specific proof point. |
| Platform | Often hides what the product actually does. Unpack it. |
| Solution | Same — what does it solve, concretely? |
| End-to-end | Name the actual start and end points. |
| Effortless | What effort does it specifically remove? |
The test: Could a competitor paste this word on their site and it would be equally true? If yes, it's a platitude.
---
Headline Patterns That Work
Use these as structural templates, not copy-paste. Fill them with customer language.
Goal-Framed (what they gain)
- [Specific task] + [specific timeframe]: "Build a custom ad server in just weeks" (Kevel)
- [Concrete outcome] + [removed obstacle]: "Convert more leads. Create custom landing pages — no coding required" (Unbounce)
- [Two outcomes they're already tracking]: "Increase app store conversion rates and pay less for every install" (Storemaven)
- [Task] + [emotional payoff]: "Create a website you're proud of" (Wix)
Struggle-Framed (what they escape)
- [Name the struggle] → [Name the resolution]: "Kick bad habits. Get healthy ones" (Second Nature)
- First-person struggle: "I'm tired of ______" (beats "Are you tired of ______?")
- [Multiple pains, rapid fire]: "Sleep more. Stress less. Live better" (Calm)
The "Now You Can..." Test
Every headline should be able to complete: "Now you can ______"
- If it completes "Our product is ______" instead — it's company-centric. Rewrite.
- Derivation: customers say "I was trying to..." or "I needed a tool that could..." — flip these into "Now you can..."
The 10X Example
- 3% conversion: "Accelerate your learning. Develop your thinking through online discussion"
- 30% conversion: "Organize, share and take notes on web pages, PDFs and academic papers easily, so you can learn faster, remember more and get things done."
- Why: The winner names specific tasks (organize, share, take notes), specific objects (web pages, PDFs, academic papers), and specific outcomes (learn faster, remember more, get things done). The loser uses abstractions.
---
Mining Customer Language
Where to Find It (fastest to slowest)
1. Competitor reviews on G2 / Capterra / app stores — 30 minutes, high signal. Complaints reveal what prospects care about. Praise reveals what language resonates. 2. Reddit / community forums — Search "[product category] + frustrating" or "switched from [competitor]." People are unfiltered here. 3. Your own support tickets / chat logs — The way customers describe their problems in support is exactly how they think about them. 4. Testimonials / case studies you already have — Look past the polished quotes for the raw language underneath. 5. Sales call recordings / notes — How prospects describe their situation in discovery calls. 6. Customer interviews (JTBD-style) — Highest quality but slowest. Use the framework below.
What to Extract
- Verbs they use for what they're trying to do ("track," "find," "stop," "figure out")
- Nouns for the problem ("the spreadsheet," "the back-and-forth," "the approval chain")
- Emotional language ("frustrated," "embarrassed," "finally," "relief")
- Trigger phrases — what made them act ("my boss asked," "we lost a deal," "I spent 3 hours on")
- Before/after contrast — how they describe life before vs. after
---
Customer Interview Questions
Use when the user wants to gather better language but hasn't done interviews yet. These are the questions to recommend.
Opening (chronological journey)
- "Walk me through buying [product] from the very beginning."
- "When did you first realize you had a problem with [area]?"
- "What were you trying to do when you first thought about looking for something like this?"
Deepening
- "What will this allow you to achieve?"
- "Why is that important to you?"
- "What were you using before? How was that going?"
- "What other options did you consider?"
Trigger (the moment of action — push hard here)
- "You said you'd been dealing with this for [time]. What made you act on that particular day?"
- "What was the last straw?"
Clarification (use whenever they say something vague)
- "What does 'better' mean to you here?"
- "When you say 'easier,' what specifically was hard before?"
- "Can you give me an example?"
---
Comprehension Testing Protocol
Recommend this to the user as a way to validate copy before launch or A/B testing.
The 5-Second Test
1. Show the headline for exactly 5 seconds (don't warn them) 2. Remove it 3. Ask: "What was that? What would it do for you?" 4. If they repeat the headline verbatim — they memorized it, they didn't understand it 5. If they explain it in their own words — comprehension works 6. Iterate 4+ times in an afternoon
Keyword Validation
- Google "People also searched for" to find the words prospects actually use
- Cross-reference with SEMRush / Ubersuggest for search volume
- Example: "investing app" has 2X the volume of "stock trading app" — use the popular synonym
Quick A/B Testing (for low-traffic sites)
- Run the same ad with different headlines on Facebook/Instagram
- Compare click-through and conversion rates
- Don't A/B test until comprehension testing passes — otherwise you're optimizing between options that are all unclear