x-publish
Skill323 starsChanged 10 months agoApache-2.0View on GitHub
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.
- Installs packages
2 other projects use a version of this, 1 of them edited.
Adopted by
Most recently taken up by
- liftli-ai/x-agent-skillstheir own version, first seen Oct 17, 2026
- Jay-Chen79/claude-skillsedited, first seen Feb 2, 2026
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 1
- Jay-Chen79/claude-skills★ 0100% same
Wrote their own version · 1
- liftli-ai/x-agent-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
We split this skill into the rules it gives an agent
1 rule. About 0 are common, 1 is distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 20
NEVER auto-publish: - Only save to draft
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
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
- macOS:
Critical Rules
- NEVER auto-publish - Only save to draft
- User must be logged in - Prompt to login if not
- 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:
# 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.txtWorkflow
Short Tweet
Step 1: Prepare Content
# Save tweet to temp file
echo "Tweet content" > /tmp/tweet.txt
# Copy to clipboard
python scripts/copy_to_clipboard.py text --file /tmp/tweet.txtStep 2: Open Compose
browser_navigate: https://x.com/compose/postStep 3: Paste Content
browser_snapshot → Find tweet textbox
browser_click: textbox
browser_press_key: Meta+vStep 4: Save Draft
browser_click: X (close button)
browser_click: "Save" or "保存" in dialogStep 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/postStep 3: Add First Tweet
python scripts/copy_to_clipboard.py text "First tweet content"browser_click: textbox
browser_press_key: Meta+vStep 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 dialogStep 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 stepParallel Preparation
✅ Prepare all tweet content before browser operations
✅ Copy to clipboard while navigatingSequential Execution
Navigate → Paste first tweet → Add tweet → Paste → ... → SaveElement 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是真正的游戏规则改变者。"
# 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:
# 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 warningNetwork Error
If page fails to load:
→ Retry once, then report errorIntegration
After publishing:
推文已保存到草稿箱!
- 类型: {short/thread}
- 条数: {n}
- 草稿链接: https://x.com/compose/drafts
请手动审核后发布。Append a machine-readable block for hooks/state ingestion:
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:
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}'Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

