
The baoyu-url-to-markdown skill fetches URLs and converts them to markdown using Chrome DevTools Protocol with site-specific adapters for platforms like X/Twitter, YouTube, and Hacker News, plus a generic fallback adapter. It's built for developers and content creators who need to save webpages as markdown files, handling authentication and CAPTCHAs through interactive wait modes. The skill solves the problem of extracting and reformatting web content into a portable markdown format without manual copying.
$ npx -y skills add jimliu/baoyu-skills --skill baoyu-url-to-markdown --agent claude-codeInstalls into .claude/skills of the current project.
When this skill prompts the user, follow this tool-selection rule (priority order):
AskUserQuestion, request_user_input, clarify, ask_user, or any equivalent.Concrete AskUserQuestion references below are examples — substitute the local equivalent in other runtimes.
The CLI source is vendored in {baseDir}/scripts/lib; scripts/package.json installs only third-party runtime dependencies.
{baseDir} = this SKILL.md's directory${BUN} = bun if installed; otherwise suggest installing Bun{baseDir}/scripts/node_modules is missing: ${BUN} install --cwd {baseDir}/scripts${READER} = {baseDir}/scripts/baoyu-fetch (substitute everywhere below)First one found wins:
| Priority | Path | Scope |
|---|---|---|
| 1 | .baoyu-skills/baoyu-url-to-markdown/EXTEND.md | Project |
| 2 | ${XDG_CONFIG_HOME:-$HOME/.config}/baoyu-skills/baoyu-url-to-markdown/EXTEND.md | XDG |
| 3 | $HOME/.baoyu-skills/baoyu-url-to-markdown/EXTEND.md | User home |
Found → read and apply. Not found → BLOCKING first-time setup: ask the questions in references/config/first-time-setup.md (Media, Output, Save — all in one call) before any conversion, write EXTEND.md, confirm "Preferences saved to [path]", then continue. Never create EXTEND.md with silent defaults.
| Key | Default | Values | CLI mapping |
|---|---|---|---|
download_media | ask | ask (prompt each time) / 1 (always) / 0 (never) | 1 → --download-media (requires --output) |
default_output_dir | empty (= ./url-to-markdown/) | path or empty | Agent builds --output <dir>/{domain}/{slug}.md; not a direct flag |
Value priority: CLI arguments → EXTEND.md → skill defaults.
${READER} <url> # headless, markdown to stdout
${READER} <url> --output article.md --download-media # save with local media
${READER} <url> --wait-for interaction --output a.md # login/CAPTCHA: auto-detect and continue
${READER} <url> --wait-for force --output a.md # manual: Enter to continue
${READER} <url> --format json --output a.json
${READER} <url> --adapter youtube --output transcript.md
| Option | Description |
|---|---|
<url> | URL to fetch |
--output <path> | Output file path (default: stdout) |
--format <type> | markdown (default) or json |
--json | Shorthand for --format json |
--adapter <name> | Force adapter: x, youtube, hn, or generic (default: auto-detect) |
--headless | Force headless Chrome |
--wait-for <mode> | none (default), interaction, or force |
--wait-for-interaction | Alias for --wait-for interaction |
--wait-for-login | Alias for --wait-for interaction |
--timeout <ms> | Page load timeout (default: 30000) |
--interaction-timeout <ms> | Login/CAPTCHA wait timeout (default: 600000 = 10 min) |
--interaction-poll-interval <ms> | Interaction poll interval (default: 1500) |
--download-media | Download images/videos to local imgs/ and videos/, rewrite links. Requires --output |
--media-dir <dir> | Base directory for downloaded media (default: --output directory) |
--cdp-url <url> | Reuse existing Chrome DevTools Protocol endpoint |
--browser-path <path> | Custom Chrome/Chromium binary path |
--chrome-profile-dir <path> | Chrome user data directory (default: BAOYU_CHROME_PROFILE_DIR env or ./baoyu-skills/chrome-profile) |
--debug-dir <dir> | Write debug artifacts (document.json, markdown.md, page.html, network.json) |
Headless capture is provisional: some sites silently return low-quality content with exit code 0. Inspect the saved markdown after every headless run, using references/quality-gate.md for the checklist, recovery steps, and capture modes.
baoyu-fetch does not generate paths; the agent builds one and passes it to --output:
default_output_dir or ./url-to-markdown/example.com){base_dir}/{domain}/{slug}/{slug}.md — one directory per URL so media stays isolated{slug}-YYYYMMDD-HHMMSS/{slug}-YYYYMMDD-HHMMSS.mdDownloaded media goes into subdirectories next to the markdown file.
references/adapters.md: adapter catalog (X, YouTube, Hacker News, generic), media download flow (ask / always / never), JSON output schema. Read it for adapter-specific questions or media prompts.
| Variable | Description |
|---|---|
BAOYU_CHROME_PROFILE_DIR | Chrome user data directory (or --chrome-profile-dir) |
Troubleshooting: Chrome not found → --browser-path. Timeout → raise --timeout. Login/CAPTCHA → --wait-for interaction. Debug → --debug-dir to inspect captured HTML and network logs.
Custom configurations via EXTEND.md — see Preferences above.
Sponsors