🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

Post to X Enhanced

by @praguepp

Posts content and articles to X (Twitter). Custom fork with image upload fix: DOM.setFileInputFiles first, path leak cleanup, post-publish verification. Use...

TERMINAL
clawhub install baoyu-post-to-x-enhanced

πŸ“– About This Skill


name: baoyu-post-to-x-enhanced description: "Posts content and articles to X (Twitter). Custom fork with image upload fix: DOM.setFileInputFiles first, path leak cleanup, post-publish verification. Use when user asks to 'post to X', 'tweet', 'publish to Twitter', or 'share on X'." version: 3.0.0 metadata: openclaw: homepage: https://github.com/JimLiu/baoyu-skills#baoyu-post-to-x requires: anyBins: - bun - npx

Post to X (Twitter)

Posts text, images, videos, and long-form articles to X via real Chrome browser (bypasses anti-bot detection).

Script Directory

Important: All scripts are located in the scripts/ subdirectory of this skill.

Agent Execution Instructions: 1. Determine this SKILL.md file's directory path as {baseDir} 2. Script path = {baseDir}/scripts/.ts 3. Replace all {baseDir} in this document with the actual path 4. Resolve ${BUN_X} runtime: if bun installed β†’ bun; if npx available β†’ npx -y bun; else suggest installing bun

Script Reference: | Script | Purpose | |--------|---------| | scripts/x-browser.ts | Regular posts (text + images) | | scripts/x-video.ts | Video posts (text + video) | | scripts/x-quote.ts | Quote tweet with comment | | scripts/x-article.ts | Long-form article publishing (Markdown) | | scripts/md-to-html.ts | Markdown β†’ HTML conversion | | scripts/copy-to-clipboard.ts | Copy content to clipboard | | scripts/paste-from-clipboard.ts | Send real paste keystroke | | scripts/check-paste-permissions.ts | Verify environment & permissions |

Preferences (EXTEND.md)

Check EXTEND.md existence (priority order):

# macOS, Linux, WSL, Git Bash
test -f .baoyu-skills/baoyu-post-to-x/EXTEND.md && echo "project"
test -f "${XDG_CONFIG_HOME:-$HOME/.config}/baoyu-skills/baoyu-post-to-x/EXTEND.md" && echo "xdg"
test -f "$HOME/.baoyu-skills/baoyu-post-to-x/EXTEND.md" && echo "user"

# PowerShell (Windows)
if (Test-Path .baoyu-skills/baoyu-post-to-x/EXTEND.md) { "project" }
$xdg = if ($env:XDG_CONFIG_HOME) { $env:XDG_CONFIG_HOME } else { "$HOME/.config" }
if (Test-Path "$xdg/baoyu-skills/baoyu-post-to-x/EXTEND.md") { "xdg" }
if (Test-Path "$HOME/.baoyu-skills/baoyu-post-to-x/EXTEND.md") { "user" }

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Path β”‚ Location β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ .baoyu-skills/baoyu-post-to-x/EXTEND.md β”‚ Project directory β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ $HOME/.baoyu-skills/baoyu-post-to-x/EXTEND.md β”‚ User home β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Result β”‚ Action β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ Found β”‚ Read, parse, apply settings β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ Not found β”‚ Use defaults β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

EXTEND.md Supports: Default Chrome profile

Prerequisites

  • Google Chrome or Chromium
  • bun runtime
  • First run: log in to X manually (session saved)
  • Pre-flight Check (Optional)

    Before first use, suggest running the environment check. User can skip if they prefer.

    ${BUN_X} {baseDir}/scripts/check-paste-permissions.ts
    

    Checks: Chrome, profile isolation, Bun, Accessibility, clipboard, paste keystroke, Chrome conflicts.

    If any check fails, provide fix guidance per item:

    | Check | Fix | |-------|-----| | Chrome | Install Chrome or set X_BROWSER_CHROME_PATH env var | | Profile dir | Shared profile at baoyu-skills/chrome-profile (see CLAUDE.md Chrome Profile section) | | Bun runtime | brew install oven-sh/bun/bun (macOS) or npm install -g bun | | Accessibility (macOS) | System Settings β†’ Privacy & Security β†’ Accessibility β†’ enable terminal app | | Clipboard copy | Ensure Swift/AppKit available (macOS Xcode CLI tools: xcode-select --install) | | Paste keystroke (macOS) | Same as Accessibility fix above | | Paste keystroke (Linux) | Install xdotool (X11) or ydotool (Wayland) |

    References

  • Regular Posts: See references/regular-posts.md for manual workflow, troubleshooting, and technical details
  • X Articles: See references/articles.md for long-form article publishing guide

  • Post Type Selection

    Unless the user explicitly specifies the post type:

  • Plain text + within 10,000 characters β†’ Regular Post (Premium members support up to 10,000 characters, non-Premium: 280)
  • Markdown file (.md) β†’ X Article
  • Regular Posts

    ${BUN_X} {baseDir}/scripts/x-browser.ts "Hello!" --image ./photo.png
    

    Parameters: | Parameter | Description | |-----------|-------------| | | Post content (positional) | | --image | Image file (repeatable, max 4) | | --profile

    | Custom Chrome profile |

    Note: Script opens browser with content filled in. User reviews and publishes manually.


    Video Posts

    Text + video file.

    ${BUN_X} {baseDir}/scripts/x-video.ts "Check this out!" --video ./clip.mp4
    

    Parameters: | Parameter | Description | |-----------|-------------| | | Post content (positional) | | --video | Video file (MP4, MOV, WebM) | | --profile

    | Custom Chrome profile |

    Note: Script opens browser with content filled in. User reviews and publishes manually.

    Limits: Regular 140s max, Premium 60min. Processing: 30-60s.


    Quote Tweets

    Quote an existing tweet with comment.

    ${BUN_X} {baseDir}/scripts/x-quote.ts https://x.com/user/status/123 "Great insight!"
    

    Parameters: | Parameter | Description | |-----------|-------------| | | URL to quote (positional) | | | Comment text (positional, optional) | | --profile

    | Custom Chrome profile |

    Note: Script opens browser with content filled in. User reviews and publishes manually.


    X Articles

    Long-form Markdown articles (requires X Premium).

    ${BUN_X} {baseDir}/scripts/x-article.ts article.md
    ${BUN_X} {baseDir}/scripts/x-article.ts article.md --cover ./cover.jpg
    

    Parameters: | Parameter | Description | |-----------|-------------| | | Markdown file (positional) | | --cover | Cover image | | --title | Override title |

    Frontmatter: title, cover_image supported in YAML front matter.

    Note: Script opens browser with article filled in. User reviews and publishes manually.

    Post-Composition Check: The script automatically verifies after all images are inserted:

  • Remaining XIMGPH_ placeholders in editor content
  • Expected vs actual image count
  • If the check fails (warnings in output), alert the user with the specific issues before they publish.


    Troubleshooting

    Chrome debug port not ready

    If a script fails with Chrome debug port not ready or Unable to connect, kill existing Chrome CDP instances first, then retry:

    pkill -f "Chrome.*remote-debugging-port" 2>/dev/null; pkill -f "Chromium.*remote-debugging-port" 2>/dev/null; sleep 2
    

    Important: This should be done automatically β€” when encountering this error, kill Chrome CDP instances and retry the command without asking the user.

    Notes

  • First run: manual login required (session persists)
  • All scripts only fill content into the browser, user must review and publish manually
  • Cross-platform: macOS, Linux, Windows
  • Extension Support

    Custom configurations via EXTEND.md. See Preferences section for paths and supported options.

    βš™οΈ Configuration

  • Google Chrome or Chromium
  • bun runtime
  • First run: log in to X manually (session saved)
  • πŸ“‹ Tips & Best Practices

  • First run: manual login required (session persists)
  • All scripts only fill content into the browser, user must review and publish manually
  • Cross-platform: macOS, Linux, Windows