# Social Copy

> Create platform-ready social media posts and visuals from $ARGUMENTS.

- Skill: `tylerprogramming/social-copy` (Agent Skill)
- Install (CLI): `npx skillmds@latest add tylerprogramming/social-copy`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tylerprogramming/social-copy/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tylerprogramming (https://skillmd.com/u/tylerprogramming)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tylerprogramming/social-copy

---


Create platform-ready social media posts and visuals from $ARGUMENTS.

## Workflow Context

**Text content step of the weekly content pipeline** - runs after `/yt-seo` for each long-form video, and after `/yt-shorts` to render the 2 Instagram carousel outlines into actual Blotato visuals.

Run twice per week (once per video) for:
- 2 LinkedIn posts (one per video)
- 2 YT Community posts (one per video)
- 2 Skool video posts (one per video)
- 5 standalone LinkedIn posts (same video topics)
- 5 standalone YT Community posts/polls (same video topics)
- 2 Instagram carousels (from `/yt-shorts` outlines)

## Overview

This skill generates text posts + static visuals for X/Twitter, LinkedIn, Instagram, and YouTube Community - from either a YouTube video package or a standalone topic/URL/idea. It is distinct from `/repurpose` (which makes short-form video scripts). This skill also handles publishing directly via Blotato MCP.

**Output locations:**
- YT video mode -> `~/content/youtube/<slug>/social/`
- Standalone mode -> `~/social/YYYY-MM-DD-<slug>/`

---

## Step 1: Detect Source Mode

Parse $ARGUMENTS to determine the input type:

- **YouTube video package** - path like `~/content/youtube/<slug>/` or just a slug name
- **Topic / URL** - a subject, article link, or research query
- **Direct text** - user provides raw copy or idea to adapt

If $ARGUMENTS is empty or ambiguous, ask:
> "What's the source for this content? You can give me:
> 1. A YouTube video package path (e.g. `~/content/youtube/claude-code-btw/`)
> 2. A topic or URL to research
> 3. Raw text or idea to adapt into posts"

---

## Step 2: Load Content

### YouTube Video Mode
Read these files if they exist (in order of priority):
- `~/content/youtube/<slug>/script.md` - full script for deep insight extraction
- `~/content/youtube/<slug>/description.md` - polished summary + key points
- `~/content/youtube/<slug>/hooks.md` - strong angles and hooks already written
- `~/content/youtube/<slug>/titles.md` - for post headline ideas

Also look up the YouTube URL for the video by running:
```bash
yt-dlp "https://www.youtube.com/@tylerreedai/videos" --print "%(webpage_url)s | %(title)s | %(upload_date)s" --no-download --playlist-end 20 2>/dev/null
```
Match the video title to find the URL. Store it for use in posts.

### Research Mode (topic or URL)
Run 2-3 targeted `WebSearch` queries on the topic. Look for:
- Recent developments, stats, or expert quotes
- Contrarian angles or surprising findings
- Practical takeaways your audience cares about

Summarize findings internally before writing.

### Direct Text Mode
Accept the user's raw input as-is. Ask if there are any key angles or tones they want emphasized.

---

## Step 3: Extract Core Ideas

Identify **3-5 key insights, angles, or takeaways** that will anchor all platform content. Look for:

- Surprising or counterintuitive facts
- Practical, actionable tips
- Strong opinions or hot takes
- Before/after or transformation moments
- Quotable one-liners

Present these to the user briefly so they can redirect if needed.

---

## Step 4: Ask Platform + Format Preferences

Ask:
> "Which platforms do you want posts for? (default: all)
> - X/Twitter
> - LinkedIn (text post with video link)
> - Instagram (carousel via Blotato)
> - YouTube Community
> - Skool"

If they say "all" or don't specify, generate all platforms.

---

## Step 5: Generate All Text Content

### X/Twitter - Thread Format

Write as a thread: one punchy main tweet + 4-5 reply tweets + final reply with video link.

- Main tweet: bold hook, under 230 chars (your account limit)
- Reply tweets: one point each, under 230 chars
- Final reply: CTA + YouTube URL
- No hashtags (they reduce engagement on X)
- No em dashes - use commas or plain dashes instead
- Write as punchy standalone insights, not "check out my video"

---

### LinkedIn Text Post

**Structure (8-part framework):**

1. **Hook** (6-8 words max) - Stop the scroll. Use one of these proven formulas:
   - "I [did unexpected thing]. Here's what happened:"
   - "[Number] [things] I wish I knew about [topic]"
   - "Stop doing [common thing]. Do this instead:"
   - "Everyone is wrong about [topic]. Here's why:"
   - "I spent [time] doing [thing]. [Surprising result]."

2. **Rehook** - Second line that challenges or expands the hook. Creates curiosity gap.

3. **Problem** - Call out the reader's exact struggle in 1-2 sentences.

4. **Solution** - Deliver the core value/insight.

5. **Signpost** - "Here's how I did it:" or "Here's the framework:" - hint at the details coming.

6. **Body** - 3-5 key points. Short paragraphs of 1-2 sentences each. Use blank lines between every paragraph. Can use emojis sparingly for visual breaks but NOT as bullet points.

7. **Power ending** - One impactful closing sentence. Pattern interrupt or strong opinion.

8. **Question CTA** - End with a simple, easy-to-answer question (72% better engagement than statements). Include YouTube video URL after the question.

**Formatting rules:**
- Plain text only - NO markdown, NO **bold**, NO hashtags
- No em dashes - use commas or plain dashes
- **14+ short paragraphs** with blank lines between each (1-2 sentences per paragraph)
- 1,242-2,500 characters optimal length
- Grade 5-7 reading level - simple, clear, human
- Write "How I" not "How to" - readers want real stories
- First person, conversational but professional
- Lead with insight, not a promotional pitch

**Algorithm optimization:**
- No external links in the main post body (60% less reach). Put the YouTube URL at the very end after the CTA question, or in a comment.
- Design for dwell time - longer reads with engaging structure
- Posts go live between 10-11 AM ET, especially Tue-Thu

---

### LinkedIn Carousel (PDF via Gamma or Kie.ai)

When the user requests a LinkedIn carousel, create slide content following these specs:

**Specs:**
- PDF format, 1080x1080 (1:1) or 1080x1350 (4:5)
- **6 content slides** (no CTA slide - you add separately with Kie.ai)
- One idea per slide, large readable text
- Minimal text per slide - 2-4 short lines max

**Slide structure:**
- **Slide 1 (Hook):** Bold headline with specific value/numbers. Under 8-10 words. Answer: "Is this for me?" and "What do I get if I swipe?"
- **Slides 2-5 (Value):** One key point per slide. Big bold heading + short explanation.
- **Slide 6 (Summary):** Key takeaway or actionable closing.

**PDF filename matters** - it becomes the bold clickable headline under the carousel on LinkedIn. Make it compelling.

**Carousel-specific caption:**
- Use the 8-part text post framework above for the caption
- End with "Save this for later" or "Send this to someone who needs it" (targets saves + shares, the top algorithm signals)

If using Gamma API:
```bash
python3 ~/.claude/skills/carousel/gamma_carousel.py "<slides_file>" \
  --theme-id "6mnm4rnohwy7bmr" \
  --num-cards 6
```

---

### Instagram Carousel - Visual Carousel Maker

All Instagram carousels go through the visual carousel maker at `http://localhost:3010`. Exports land in `~/content/platform/carousels/<slug>/`.

**Two ways to create carousels:**

**Option A — From this skill (API):**
Generate and auto-save carousels directly by calling the bulk endpoint:
```bash
curl -s -X POST http://localhost:3010/api/bulk-generate \
  -H 'Content-Type: application/json' \
  -d '{
    "items": [
      {"topic": "<topic 1>", "frameworkId": "educational", "platform": "instagram"},
      {"topic": "<topic 2>", "frameworkId": "hormozi", "platform": "instagram"}
    ]
  }'
```
Returns `{results: [{id, title, savedAt}]}`. Carousels are saved to the app's library.
After generating, tell the user: "Your carousels are ready in the carousel maker — open it at http://localhost:5175 to add backgrounds and export."

Available frameworkIds (check `/api/frameworks` for the current list):
- `educational` — step-by-step, numbered tips
- `hormozi` — contrarian, proof-driven
- `quick-wins` — fast actionable list
- `storytelling` — narrative arc
- `instagram-writer` — Cover/Pain/Solution/How/Results/CTA

**Option B — In-app batch UI:**
Tell the user to click the ⚡ Batch button in the carousel maker header. They paste topics (one per line), pick a framework, and generate all at once.

**Carousel content rules (Instagram-specific):**
- 4:5 aspect ratio (1080x1350) - fills the screen
- First slide: under 8-10 words, answer "Is this for me?" and "What will I get if I swipe?"
- Design for saves and shares - these are the #1 and #2 algorithm signals
- Export as PDF for posting via Blotato (use PDF, not individual PNGs)

**Posting via Blotato:**
After the user exports the PDF from the carousel maker, post using Blotato:
- Upload the PDF as the carousel asset
- Use only slides 1-6 (the exported PDF is already correct)
- The export saves to `~/content/platform/carousels/<slug>/<slug>.pdf`

**Instagram Caption rules:**
- 150-250 words
- Hook line first (must earn the swipe)
- Swipe CTA early ("Swipe to see all 5")
- **Keyword-rich SEO language** - include searchable terms like "Claude Code tutorial", "AI automation tips", "AI workflow" naturally in the caption. Keywords in captions matter MORE than hashtags for Instagram discovery now.
- End with dual CTA: "Save this for later" + "Send to someone who needs this" (targets the top 2 algorithm signals: saves and shares)
- Exactly 5 hashtags at the very end: #claudecode #claudeai #ai #claudecodetips #aiautomation

---

### YouTube Community Post (2-4 sentences)

Tone: Casual, like texting a friend about something cool.
- 1-2 sentences about the video
- End with an easy question
- Include `[VIDEO_URL]` placeholder

---

### Skool Post

Tone: Knowledgeable friend sharing something useful in a group chat. Not a newsletter, not a sales pitch.

**For video days (long-form release):**
- Hook line that stands on its own - not "new video is up"
- 2-4 short paragraphs with the key insight or takeaway from the video
- End with a genuine question or CTA ("Drop a comment if you've tried this", "Who's already using this?")
- Include `[VIDEO_URL]` at the end
- 150-300 words

**Rules:**
- Plain text only - no markdown bold, no headers (Skool renders them oddly)
- No em dashes - use plain hyphens or commas
- Short paragraphs - 1-3 sentences max
- Lead with the most interesting thing, not background context
- Emojis sparingly for visual breaks only

---

## Step 6: Review Loop

Show all content clearly, organized by platform. Ask if anything needs revision before saving or posting.

**Quality checklist before showing:**
- [ ] LinkedIn hook is 6-8 words, uses a proven formula
- [ ] LinkedIn post has 14+ short paragraphs, 1,242-2,500 chars
- [ ] LinkedIn has no markdown, no bold, no hashtags, no em dashes
- [ ] LinkedIn ends with a simple question CTA
- [ ] Instagram caption includes keyword-rich SEO language
- [ ] Instagram caption ends with save + share dual CTA
- [ ] Instagram has exactly 5 hashtags at the end
- [ ] X tweets are under 230 chars each, no hashtags
- [ ] No em dashes anywhere in any content
- [ ] All posts lead with insight, not promotion

---

## Step 7: Save Outputs

**YT video mode** -> `~/content/youtube/<slug>/social/`
**Standalone mode** -> `~/content/YYYY-MM-DD-<topic-slug>/`

Files to write:

| File | Contents |
|---|---|
| `x.md` | Thread (main tweet + replies) |
| `linkedin.md` | Text post with video URL |
| `instagram.md` | Carousel slide URLs + caption |
| `community.md` | 2-3 YT Community post drafts |
| `skool.md` | 2-3 Skool post drafts (video post + variants) |
| `status.md` | Post tracking table (see format below) |

**status.md format:**
```markdown
# Post Status - [Video Title]

## Video
**Title:** ...
**YouTube URL:** ...
**Published:** YYYY-MM-DD

---

## Posted

| Platform | Format | Date | URL | Notes |
|---|---|---|---|---|

## Pending

| Platform | Format | Notes |
|---|---|---|

---

## Assets
- List of files in social/
```

---

## Step 8: Post Inline

After saving, ask: **"Ready to post? Which platforms?"**

Handle posting directly using Blotato MCP tools - no need to hand off to `/post` skill:
1. Call `blotato_list_accounts` to get account IDs
2. Call `blotato_create_post` for each platform
3. For X threads, use `additionalPosts` array for reply tweets
4. Poll `blotato_get_post_status` if needed
5. Update `status.md` with live URLs after posting

**Account IDs (run `blotato_list_accounts` to get your own):**
- Instagram: `<your-instagram-account-id>`
- LinkedIn: `<your-linkedin-account-id>`
- Twitter/X: `<your-x-account-id>`

**Optimal posting times:**
- LinkedIn: 10-11 AM ET, best on Tue-Thu. Wednesday 11 AM-4 PM is peak.
- Instagram: 6-9 AM, 11 AM-1 PM, or 7-9 PM EST. Best on Tue/Wed/Fri.
- X: Mornings or lunch, weekdays

---

## Rules

- **Never auto-post** - always show content and get confirmation before publishing
- **Never skip the review step** - show all content before saving
- **Run the quality checklist** in Step 6 before presenting content
- LinkedIn: plain text only, no markdown, no hashtags, no em dashes, 8-part framework, 14+ paragraphs
- X/Twitter: 230 char limit per tweet, thread format with video link in last reply
- Instagram Blotato carousel: use only slides 1-6, skip slide 7 (broken CTA) - replace with custom Kie.ai image
- Instagram captions: keyword-rich SEO language, dual save+share CTA, exactly 5 hashtags
- Always fetch real YouTube URL from channel before writing posts
- Always create/update `status.md` to track what was posted and where
- If a `social/` folder already exists, ask before overwriting existing files
- For standalone mode, always do WebSearch research before writing (2-3 queries minimum)
- **Engagement reminder:** After posting, remind the user to reply to comments within 60 minutes (30% engagement boost on LinkedIn, critical for Instagram's 24-48hr algorithm window)

