Template. Replace placeholder values like {{YOUR_NAME}}, {{CONTENT_DIR}}, etc. with your own before using.
Content Creation
Twitter Threads
Transform research into engaging Twitter threads with hook tweets, body sections, and CTAs, published via X API with optional image support and scheduling.
MCP Required. This skill needs X API (custom script) to run.
Save to
~/.claude/skills/twitter-threads/SKILL.mdSKILL.md
---
name: twitter-threads
description: "Transform research reports into Twitter/X threads. Use when: creating twitter content from research. Triggers on: twitter threads, create threads, threads from research, repurpose research to twitter."
---
# Twitter Threads from Research
Transform research reports into engaging Twitter/X threads that match {{YOUR_NAME}}'s voice.
## Prerequisites
**Publishing uses the X API via `{{X_API_SCRIPT_PATH}}`.**
1. Env vars must be set: `TWITTER_API_KEY`, `TWITTER_API_SECRET`, `TWITTER_ACCESS_TOKEN`, `TWITTER_ACCESS_SECRET`
2. Dependencies installed: run `npm install` in `~/.claude/skills/x-api/` if needed
3. If API call fails, fall back to saving as markdown/JSON for manual posting
## Workflow
### Step 1: Read Profile and Research
1. Read `{{PROFILE_PATH}}` for voice/tone guidelines
2. Ask user which research folder to use from `{{CONTENT_DIR}}/`
3. Read all markdown files in the selected folder
### Step 2: Analyze Thread Potential
Scan the research for thread-worthy content:
- **Statistics/data points** - Numbers that surprise or validate
- **Contrarian takes** - Goes against common belief
- **How-to sequences** - Step-by-step processes
- **Story hooks** - Personal anecdotes or case studies
- **Myth busters** - "Most people think X, but actually Y"
Report to user:
```
Found [N] potential threads:
1. [Hook summary] - [type: stat/contrarian/how-to/story/myth]
2. ...
```
### Step 3: Draft Threads
For each approved thread concept, create:
- **Hook tweet** (first tweet) - Must stop the scroll
- **Body tweets** (2-8 tweets) - One idea per tweet
- **CTA tweet** (final) - What should reader do next
Save to `threads_draft.json` in the research folder using this structure:
```json
{
"threads": [
{
"id": "thread_1",
"hook_summary": "LinkedIn stats that will change your approach",
"tweets": [
"Most people send 100 connection requests hoping for 5 meetings.\n\nHere's the math that changed how I do LinkedIn outbound:",
"Tweet 2 content...",
"Final tweet with CTA"
],
"status": "draft"
}
]
}
```
### Step 4: User Review
Display each thread formatted for easy review:
```
---
THREAD 1: [hook_summary]
---
1/ [first tweet] ([char count]/280)
2/ [second tweet] ([char count]/280)
...
---
```
Ask user: "Approve, edit, or skip each thread?"
### Step 5: Post via X API
For approved threads, post using Bash:
```bash
echo '["First tweet text", "Second tweet text", "Third tweet text"]' | node {{X_API_SCRIPT_PATH}} thread
```
- Pass the tweets as a JSON array of strings via stdin
- The script chains each tweet as a reply to the previous one (creating the thread)
- Adds a 1.5s delay between tweets to avoid rate limits
- Returns JSON with `{ success: true, thread: [{ id, text }, ...] }` on success
- Update the thread status to "posted" in `threads_draft.json` after success
**Scheduling:** After user approves threads, ask: **"Post now or schedule for later?"**
If scheduling:
1. Ask for date and time (assume ET unless specified otherwise)
2. Convert to UTC ISO string
3. Write the thread payload to a temp JSON file, then trigger:
```bash
cd "{{TRIGGER_PROJECT_DIR}}" && npx trigger.dev@latest dev trigger schedule-thread --payload '{"tweets":[{"text":"First tweet"},{"text":"Second tweet"}],"scheduled_at":"2026-02-23T14:00:00Z"}'
```
With images:
```bash
cd "{{TRIGGER_PROJECT_DIR}}" && npx trigger.dev@latest dev trigger schedule-thread --payload '{"tweets":[{"text":"First tweet","image_path":"/path/to/img.jpg"},{"text":"Second tweet"}],"scheduled_at":"2026-02-23T14:00:00Z"}'
```
4. Update thread status in `threads_draft.json` to "scheduled" with the scheduled time
**Fallback (if API call fails):**
Save to `threads_draft.json` with status "ready_for_manual" and display copy-ready output for manual posting.
## Writing Rules ({{YOUR_NAME}}'s Voice)
### DO:
- Start with data or bold claim
- Use short sentences
- Include specific numbers
- End with actionable takeaway
- Write like you're texting a smart friend
- Use swear words naturally - "bullshit", "damn", "hell", "no shit" - this is how {{YOUR_NAME}} talks. Don't force it, but don't sanitize either. 1-2 per thread max. Clean copy sounds AI-generated.
### DON'T:
- Use AI writing patterns - run humanizer pass (see `humanizer` skill): AI vocabulary, significance inflation, filler phrases, hedging, copula avoidance, generic conclusions (NON-NEGOTIABLE)
- Use rhetorical questions as hooks ("Want to know...?")
- Add emojis unless they add meaning
- Use corporate speak or buzzwords
- Write walls of text
- Start with "I"
- Use false-contrast filler ("isn't X / it's Y" - say the real point directly)
- Use em dashes (—) anywhere. Use regular dashes (-), commas, periods, or restructure. Em dashes are an obvious AI writing tell. (NON-NEGOTIABLE)
- Mention personal revenue/MRR/income (revenue flex is NON-NEGOTIABLE)
### Tweet Length
- Aim for 200-250 characters per tweet
- Never exceed 280 characters
- Leave room for engagement (likes don't need full tweets)
## Thread Formulas That Work
**The Stat Opener:**
```
[Surprising statistic].
Here's what that means for [audience]:
```
**The Contrarian:**
```
Everyone says [common advice].
I did the opposite. Here's what happened:
```
**The Story:**
```
[Year], I [situation].
[Unexpected outcome]. Here's the lesson:
```
**The Framework:**
```
The [X]-step process I use for [outcome]:
(Thread)
```
## Requirements
**For posting to Twitter/X:**
- X API credentials set as env vars: `TWITTER_API_KEY`, `TWITTER_API_SECRET`, `TWITTER_ACCESS_TOKEN`, `TWITTER_ACCESS_SECRET`
- `twitter-api-v2` installed in `~/.claude/skills/x-api/` (run `npm install` if needed)
## Image Support
Threads can include images on any tweet. Pass objects instead of strings:
```bash
echo '[{"text":"Tweet with image","image":"/path/to/photo.jpg"},{"text":"Tweet without image"}]' | node {{X_API_SCRIPT_PATH}} thread
```
For best results, write the JSON to a temp file first to avoid shell escaping issues:
```bash
cat /tmp/thread.json | node {{X_API_SCRIPT_PATH}} thread
```
Supports JPG, PNG, GIF, and WEBP.