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.
git clone https://github.com/JimLiu/baoyu-skills.git--- 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.
[{"step":"Provide the X (Twitter) URL or tweet ID in your prompt. Include any specific formatting preferences (e.g., 'include media attachments' or 'format as a thread').","action":"Paste the prompt into your AI tool (e.g., Claude or ChatGPT) with the URL or ID. Example: 'Convert https://x.com/dr_sarah_chen/status/1724567890123456789 to markdown with YAML front matter.'"},{"step":"If the AI tool requires user consent for the reverse-engineered API, follow the prompts to grant access. This is typically a one-time setup.","action":"Look for a pop-up or message in your AI tool asking for consent to access X's data. Approve if you trust the tool and the source."},{"step":"Review the converted markdown output. Verify that all metadata (author, date, engagement metrics) and content (text, media, threads) are accurately captured.","action":"Check the YAML front matter for correctness and ensure the markdown body matches the original tweet/thread. Edit manually if needed."},{"step":"Save the markdown file locally or export it to your preferred note-taking or documentation tool (e.g., Obsidian, Notion, or GitHub).","action":"Use your tool's export or save feature to store the markdown file. For threads, consider splitting into separate files per tweet if the thread is long."},{"step":"For recurring use, create a shortcut or automation (e.g., a browser extension or script) to streamline the process.","action":"Set up a tool like Zapier or a custom script to automatically convert X URLs to markdown when pasted into your AI tool or note-taking app."}]
No install command available. Check the GitHub repository for manual installation instructions.
git clone https://github.com/JimLiu/baoyu-skills/tree/main/skills/baoyu-danger-x-to-markdownCopy the install command above and run it in your terminal.
Launch Claude Code, Cursor, or your preferred AI coding agent.
Use the prompt template or examples below to test the skill.
Adapt the skill to your specific use case and workflow.
Convert the X (Twitter) content at [X_URL] to markdown format with YAML front matter. Include the original tweet text, author details, engagement metrics (likes, retweets, replies), timestamp, and media attachments if present. Format the output as a clean markdown document with proper headers and code blocks for code snippets. If the content is a thread, combine all tweets into a single markdown document with clear separators.
```yaml --- title: "AI Ethics: A Balanced Perspective" author: "Dr. Sarah Chen (@dr_sarah_chen) date: 2023-11-15T14:32:00Z url: https://x.com/dr_sarah_chen/status/1724567890123456789 likes: 1,247 retweets: 432 replies: 89 --- # AI Ethics: A Balanced Perspective *By Dr. Sarah Chen (@dr_sarah_chen)* > **🧵 Thread: Navigating the AI Ethics Landscape** The debate around AI ethics often feels like a pendulum swinging between utopian visions and dystopian fears. But what if the truth lies somewhere in the middle? 1/5 **The Core Challenge:** AI systems reflect the biases of their creators and training data. This isn't just a technical issue—it's a societal one. We need diverse teams building these systems. ![Image: A graph showing bias in AI models across different demographic groups] 2/5 **Regulation vs. Innovation:** The EU's AI Act is a step in the right direction, but over-regulation could stifle innovation. We need frameworks that are flexible enough to adapt as AI evolves. 3/5 **Transparency Matters:** Users should know when they're interacting with AI. Full disclosure builds trust. Partial disclosure erodes it. 4/5 **Accountability is Key:** When AI makes a harmful decision, who's responsible? The developer? The company? The user? We need clear accountability chains. 5/5 **The Human Element:** AI should augment human decision-making, not replace it. The goal isn't to create AI that thinks like humans, but to create AI that helps humans think better. **Final Thought:** Ethical AI isn't about perfection—it's about continuous improvement. We'll make mistakes. The question is: will we learn from them? #AI #Ethics #MachineLearning #FutureOfWork --- *Converted from X (Twitter) using baoyu-danger-x-to-markdown* ```
skills-collection
Take a free 3-minute scan and get personalized AI skill recommendations.
Take free scan