x-writing

$npx mdskill add richtabor/agent-skills/x-writing

Convert notes into authentic, engaging X posts instantly.

  • Drafts tweets from markdown files or macOS Notes.
  • Integrates with X strategy guides and style references.
  • Analyzes content against anti-patterns for human voice.
  • Delivers polished posts ready for immediate sharing.
SKILL.md
.github/skills/x-writingView on GitHub ↗
---
name: x-writing
description: Transforms notes into X (Twitter) posts. Triggers when user asks to create social content, draft tweets, or turn notes/ideas into posts.
---

# X Writing Skill

## Overview

Transform your notes, work updates, and observations into engaging X (Twitter) content. This skill analyzes your notes to identify the most shareable insights, then crafts authentic posts that match your voice and drive engagement.

**Supports two idea sources** — a markdown file (`X_SOURCE_FILE`) and/or macOS Notes (`X_NOTES_APP_SOURCE`). If both are configured, asks which to use.

## Process

### Phase 1: Preparation and Analysis

**1.1 Load Writing Guides (REQUIRED - Load First)**

Before any other work, load the following:

1. **Growth Principles** (`references/x-strategy.md`) - Content selection criteria, what makes posts shareable, engagement patterns, and what to prioritize from notes. This guides WHAT to share.

2. **Writing Style Guide** (from `WRITING_STYLE_GUIDE_PATH` env var) - Voice, tone, structure, banned phrases, and signature patterns. This guides HOW to share it. Skip if the env var is not set.

3. **Anti-Patterns** - Run `echo "$WRITING_ANTI_PATTERNS_PATH"` to check the env var. If set, load that file. If not set, fall back to `references/anti-patterns.md`. AI writing patterns to avoid. Critical for ensuring posts sound human and authentic, not AI-generated. Avoid patterns like "It's not X, it's Y", formal transitions, hedging language, and AI-specific vocabulary.

**PRIORITY RULE**: When guides conflict, `references/x-strategy.md` wins. Content value and shareability take precedence over stylistic preferences. When the style guide and anti-patterns conflict, anti-patterns win.

**1.2 Understand the Source Material**

Get clarity on what notes to work with:

- Ask which notes, ideas, or updates they want to transform into posts
- **Check for idea sources:**
  - Run `echo "$X_SOURCE_FILE"` — if set, a markdown ideas file is available
  - Run `echo "$X_NOTES_APP_SOURCE"` — if set, a macOS Notes note is available (use `scripts/fetch-notes.sh get` to fetch)
  - If **both** are configured and the user says "check my ideas" or similar without specifying, ask which source to use
  - If **one** is configured, use it directly
  - If **neither** is configured, work from whatever the user provides (pasted content, markdown files, etc.)
- Read the source material and identify the core insights, learnings, or updates
- Note any specific tools, projects, numbers, or details mentioned

**Multiple ideas/notes workflow:**
- When the user provides multiple distinct ideas or notes, work through them ONE AT A TIME
- Create post options for the first idea
- Wait for user approval/feedback before moving to the next idea
- This prevents overwhelming the user and allows for refinement as you go

**1.3 Apply Selection Criteria**

Evaluate notes using the Content Selection Framework in `references/x-strategy.md`. Prioritize shipped work with learnings, non-obvious insights, and specific tool recommendations. Skip engagement bait, vague hype, and complaints without solutions.

### Phase 2: Content Creation

**2.1 Select the Best Angle**

Identify one clear idea, the specific details that prove it, and the hook (first line).

**2.2 Choose the Format**

Default to single tweets. Only thread (2-5 tweets) when the story requires steps, multiple related insights, or before/after context. See Thread Strategy in `references/x-strategy.md`.

**2.3 Draft the Content**

Apply all three guides loaded in Phase 1 **during drafting, not just as a post-check**:
- **x-strategy.md** — formatting rules, content strategy, High-Engagement Patterns, and Signature Patterns. **Formatting is critical**: one sentence per line, white space between lines, hook in first line, 180-250 chars, no italics.
- **Writing style guide** (`WRITING_STYLE_GUIDE_PATH`) — voice, tone, banned phrases, language simplification. Apply casing preference from X_CASE_STYLE env var (standard by default). When set to `"lowercase"`, use all lowercase including "i" as a pronoun — only capitalize personal names, WordPress, and product names.
- **Anti-patterns** — actively avoid during drafting. If a draft uses any anti-pattern, rewrite before presenting. **HARD RULE: NEVER use the "It's not X, it's Y" reframing pattern in any form.** This includes: "isn't X, it's Y", "not because X, because Y", "isn't about X, it's about Y", "less about X, more about Y". Say the positive claim directly instead. Also avoid: em dashes, generic observations without specifics, and intensifiers.

**2.4 Engagement Optimization**

End ~70% of posts with engagement (specific question, teaser, or invitation). Let the rest land with a hard stop. See "What Makes Content Shareable" in `references/x-strategy.md`.

**2.5 Quality Check**

After drafting, re-read every post against the anti-patterns guide and fix any violations before presenting. Then verify:
- [ ] Did I get to the point in line 1?
- [ ] Is this specific? (names, numbers, examples)
- [ ] Would I actually say this out loud?
- [ ] Does it sound like ME, not ChatGPT?
- [ ] Did I use any banned phrases from the writing style guide?
- [ ] Did I avoid ALL anti-patterns? (reframing, em dashes, intensifiers, generic observations)
- [ ] If it's a reaction, did I add MY angle?

### Phase 3: Output

**3.1 Present the Content**

For each post created:

1. **The Post(s)** - Show the actual tweet(s) ready to copy/paste
2. **Format** - Indicate if it's a single tweet or thread
3. **Character Count** - Show length (target: 180-250 chars)
4. **Pattern Used** - Which pattern from x-strategy.md was applied
5. **Key Elements** - What specifics, tools, or projects were highlighted

**3.2 Offer Options**

When appropriate, provide 2-3 variations:
- Different angles on the same insight
- Single tweet vs thread format
- Different engagement endings

**3.3 Explain Selections**

Briefly note what was prioritized and why:
- Which insights from notes were selected
- Why certain details were emphasized
- What was intentionally left out

**3.4 Save Approved Posts**

When the user approves a post, save it to the drafts file (create if missing).

**File location (resolve before saving):**
1. Run `echo "$X_DRAFTS_FILE"` to check the env var
2. If set, append to that file path
3. If not set, default to `.x/posts.md` (top-level, create if missing)

**Markdown format:**
```markdown
---

**Category:** Learning
**Date:** 2026-01-01

WordPress.com AI adds conversation alongside block editing.


People who couldn't navigate the UI before are shipping sites now. Others still use blocks for fine-tuning.

Both work. The conversation path just removes the skill barrier.

---
```

**For threads**, use `[Tweet N]` markers:
```markdown
---

**Category:** Learning
**Date:** 2026-01-01

[Tweet 1]
WordPress.com AI changes how people build sites.


[Tweet 2]
People who couldn't navigate block editing are shipping now.

[Tweet 3]
The UI is still there for fine-tuning. But conversation removes the skill barrier.

[Tweet 4]
Ask or click. Both paths work.

---
```

**Categories:**
- **Learning** - Insights, shipped updates with learnings
- **Update** - Project progress
- **Tool** - Recommendations
- **Observation** - Industry takes

**Workflow:**
1. Present the post(s) to the user
2. When approved, append to `X_DRAFTS_FILE` or `.x/posts.md`
3. User can copy-paste directly into X (text is ready with proper line breaks)
4. User removes the section after posting, or asks you to remove it

## Output Format

After creating social content, provide:

```
📱 Post 1 (Single Tweet, 210 chars)
─────────────────────────────────
[Actual tweet text ready to copy/paste]

Pattern: "Shipped X, learned Y"
Specifics: agents.foo, conversational context matching
Engagement: Specific question

─────────────────────────────────

From your notes, I prioritized:
✓ The discovery insight (most shareable)
✓ Why traditional search failed (specific learning)
✗ Timeline details (not core value)

Alternative angles:
• Focus on the technical implementation
• Thread breaking down the 3 attempts
```

## Example Interaction

**User**: "Help me create a post from these notes about building the curation feature"

**Response**:
```
Let me analyze your notes and create X content.

[Phase 1: Loads references/x-strategy.md and writing style guide]
[Reads the notes, identifies key insights and specific details]

─────────────────────────────────
📱 Post (Single Tweet, 218 chars)
─────────────────────────────────

Shipped curation v1 for agents.foo today.

Discovery is way harder than app stores. Agents are conversations, not static features.

Had to rebuild around context matching instead of keyword search.

Pattern: "Shipped X, learned Y"
Key specifics: agents.foo, context matching vs keyword search
Engagement: Implicit (landing the insight)

─────────────────────────────────

From your notes, I selected:
✓ Core insight: agent discovery is different
✓ Specific solution: context matching
✓ Concrete detail: agents.foo
✗ Number of rebuild attempts (not essential to the insight)

Would you like me to:
• Save this approved post for tracking
• Create a thread version breaking down why search patterns failed
• Add a question ending for more engagement
• Draft additional posts from other insights in your notes
```

## Tips for Best Results

1. **Provide context**: "Notes from building curation feature" vs just pasting notes
2. **Mention specific parts**: "Focus on the learning about context matching" helps prioritize
3. **Indicate quantity**: "Create 3 posts from these notes" vs "create posts"
4. **Specify format preference**: "Single tweets only" or "open to threads"
5. **Request variations**: "Show me a few angles" gives options to choose from
6. **Iterate**: After the draft, request adjustments: "Make it more specific" or "Add a question ending"

## Environment Variables

| Variable | Required | Description |
|----------|----------|-------------|
| `WRITING_STYLE_GUIDE_PATH` | No | Path to shared writing style guide. Loaded in Phase 1.1 |
| `WRITING_ANTI_PATTERNS_PATH` | No | Path to shared anti-patterns. Overrides `references/anti-patterns.md` |
| `X_DRAFTS_FILE` | No | File path for saving approved posts. Default: `.x/posts.md` |
| `X_SOURCE_FILE` | No | Path to a markdown file containing post ideas. Read when the user asks to check ideas. |
| `X_NOTES_APP_SOURCE` | No | macOS Notes note name to fetch ideas from (e.g. `"Tweets"`). Uses `scripts/fetch-notes.sh`. |
| `X_CASE_STYLE` | No | `"standard"` (default) or `"lowercase"` |

More from richtabor/agent-skills