baoyu-danger-x-to-markdown — Claude Code skill: how to install
Converts X posts, threads, and articles into Markdown files with YAML front matter. Useful for archiving social posts and attached media locally.
npx skills add JimLiu/baoyu-skills --skill baoyu-danger-x-to-markdown -a claude-codeWhat baoyu-danger-x-to-markdown does
The skill extracts content from X using a reverse-engineered API and converts it into structured Markdown files. Before executing any conversion, the script requires explicit user consent and writes a verification record to consent.json. This gate exists because unofficial endpoints can break when the platform changes or trigger account restrictions.
Execution requires either bun or npx. The workflow checks for configuration inside EXTEND.md to determine output directories and media handling. It can download images and videos directly into local imgs/ and videos/ folders, updating Markdown asset links to relative local paths.
If you regularly archive long posts to your personal notes, the tool removes manual formatting friction. Anyone who needs official API guarantees should avoid reverse-engineered tools.
What it helps with
- Convert X posts and entire threads into clean Markdown files
- Extract full text and YAML front matter from X articles
- Download post images and videos to local folders
- Rewrite remote media links into local relative paths
Example prompts for the agent
- Save this tweet to markdown with front matter
- Convert the post link into markdown and download media
- Export this X article to a markdown document
How to install baoyu-danger-x-to-markdown
1Skills CLI (Vercel)
npx skills add JimLiu/baoyu-skills --skill baoyu-danger-x-to-markdown -a claude-code2Manually: put the files in place
~/.claude/skills/baoyu-danger-x-to-markdown/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/baoyu-danger-x-to-markdown/
1Skills CLI (Vercel)
npx skills add JimLiu/baoyu-skills --skill baoyu-danger-x-to-markdown -a codex2Manually: put the files in place
.agents/skills/baoyu-danger-x-to-markdown/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add JimLiu/baoyu-skills --skill baoyu-danger-x-to-markdown -a cursor2Manually: put the files in place
.cursor/skills/baoyu-danger-x-to-markdown/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install JimLiu/baoyu-skills baoyu-danger-x-to-markdown2Manually: put the files in place
.github/skills/baoyu-danger-x-to-markdown/SKILL.md1Skills CLI (Vercel)
npx skills add JimLiu/baoyu-skills --skill baoyu-danger-x-to-markdown -a gemini-cli2Platform CLI
gemini skills install https://github.com/JimLiu/baoyu-skills --path skills/baoyu-danger-x-to-markdownManually: put the files in place
.devin/skills/baoyu-danger-x-to-markdown/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add JimLiu/baoyu-skills --skill baoyu-danger-x-to-markdown -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set18
The whole set →Similar
Questions about baoyu-danger-x-to-markdown
How to install baoyu-danger-x-to-markdown in Claude Code?
Run npx skills add JimLiu/baoyu-skills --skill baoyu-danger-x-to-markdown -a claude-code in your terminal.
What does baoyu-danger-x-to-markdown do?
It downloads posts, threads, and articles from X and turns them into Markdown files with YAML headers, optionally saving attached images and videos locally.
What are the prerequisites for baoyu-danger-x-to-markdown?
The skill requires bun or npx installed on your machine. You must also accept the disclaimer regarding the unofficial reverse-engineered API on first run.
Source text
SKILL.md · MIT
---
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
```bash
# 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:
```json
{
"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](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**:
1. CLI arguments (`--download-media`, `-o`)
2. EXTEND.md
3. Skill defaults
## Usage
```bash
${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
```markdown
---
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
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.
© JimLiu · MIT · JimLiu/baoyu-skills