x-publish

Publish tweets and threads to X (Twitter) draft using browser automation. Use when user wants to publish content to X, save to drafts, or mentions "publish to X", "post tweet", "x-publish", "发布推文". Supports short tweets and threads. NEVER auto-publish, always saves to draft.

214 stars

Best use case

x-publish is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Publish tweets and threads to X (Twitter) draft using browser automation. Use when user wants to publish content to X, save to drafts, or mentions "publish to X", "post tweet", "x-publish", "发布推文". Supports short tweets and threads. NEVER auto-publish, always saves to draft.

Teams using x-publish should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/x-publish/SKILL.md --create-dirs "https://raw.githubusercontent.com/kangarooking/x-skills/main/x-publish/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/x-publish/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How x-publish Compares

Feature / Agentx-publishStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Publish tweets and threads to X (Twitter) draft using browser automation. Use when user wants to publish content to X, save to drafts, or mentions "publish to X", "post tweet", "x-publish", "发布推文". Supports short tweets and threads. NEVER auto-publish, always saves to draft.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# X Publish

Publish tweets and threads to X draft using Playwright browser automation.

## Prerequisites

- Playwright MCP for browser automation
- User logged into X (Twitter)
- Python 3.9+ with dependencies:
  - macOS: `pip install Pillow pyobjc-framework-Cocoa`
  - Windows: `pip install Pillow pywin32`

## Critical Rules

1. **NEVER auto-publish** - Only save to draft
2. **User must be logged in** - Prompt to login if not
3. **Verify content before saving** - Double-check tweet text

## Content Types

### Short Tweet
Single tweet ≤280 characters

### Thread
Multiple tweets connected (3-10 tweets)

## Scripts

### copy_to_clipboard.py
Copy text to system clipboard for paste operation:
```bash
# Copy text to clipboard
python scripts/copy_to_clipboard.py text "Tweet content here"

# Copy from file
python scripts/copy_to_clipboard.py text --file /tmp/tweet.txt
```

## Workflow

### Short Tweet

**Step 1: Prepare Content**
```bash
# Save tweet to temp file
echo "Tweet content" > /tmp/tweet.txt

# Copy to clipboard
python scripts/copy_to_clipboard.py text --file /tmp/tweet.txt
```

**Step 2: Open Compose**
```
browser_navigate: https://x.com/compose/post
```

**Step 3: Paste Content**
```
browser_snapshot → Find tweet textbox
browser_click: textbox
browser_press_key: Meta+v
```

**Step 4: Save Draft**
```
browser_click: X (close button)
browser_click: "Save" or "保存" in dialog
```

**Step 5: Verify**
```
Report: "Draft saved. Please review at https://x.com/compose/drafts"
```

### Thread

**Step 1: Prepare Content**
Parse thread into individual tweets:
```
### 1/5
First tweet content...

### 2/5
Second tweet content...
```

**Step 2: Open Compose**
```
browser_navigate: https://x.com/compose/post
```

**Step 3: Add First Tweet**
```bash
python scripts/copy_to_clipboard.py text "First tweet content"
```
```
browser_click: textbox
browser_press_key: Meta+v
```

**Step 4: Add More Tweets**
For each additional tweet:
```
browser_click: "Add another post" / "添加" button
browser_press_key: Meta+v (after copying next tweet)
```

**Step 5: Save Draft**
```
browser_click: X (close button)
browser_click: "Save" in dialog
```

**Step 6: Verify**
```
Report: "Thread draft saved ({n} tweets). Review at https://x.com/compose/drafts"
```

## Efficiency Guidelines

### Avoid Unnecessary Waits
```
❌ browser_snapshot after every action
✅ Use action return values for next step
```

### Parallel Preparation
```
✅ Prepare all tweet content before browser operations
✅ Copy to clipboard while navigating
```

### Sequential Execution
```
Navigate → Paste first tweet → Add tweet → Paste → ... → Save
```

## Element References

Common elements in X compose:

| Element | Description | Typical ref pattern |
|---------|-------------|-------------------|
| Tweet textbox | Main input area | textbox with "What's happening" |
| Add tweet button | "+" or "添加" | button near compose area |
| Close button | X icon | button top-left |
| Save draft | In close dialog | "Save" / "保存" button |
| Drafts link | View saved drafts | link to /compose/drafts |

## Example Flows

### Short Tweet Example

User: `/x-publish "Claude 4.5发布了,extended thinking是真正的游戏规则改变者。"`

```bash
# 1. Copy to clipboard
python scripts/copy_to_clipboard.py text "Claude 4.5发布了,extended thinking是真正的游戏规则改变者。"
```

```
# 2. Navigate and paste
browser_navigate: https://x.com/compose/post
browser_snapshot → find textbox
browser_click: textbox
browser_press_key: Meta+v

# 3. Close and save
browser_click: close button (X)
browser_click: "Save" button

# 4. Report
"Draft saved! Review at: https://x.com/compose/drafts"
```

### Thread Example

User: `/x-publish` (with thread content from x-create)

```
Thread:
### 1/3
First point about AI...

### 2/3
Second point...

### 3/3
Conclusion...
```

Execution:
```bash
# Prepare all tweets
tweet1="First point about AI..."
tweet2="Second point..."
tweet3="Conclusion..."
```

```
# Navigate
browser_navigate: https://x.com/compose/post

# Tweet 1
python copy_to_clipboard.py text "$tweet1"
browser_click: textbox
browser_press_key: Meta+v

# Tweet 2
python copy_to_clipboard.py text "$tweet2"
browser_click: "Add another post" button
browser_press_key: Meta+v

# Tweet 3
python copy_to_clipboard.py text "$tweet3"
browser_click: "Add another post" button
browser_press_key: Meta+v

# Save
browser_click: close button
browser_click: "Save"

# Report
"Thread draft saved (3 tweets). Review at: https://x.com/compose/drafts"
```

## Error Handling

### Not Logged In
```
If login page detected:
→ "Please log in to X first, then run /x-publish again"
```

### Character Limit
```
If tweet > 280 chars:
→ Split into thread or truncate with warning
```

### Network Error
```
If page fails to load:
→ Retry once, then report error
```

## Integration

After publishing:
```
推文已保存到草稿箱!

- 类型: {short/thread}
- 条数: {n}
- 草稿链接: https://x.com/compose/drafts

请手动审核后发布。
```

Append a machine-readable block for hooks/state ingestion:

```json
PUBLISH_JSON
{
  "schema_version": "x_skills.publish.v1",
  "timestamp": "{timestamp}",
  "draft_saved": true,
  "post_type": "short|thread",
  "count": 1,
  "draft_url": "https://x.com/compose/drafts"
}
```

(Optional) Append event for feedback loop:

```bash
python ~/.claude/skills/x-create/scripts/x_state.py event --event publish.saved_to_draft --payload-json '{"post_type":"short","count":1,"draft_saved":true}'
```

Related Skills

x-filter

214
from kangarooking/x-skills

Score and filter topics for X content creation using weighted criteria. Use when user wants to evaluate collected materials, filter topics by score, or mentions "filter topics", "score materials", "x-filter", "选题筛选". Applies 10-point scoring system with customizable weights.

x-create

214
from kangarooking/x-skills

Create viral X (Twitter) posts including short tweets, threads, and replies. Use when user wants to write X content, create posts, or mentions "create tweet", "write thread", "x-create", "写推文", "创作推文". Supports 5 post styles with customizable templates, plus a mandatory humanize pass to reduce AI-sounding phrasing. First-time users go through onboarding to set up profile.

x-collect

214
from kangarooking/x-skills

Collect and research materials for X (Twitter) content creation using multi-round web search strategy. Use when user wants to gather trending topics, research subjects for X posts, or mentions "collect materials", "research topic", "find content for X", "x-collect". Performs 4-round deep research mimicking human research workflow.

hugging-face-paper-publisher

31392
from sickn33/antigravity-awesome-skills

Publish and manage research papers on Hugging Face Hub. Supports creating paper pages, linking papers to models/datasets, claiming authorship, and generating professional markdown-based research articles.

AI Research PublishingClaude

nansen-binance-publisher

3891
from openclaw/skills

Automatically fetch multi-dimensional on-chain data using Nansen CLI, compile a comprehensive and beautifully formatted daily report, and publish it to Binance Square. Auto-run on messages like 'generate nansen daily report', 'post nansen daily to square', or when the user triggers the slash commands `/nansen` or `/post_square`.

Content & Documentation

name: welight-wechat-layout-publish

3891
from openclaw/skills

description: Welight standalone skill for turning an article into WeChat Official Accounts compatible Markdown/HTML, presenting built-in theme choices, and publishing to WeChat as a draft or formal post when publishing prerequisites are already configured.

Content & Documentation

wechat-publisher

3891
from openclaw/skills

一键发布 Markdown 到微信公众号草稿箱。基于 wenyan-cli,支持多主题、代码高亮、图片自动上传。

Content & Documentation

x-article-publisher

128
from anbeime/skill

Publish Markdown articles to X (Twitter) Articles editor with proper formatting. Use when user wants to publish a Markdown file/URL to X Articles, or mentions "publish to X", "post article to Twitter", "X article", or wants help with X Premium article publishing. Handles cover image upload and converts Markdown to rich text automatically.

Content & DocumentationClaude

xiaohongshu-publish

5
from zangqilong198812/openclaw-xiaohongshu-publish-skill

This skill enables AI agents to publish content (images, videos, or text posts) to Xiaohongshu (Little Red Book) using the OpenClaw browser, managing account details and media assets.

Content & Documentation

x-article-publisher-skill

31392
from sickn33/antigravity-awesome-skills

Publish articles to X/Twitter

publish-to-pages

28865
from github/awesome-copilot

Publish presentations and web content to GitHub Pages. Converts PPTX, PDF, HTML, or Google Slides to a live GitHub Pages URL. Handles repo creation, file conversion, Pages enablement, and returns the live URL. Use when the user wants to publish, deploy, or share a presentation or HTML file via GitHub Pages.

webiny-api-event-publisher-catalog

7955
from webiny/webiny-js

api/event-publisher — 2 abstractions.