Systems Lab

Agent skill

personalize-message

Generate a personalized outbound message (LinkedIn DM or cold email) for a single prospect by combining a template with the lead's profile, company, and recent signals.

activeNeeds a keyActs undeclared690 words

Filed under Positioning and messaging.

From Othmane-Khadri/YALC-the-GTM-operating-system · 61 skills · 290 · pushed 2026-08-20

What it does when it runs

Generate a personalized outbound message (LinkedIn DM or cold email) for a single prospect by combining a template with the lead's profile, company, and recent signals. Use when the user says 'personalize this message', 'tailor this outreach to the prospect', 'rewrite this template for [name]', 'make this message more personal', or 'generate a personal opener'. Side-effecting — calls Anthropic and may pull live profile/company context via Firecrawl/Unipile/Crustdata.

Read from the skill and the 1 file bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
  • ANTHROPIC_API_KEY
Hosts it reaches
No third-party host appears in the skill or its bundled files.
Tool permissions it declares
No allowed-tools in the frontmatter. It does act, so it runs under whatever permissions your session already grants.
Actions present in the files
shell

Ask about personalize-message

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/Othmane-Khadri/YALC-the-GTM-operating-system.git /tmp/YALC-the-GTM-operating-system
git -C /tmp/YALC-the-GTM-operating-system sparse-checkout set ".claude/skills/personalize-message"
mkdir -p ~/.claude/skills/personalize-message
cp -R "/tmp/YALC-the-GTM-operating-system/.claude/skills/personalize-message/." ~/.claude/skills/personalize-message/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Before you install: this skill will not complete its job on a bare agent. It needs ANTHROPIC_API_KEY, which you have to obtain separately.

Reproduced in full from Othmane-Khadri/YALC-the-GTM-operating-system/blob/5686d1f2f526346133f78eef3349fc5a655757b4/.claude/skills/personalize-message/SKILL.md, which is licensed MIT (repository). 690 words, 14 headings.

Personalize Message

I'll wrap personalize. I'll ask for the template + target lead, validate inputs, run the CLI, and surface the personalized variant with reasoning so you can approve before sending.

When This Skill Applies

Use this skill when the user says:

  • "personalize this message"
  • "tailor this outreach to the prospect"
  • "rewrite this template for [name]"
  • "make this message more personal"
  • "generate a personal opener"

NOT this skill (use qualify-leads instead):

  • "score these leads" / "qualify these leads" — that runs the 7-gate pipeline, not per-lead copy generation.

NOT this skill (use launch-linkedin-campaign instead):

  • "send a LinkedIn outreach to this list" / "start the outbound" — campaign launch handles bulk personalization + sending. This skill is one lead at a time.

NOT this skill (use send-cold-email instead):

  • "send this email to [name]" — sending is downstream. This skill produces the variant; you choose where it goes.

What This Skill Does

  1. Asks for the message template (or accepts pasted text inline) and the target lead (email, linkedin URL, or full record).
  2. Validates inputs — template non-empty, lead resolvable.
  3. Shells out to npx tsx src/cli/index.ts personalize --template <text> --email <email> (or with --linkedin-url, --first-name, etc.).
  4. Parses the CLI output — variant text, reasoning, cost.
  5. Renders the variant cleanly with a "regenerate?" affordance.

What This Skill Does NOT

  • Send the message. That's send-cold-email (email) or launch-linkedin-campaign (LinkedIn) or your manual paste-and-send.
  • Generate sequences (DM1 + DM2 + follow-ups). That's launch-linkedin-campaign --variants <n>.
  • Modify the underlying template or prompt — only the per-lead substitution.

Pre-flight

  1. Onboarding interruption guard. Run:

    test -f ~/.gtm-os/.in-flight-setup && echo "BLOCKED" || echo "OK"
    

    If BLOCKED, stop and tell the user to finish yalc-gtm start first.

  2. Confirm cwd is ~/Desktop/gtm-os/.

Workflow

Step 0 — Ask for inputs

One question at a time:

  1. What's the template? A few sentences with placeholders the prospect's profile can fill (e.g. {{first_name}}, {{company}}). If they paste raw text, that's the --template value.
  2. Which lead? Email is the default identifier (--email <email>). They can also pass:
    • --linkedin-url <url> (alternative to email)
    • --first-name <name> / --last-name <name> / --company <name> (manual override fields)
    • --linkedin-account <id> (multi-account routing)
    • --channel <email|linkedin|any> (default: email)
    • --enrich (pull live profile/company context before generating)
  3. Any toggles? Ask only if volunteered:
    • --dry-run (preview without persisting; default behavior)
    • --segment-id <id> (route through a segment-specific brand voice)

Step 1 — Validate

  • Template non-empty, plausible (not just {{first_name}}).
  • Lead identifier (email, linkedin URL, or first-name+company combo) present.
  • If --channel linkedin, ensure a Unipile account is configured.

Step 2 — Shell out

cd ~/Desktop/gtm-os && set -a && source .env.local && set +a && \
  npx tsx src/cli/index.ts personalize --template "<text>" --email "<email>"

Per the 0.13.0 benchmark, single-command side-effecting skills shell out unconditionally. Anthropic API calls + optional Firecrawl/Unipile context pulls = side-effecting.

Step 3 — Parse output

personalize emits the personalized variant + reasoning + cost. On non-zero exit, surface stderr verbatim.

Step 4 — Render

Show:

  • The personalized variant (verbatim)
  • The reasoning trail (why this opener vs. another)
  • Token cost + any context the system pulled (Firecrawl page, Unipile profile, Crustdata signals)

Step 5 — Offer follow-ups

"Want me to also: (a) regenerate with a different angle (re-run with a tweaked template)? (b) batch-personalize this template across a result set via the campaign launcher? (c) pipe this into a LinkedIn campaign via launch-linkedin-campaign?"

Don't run anything unless the user says yes.

Failure surfacing — verbatim

When personalize exits non-zero (missing key, Anthropic 429, lead not found), paste the stderr unchanged.

Notes

  • Default channel is email. Switch to linkedin for DM-style copy.
  • --enrich adds latency (~5s for Firecrawl + ~2s for Unipile profile) but produces dramatically more specific openers. Recommend it whenever the lead is high-value.
  • The CLI's --dry-run is true by default — nothing gets sent. You always review before manually pasting or piping into a campaign.

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what personalize-message does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.