- 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
:
Determine this SKILL.md file's directory path as
SKILL_DIR
Script path =
${SKILL_DIR}/scripts/
.ts Replace all ${SKILL_DIR} in this document with the actual path 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) Use Bash to check EXTEND.md existence (priority order):
Check project-level first
test -f .tuzi-skills/tuzi-post-to-x/EXTEND.md && echo "project"
Then user-level (cross-platform: $HOME works on macOS/Linux/WSL)
- test
- -f
- "
- $HOME
- /.tuzi-skills/tuzi-post-to-x/EXTEND.md"
- &&
- echo
- "user"
- ┌──────────────────────────────────────────────────┬───────────────────┐
- │ Path │ Location │
- ├──────────────────────────────────────────────────┼───────────────────┤
- │ .tuzi-skills/tuzi-post-to-x/EXTEND.md │ Project directory │
- ├──────────────────────────────────────────────────┼───────────────────┤
- │ $HOME/.tuzi-skills/tuzi-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.
- npx
- -y
- bun
- ${SKILL_DIR}
- /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
- Ensure
- ~/.local/share/x-browser-profile
- is writable
- Bun runtime
- curl -fsSL https://bun.sh/install | bash
- 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
- Regular Posts
- Text + up to 4 images.
- npx
- -y
- bun
- ${SKILL_DIR}
- /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.
- npx
- -y
- bun
- ${SKILL_DIR}
- /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.
- npx
- -y
- bun
- ${SKILL_DIR}
- /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).
- npx
- -y
- bun
- ${SKILL_DIR}
- /scripts/x-article.ts article.md
- npx
- -y
- bun
- ${SKILL_DIR}
- /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.