PluginBench
Skill
Review
Audit score 70

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
Prerequisites
  • 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
Claude Code
Cursor
Windsurf
Cline

How to use baoyu-danger-x-to-markdown

  1. 1.Review and accept the reverse-engineered API disclaimer (checked against consent.json file)
  2. 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. 3.Run the script with a tweet or article URL: `${BUN_X} {baseDir}/scripts/main.ts <url>`
  4. 4.Optionally specify output path with `-o <path>` or enable media download with `--download-media` flag
  5. 5.If media download is set to 'ask', confirm whether to download images/videos after markdown is saved
  6. 6.Access the generated markdown file in the default or specified output directory

Use cases

Good for
  • 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
Who it's for
  • 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

What does 'reverse-engineered API' mean and why do I need to consent?

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.

How is authentication handled?

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.

Can I customize where files are saved and how media is handled?

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.

What URLs does this support?

It supports x.com and twitter.com tweet URLs (https://x.com/<user>/status/<id>) and X Articles (https://x.com/i/article/<id>).

What happens if I decline the disclaimer?

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):

  1. Prefer built-in user-input tools exposed by the current agent runtime — e.g., AskUserQuestion, request_user_input, clarify, ask_user, or any equivalent.
  2. 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.
  3. 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:

  1. {baseDir} = this SKILL.md's directory
  2. Script path = {baseDir}/scripts/main.ts
  3. Resolve ${BUN_X} runtime: if bun installed → bun; if npx available → 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:

PriorityPathScope
1.baoyu-skills/baoyu-danger-x-to-markdown/EXTEND.mdProject
2${XDG_CONFIG_HOME:-$HOME/.config}/baoyu-skills/baoyu-danger-x-to-markdown/EXTEND.mdXDG
3$HOME/.baoyu-skills/baoyu-danger-x-to-markdown/EXTEND.mdUser home
ResultAction
FoundRead, parse, apply settings
Not foundMUST 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

KeyDefaultValuesDescription
download_mediaaskask / 1 / 0ask = prompt each time, 1 = always download, 0 = never
default_output_diremptypath or emptyDefault output directory (empty = ./x-to-markdown/)

Value priority:

  1. CLI arguments (--download-media, -o)
  2. EXTEND.md
  3. 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

OptionDescription
<url>Tweet or article URL
-o <path>Output path
--jsonJSON output
--download-mediaDownload image/video assets to local imgs/ and videos/, and rewrite markdown links to local relative paths
--loginRefresh 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:

SettingBehavior
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

  1. Run script without --download-media → markdown saved
  2. Check saved markdown for remote media URLs (https:// in image/video links)
  3. If no remote media found → done, no prompt needed
  4. 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
  5. If user confirms → run script again with --download-media (overwrites markdown with localized links)

Authentication

  1. Environment variables (preferred): X_AUTH_TOKEN, X_CT0
  2. Chrome login (fallback): Auto-opens Chrome, caches cookies locally

Extension Support

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