baoyu-danger-x-to-markdown
jimliu/baoyu-skills
Convert X (Twitter) tweets and articles to markdown with YAML front matter using reverse-engineered API.
What is baoyu-danger-x-to-markdown?
Converts X/Twitter content—tweets, threads, and articles—into markdown files with YAML front matter metadata. Requires explicit user consent due to use of reverse-engineered API. Use when a user asks to save tweets as markdown, convert X content, or provides x.com/twitter.com URLs.
- Converts tweets and threads to markdown with YAML front matter (URL, author, tweet count, cover image)
- Extracts full X Articles with content preservation
- Downloads images and videos to local directories with rewritten markdown links (optional)
- Supports custom output directories and media handling preferences via EXTEND.md configuration
- Handles authentication via environment variables or Chrome login with cookie caching
- Outputs JSON format as alternative to markdown
How to install baoyu-danger-x-to-markdown
npx skills add https://github.com/jimliu/baoyu-skills --skill baoyu-danger-x-to-markdown- bun or npx installed
- User consent to disclaimer about reverse-engineered API before first use
- X authentication via environment variables (X_AUTH_TOKEN, X_CT0) or Chrome login
How to use baoyu-danger-x-to-markdown
- 1.Review and accept the reverse-engineered API disclaimer (checked against consent.json file)
- 2.Complete first-time setup if EXTEND.md preferences file does not exist—choose media handling (ask each time, always download, or never download) and default output directory
- 3.Run the script with a tweet or article URL: `${BUN_X} {baseDir}/scripts/main.ts <url>`
- 4.Optionally specify output path with `-o <path>` or enable media download with `--download-media` flag
- 5.If media download is set to 'ask', confirm whether to download images/videos after markdown is saved
- 6.Access the generated markdown file in the default or specified output directory
Use cases
- Save a tweet thread as a markdown document for archival or sharing
- Extract an X Article's full content into a local markdown file
- Batch convert multiple tweets with automatic media downloads to local imgs/ and videos/ folders
- Set project-wide or user-wide preferences for media handling and output location
- Refresh authentication cookies when X API access expires
- Content creators archiving tweets and articles
- Researchers collecting X content for analysis
- Developers integrating X content into documentation or knowledge bases
- Anyone needing offline markdown copies of X/Twitter content
baoyu-danger-x-to-markdown FAQ
The skill uses an unofficial X API (not provided by X/Twitter). It may break if X changes their API, offers no guarantees, and could potentially trigger account restrictions. Consent acknowledges these risks.
The skill checks for X_AUTH_TOKEN and X_CT0 environment variables first. If not set, it auto-opens Chrome to log in and caches cookies locally for future use. Use --login flag to refresh cookies.
Yes. On first use, you'll be asked to set preferences (media handling and output directory), which are saved to EXTEND.md. You can also override with CLI flags like -o and --download-media, or edit EXTEND.md directly.
It supports x.com and twitter.com tweet URLs (https://x.com/<user>/status/<id>) and X Articles (https://x.com/i/article/<id>).
The skill exits immediately and does not perform any conversion. You can run it again later to re-accept.
Full instructions (SKILL.md)
Source of truth, from jimliu/baoyu-skills.
name: baoyu-danger-x-to-markdown description: Converts X (Twitter) tweets and articles to markdown with YAML front matter. Uses reverse-engineered API requiring user consent. Use when user mentions "X to markdown", "tweet to markdown", "save tweet", or provides x.com/twitter.com URLs for conversion. version: 1.117.3 metadata: openclaw: homepage: https://github.com/JimLiu/baoyu-skills#baoyu-danger-x-to-markdown requires: anyBins: - bun - npx
X to Markdown
Converts X content to markdown:
- Tweets/threads → Markdown with YAML front matter
- X Articles → Full content extraction
User Input Tools
When this skill prompts the user, follow this tool-selection rule (priority order):
- Prefer built-in user-input tools exposed by the current agent runtime — e.g.,
AskUserQuestion,request_user_input,clarify,ask_user, or any equivalent. - Fallback: if no such tool exists, emit a numbered plain-text message and ask the user to reply with the chosen number/answer for each question.
- Batching: if the tool supports multiple questions per call, combine all applicable questions into a single call; if only single-question, ask them one at a time in priority order.
Concrete AskUserQuestion references below are examples — substitute the local equivalent in other runtimes.
Script Directory
Scripts located in scripts/ subdirectory.
Path Resolution:
{baseDir}= this SKILL.md's directory- Script path =
{baseDir}/scripts/main.ts - Resolve
${BUN_X}runtime: ifbuninstalled →bun; ifnpxavailable →npx -y bun; else suggest installing bun
Consent Requirement
Before any conversion, check and obtain consent.
Consent Flow
Step 1: Check consent file
# macOS
cat ~/Library/Application\ Support/baoyu-skills/x-to-markdown/consent.json
# Linux
cat ~/.local/share/baoyu-skills/x-to-markdown/consent.json
Step 2: If accepted: true and disclaimerVersion: "1.0" → print warning and proceed:
Warning: Using reverse-engineered X API. Accepted on: <acceptedAt>
Step 3: If missing or version mismatch → display disclaimer:
DISCLAIMER
This tool uses a reverse-engineered X API, NOT official.
Risks:
- May break if X changes API
- No guarantees or support
- Possible account restrictions
- Use at your own risk
Accept terms and continue?
Use AskUserQuestion with options: "Yes, I accept" | "No, I decline"
Step 4: On accept → create consent file:
{
"version": 1,
"accepted": true,
"acceptedAt": "<ISO timestamp>",
"disclaimerVersion": "1.0"
}
Step 5: On decline → output "User declined. Exiting." and stop.
Preferences (EXTEND.md)
Check EXTEND.md in priority order — the first one found wins:
| Priority | Path | Scope |
|---|---|---|
| 1 | .baoyu-skills/baoyu-danger-x-to-markdown/EXTEND.md | Project |
| 2 | ${XDG_CONFIG_HOME:-$HOME/.config}/baoyu-skills/baoyu-danger-x-to-markdown/EXTEND.md | XDG |
| 3 | $HOME/.baoyu-skills/baoyu-danger-x-to-markdown/EXTEND.md | User home |
| Result | Action |
|---|---|
| Found | Read, parse, apply settings |
| Not found | MUST run first-time setup (see below) — do NOT silently create defaults |
EXTEND.md supports: Download media by default, default output directory.
First-Time Setup (BLOCKING)
CRITICAL: When EXTEND.md is not found, you MUST use AskUserQuestion to ask the user for their preferences before creating EXTEND.md. NEVER create EXTEND.md with defaults without asking. This is a BLOCKING operation — do NOT proceed with any conversion until setup is complete.
Use AskUserQuestion with ALL questions in ONE call:
Question 1 — header: "Media", question: "How to handle images and videos in tweets?"
- "Ask each time (Recommended)" — After saving markdown, ask whether to download media
- "Always download" — Always download media to local imgs/ and videos/ directories
- "Never download" — Keep original remote URLs in markdown
Question 2 — header: "Output", question: "Default output directory?"
- "x-to-markdown (Recommended)" — Save to ./x-to-markdown/{username}/{tweet-id}.md
- (User may choose "Other" to type a custom path)
Question 3 — header: "Save", question: "Where to save preferences?"
- "User (Recommended)" — ~/.baoyu-skills/ (all projects)
- "Project" — .baoyu-skills/ (this project only)
After user answers, create EXTEND.md at the chosen location, confirm "Preferences saved to [path]", then continue.
Full reference: references/config/first-time-setup.md
Supported Keys
| Key | Default | Values | Description |
|---|---|---|---|
download_media | ask | ask / 1 / 0 | ask = prompt each time, 1 = always download, 0 = never |
default_output_dir | empty | path or empty | Default output directory (empty = ./x-to-markdown/) |
Value priority:
- CLI arguments (
--download-media,-o) - EXTEND.md
- Skill defaults
Usage
${BUN_X} {baseDir}/scripts/main.ts <url>
${BUN_X} {baseDir}/scripts/main.ts <url> -o output.md
${BUN_X} {baseDir}/scripts/main.ts <url> --download-media
${BUN_X} {baseDir}/scripts/main.ts <url> --json
Options
| Option | Description |
|---|---|
<url> | Tweet or article URL |
-o <path> | Output path |
--json | JSON output |
--download-media | Download image/video assets to local imgs/ and videos/, and rewrite markdown links to local relative paths |
--login | Refresh cookies only |
Supported URLs
https://x.com/<user>/status/<id>https://twitter.com/<user>/status/<id>https://x.com/i/article/<id>
Output
---
url: "https://x.com/user/status/123"
author: "Name (@user)"
tweetCount: 3
coverImage: "https://pbs.twimg.com/media/example.jpg"
---
Content...
File structure: x-to-markdown/{username}/{tweet-id}/{content-slug}.md
When --download-media is enabled:
- Images are saved to
imgs/next to the markdown file - Videos are saved to
videos/next to the markdown file - Markdown media links are rewritten to local relative paths
Media Download Workflow
Based on download_media setting in EXTEND.md:
| Setting | Behavior |
|---|---|
1 (always) | Run script with --download-media flag |
0 (never) | Run script without --download-media flag |
ask (default) | Follow the ask-each-time flow below |
Ask-Each-Time Flow
- Run script without
--download-media→ markdown saved - Check saved markdown for remote media URLs (
https://in image/video links) - If no remote media found → done, no prompt needed
- If remote media found → use
AskUserQuestion:- header: "Media", question: "Download N images/videos to local files?"
- "Yes" — Download to local directories
- "No" — Keep remote URLs
- If user confirms → run script again with
--download-media(overwrites markdown with localized links)
Authentication
- Environment variables (preferred):
X_AUTH_TOKEN,X_CT0 - Chrome login (fallback): Auto-opens Chrome, caches cookies locally
Extension Support
Custom configurations via EXTEND.md. See Preferences section for paths and supported options.
Related skills
More from jimliu/baoyu-skills and the wider catalog.
baoyu-post-to-wechat
Post articles and image-text content to WeChat Official Accounts via API or browser automation.
baoyu-image-gen
Multi-provider AI image generation with text-to-image, reference images, batch processing, and aspect ratio control.
baoyu-markdown-to-html
Convert Markdown to styled HTML with WeChat-compatible themes, code highlighting, math, and Mermaid diagrams.
baoyu-infographic
Generate professional infographics with 21 layouts and 22 styles—analyze content and produce publication-ready visuals.
baoyu-cover-image
Generate customizable article cover images with 5 dimensions, 11 color palettes, and 7 rendering styles.
baoyu-article-illustrator
Analyze articles and generate illustrated images with consistent Type × Style × Palette approach.