Catalog
jimliu/baoyu-danger-x-to-markdown

jimliu

baoyu-danger-x-to-markdown

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.

global
New~1.8k
v1.0Saved Jul 12, 2026

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

Before any conversion, check and obtain consent.

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:

  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

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

  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.

Files20
20 files · 124.1 KB

Select a file to preview

Overall Score

72/100

Grade

B

Good

Safety

68

Quality

82

Clarity

78

Completeness

68

Summary

This skill converts X (Twitter) tweets and articles to markdown with YAML front matter by using a reverse-engineered X API. It handles user consent, cookie-based authentication, and optional media downloading. The skill is feature-rich but has substantial credential access via environment variables and .env file handling, along with outbound network requests to Twitter's infrastructure.

Static Analysis Findings

1 finding

Patterns detected by deterministic static analysis before AI scoring. Hover over any finding code for detailed information and remediation guidance.

Credential Exposure
SEC-020Direct .env File Access19x in 4 files

Direct .env file access

scripts/graphql.ts.env6x
scripts/paths.ts.env7x
scripts/cookies.ts.env4x

Detected Capabilities

file readfile writeenvironment variable accessnetwork requests (HTTP/fetch)shell execution (via bun/npx)subprocess execution (Chrome launch)user interaction promptsJSON parsing and generationfilesystem directory operationsmedia file download

Trigger Keywords

Phrases that MCP clients use to match this skill to user intent.

convert tweet to markdownsave tweet as markdownextract x articletwitter to markdowndownload tweet threadx.com conversiontweet backup

Risk Signals

WARNING

Environment variable access for credentials (X_AUTH_TOKEN, X_CT0, X_USER_AGENT, X_BEARER_TOKEN)

scripts/cookies.ts, scripts/graphql.ts, scripts/constants.ts, scripts/paths.ts
WARNING

Direct .env file access via process.env throughout scripts

scripts/graphql.ts:32-33, scripts/paths.ts:17-18, scripts/cookies.ts, scripts/http.ts
WARNING

Hardcoded bearer token default (SEC-021)

scripts/constants.ts:3-5
INFO

Chrome DevTools Protocol connection and automation

scripts/cookies.ts:46-120
INFO

Outbound network requests to X API endpoints (x.com, abs.twimg.com, video.twimg.com, pbs.twimg.com)

scripts/graphql.ts, scripts/http.ts, scripts/media-localizer.ts
INFO

File downloads from external sources (Twitter media URLs)

scripts/media-localizer.ts:140-200
INFO

User consent tracking via consent.json with disclaimer

scripts/main.ts:65-120

Referenced Domains

External domains referenced in skill content, detected by static analysis.

${url.display_url}abs.twimg.comgithub.compbs.twimg.comtwitter.comvideo.twimg.comx.com

Use Cases

  • Convert tweet threads to markdown files with metadata
  • Extract full X article content to markdown
  • Download and embed tweet images and videos locally
  • Refresh X authentication cookies via Chrome DevTools Protocol
  • Save converted content to customizable directory structures

Quality Notes

  • Skill provides excellent documentation with clear consent flow and blocking setup requirements
  • Comprehensive error handling with informative error messages throughout
  • Well-structured code with helper functions for URL parsing, validation, and path resolution
  • First-time setup is blocking and interactive, preventing silent defaults — good UX pattern
  • Media handling logic is sophisticated with fallback detection and mime-type resolution
  • Cookie management has multiple fallback sources (env vars, file, Chrome CDP)
  • Environment variable access is broadly used but documented and mostly for legitimate API config
  • Markdown rendering is feature-complete with support for various block types, media, and embedded tweets
  • Tests provided for article markdown rendering with edge cases
  • Preferences system (EXTEND.md) is well-designed with priority resolution
  • User-input tool pattern is documented but implementation depends on runtime
Model: claude-haiku-4-5-20251001Analyzed: Jul 12, 2026

Reviews

Add this skill to your library to leave a review.

No reviews yet

Be the first to share your experience.

Use jimliu/baoyu-danger-x-to-markdown in your dev environment

Command Palette

Search for a command to run...

jimliu/baoyu-danger-x-to-markdown | SkillRepo