publish-x-article
npx skills add https://github.com/sugarforever/01coder-agent-skills --skill publish-x-article
Agent 安装分布
Skill 文档
Publish X Article
Publish Markdown content to X (Twitter) Articles editor, preserving formatting with rich text conversion. Automatically handles X Premium limitations by converting unsupported elements to images.
Credits
This skill is inspired by and based on wshuyi/x-article-publisher-skill. Thank you to the original author for the foundational work.
Interactive Setup: Ask Subscription Type
IMPORTANT: Before processing the article, ask the user about their X subscription type if not already known.
Prompt the User
Before publishing, I need to know your X subscription type to handle formatting correctly:
1. **X Premium** - Basic tier ($8/month)
2. **X Premium+** - Plus tier ($16/month)
Which subscription do you have? (Premium / Premium+)
For Chinese users:
å¨åå¸ä¹åï¼æéè¦äºè§£æ¨ç X 订é
ç±»å以æ£ç¡®å¤çæ ¼å¼ï¼
1. **X Premium** - åºç¡ç ($8/æ)
2. **X Premium+** - é«çº§ç ($16/æ)
æ¨ä½¿ç¨çæ¯åªä¸ªçæ¬ï¼(Premium / Premium+)
Remember the Answer
Once the user answers, remember their subscription type for the rest of the session. Don’t ask again unless they explicitly want to change it.
X Subscription Feature Comparison
| Feature | X Premium | X Premium+ |
|---|---|---|
H1 headers (#) |
Title only | Title only |
H2 headers (##) |
Yes | Yes |
H3+ headers (###, etc.) |
No | Yes |
| Markdown tables | No | Yes |
| Mermaid diagrams | No | No (not supported by X) |
| Code blocks | Blockquotes | Blockquotes |
| Bold, italic, links | Yes | Yes |
| Lists | Yes | Yes |
| Blockquotes | Yes | Yes |
| Images | Yes | Yes |
Pre-Processing Required by Subscription
X Premium (Basic):
- Convert H3+ headers â H2 or bold
- Convert tables â PNG images
- Convert mermaid â PNG images
X Premium+ (Plus):
- Keep H3+ headers as-is
- Keep tables as-is (rendered natively)
- Convert mermaid â PNG images (still not supported)
Prerequisites
- Playwright MCP for browser automation
- User logged into X with Premium subscription
- Python 3.9+ with dependencies:
- macOS:
pip install Pillow pyobjc-framework-Cocoa markdown - Windows:
pip install Pillow pywin32 clip-util markdown
- macOS:
- For Mermaid diagrams:
npm install -g @mermaid-js/mermaid-cli
Scripts
Located in ~/.claude/skills/publish-x-article/scripts/:
parse_markdown.py
Parse Markdown and extract structured data:
python parse_markdown.py <markdown_file> [--output json|html] [--html-only]
Returns JSON with: title, cover_image, content_images (with block_index for positioning), html, total_blocks
copy_to_clipboard.py
Copy image or HTML to system clipboard:
# Copy image (with optional compression)
python copy_to_clipboard.py image /path/to/image.jpg [--quality 80]
# Copy HTML for rich text paste
python copy_to_clipboard.py html --file /path/to/content.html
table_to_image.py
Convert Markdown tables to PNG images:
python table_to_image.py /path/to/table.md /path/to/output.png [--style dark|light]
Pre-Processing: Handle Unsupported Elements
Before publishing, scan the Markdown for unsupported elements and convert them to images.
Step 0: Analyze Content for Limitations
# Check the markdown file for unsupported elements
cat /path/to/article.md
Look for:
- Deep headers (H3+):
###,####, etc. - Markdown tables: Lines with
|characters forming table structure - Mermaid code blocks:
```mermaid
Converting Unsupported Elements to Images
1. Markdown Tables â PNG
When a table is detected:
# 1. Extract table to temp file
cat > /tmp/table.md << 'TABLE_EOF'
| Column 1 | Column 2 | Column 3 |
|----------|----------|----------|
| Data 1 | Data 2 | Data 3 |
TABLE_EOF
# 2. Convert to image
python ~/.claude/skills/publish-x-article/scripts/table_to_image.py /tmp/table.md /tmp/table-001.png
# 3. Replace table in markdown with image reference
# 
2. Mermaid Diagrams â PNG
When a mermaid block is detected:
# 1. Extract mermaid to temp file
cat > /tmp/diagram.mmd << 'MERMAID_EOF'
flowchart TD
A[Start] --> B[Process]
B --> C[End]
MERMAID_EOF
# 2. Convert to image using mermaid-cli
mmdc -i /tmp/diagram.mmd -o /tmp/diagram-001.png -b white -s 2
# 3. Replace mermaid block in markdown with image reference
# 
3. Deep Headers (H3+) â Simplified Structure
Goal: Preserve the article’s logical structure and readability while working within X Premium’s H2-only limitation.
Guidelines for the AI:
When you encounter H3, H4, or deeper headers in a Premium user’s article, think about what the author intended:
-
If the header introduces a distinct subtopic under a section, convert it to bold text as a paragraph opener. This maintains visual hierarchy without breaking X’s formatting.
-
If the header is a major section that happens to be H3, consider promoting it to H2 â but only if this doesn’t create a flat, meaningless structure. The article should still flow logically.
-
If there’s a deep hierarchy (H2 â H3 â H4), flatten thoughtfully:
- Keep H2 as H2
- Convert H3 to bold paragraph
- Convert H4 to italic or just merge into the paragraph naturally
-
Preserve meaning over structure. A header like
### Why This Mattersmight become a bold lead-in:**Why does this matter?**followed by the content. Use your judgment. -
Read the content. If an H3 header is just “Example” or “Note”, it might work better as a blockquote or inline emphasis rather than a standalone bold line.
The goal is not mechanical conversion â it’s creating an article that reads well on X while honoring the author’s intent.
Pre-Processing Workflow
Before publishing, read through the article and prepare it for X:
-
Understand the article’s structure â Read it first. What are the main sections? How does the author use headers to organize ideas?
-
Handle tables and mermaid diagrams â These need to become images. Extract each one, convert to PNG, and note where they should be inserted.
-
Adapt headers for the subscription tier:
- For Premium+ users: Keep headers as-is (H3+ supported)
- For Premium users: Thoughtfully restructure H3+ headers while preserving the article’s flow and intent (see guidelines above)
-
Create the modified markdown â Save your adapted version to a temp file, ready for parsing.
The goal is an article that reads naturally on X, not a mechanically transformed document.
Main Workflow
Strategy: “å æåå¾ååå²çº¿” (Text First, Images Second, Dividers Last)
For articles with images and dividers, paste ALL text content first, then insert images and dividers at correct positions using block index.
- Pre-process: Convert tables/mermaid to images, flatten deep headers
- Parse modified Markdown with Python script â get title, images, dividers (all with block_index), HTML
- Navigate to X Articles editor
- Upload cover image (first image)
- Fill title
- Copy HTML to clipboard (Python) â Paste with Cmd+V
- Insert content images at positions specified by block_index
- Insert dividers at positions specified by block_index (via Insert > Divider menu)
- Save as draft (NEVER auto-publish)
髿æ§è¡åå (Efficiency Guidelines)
ç®æ : æå°åæä½ä¹é´ççå¾ æ¶é´ï¼å®ç°æµç çèªå¨åä½éªã
1. é¿å ä¸å¿ è¦ç browser_snapshot
大夿°æµè§å¨æä½ï¼click, type, press_key çï¼é½ä¼å¨è¿åç»æä¸å
å«é¡µé¢ç¶æãä¸è¦å¨æ¯æ¬¡æä½ååç¬è°ç¨ browser_snapshotï¼ç´æ¥ä½¿ç¨æä½è¿åç页é¢ç¶æå³å¯ã
â éè¯¯åæ³ï¼
browser_click â browser_snapshot â åæ â browser_click â browser_snapshot â ...
â
æ£ç¡®åæ³ï¼
browser_click â ä»è¿åç»æä¸è·å页é¢ç¶æ â browser_click â ...
2. é¿å ä¸å¿ è¦ç browser_wait_for
åªå¨ä»¥ä¸æ
åµä½¿ç¨ browser_wait_forï¼
- çå¾
å¾çä¸ä¼ 宿ï¼
textGone="æ£å¨ä¸ä¼ åªä½"ï¼ - çå¾ é¡µé¢åå§å è½½ï¼æå°æ°æ åµï¼
ä¸è¦ä½¿ç¨ browser_wait_for æ¥çå¾
æé®æè¾å
¥æ¡åºç° – å®ä»¬å¨é¡µé¢å è½½å®æåç«å³å¯ç¨ã
3. å¹¶è¡æ§è¡ç¬ç«æä½
å½ä¸¤ä¸ªæä½æ²¡æä¾èµå ³ç³»æ¶ï¼å¯ä»¥å¨åä¸ä¸ªæ¶æ¯ä¸å¹¶è¡è°ç¨å¤ä¸ªå·¥å ·ï¼
â
å¯ä»¥å¹¶è¡ï¼
- å¡«åæ é¢ (browser_type) + å¤å¶HTMLå°åªè´´æ¿ (Bash)
- è§£æMarkdownçæJSON + çæHTMLæä»¶
â ä¸è½å¹¶è¡ï¼æä¾èµï¼ï¼
- å¿
é¡»å
ç¹å»createæè½ä¸ä¼ å°é¢å¾
- å¿
é¡»å
ç²è´´å
容æè½æå
¥å¾ç
4. è¿ç»æ§è¡æµè§å¨æä½
æ¯ä¸ªæµè§å¨æä½è¿åç页é¢ç¶æå 嫿æéè¦çå ç´ å¼ç¨ãç´æ¥ä½¿ç¨è¿äºå¼ç¨è¿è¡ä¸ä¸æ¥æä½ï¼
# çæ³æµç¨ï¼æ¯æ¥ç´æ¥æ§è¡ï¼ä¸é¢å¤çå¾
ï¼ï¼
browser_navigate â ä»è¿åç¶ææ¾createæé® â browser_click(create)
â ä»è¿åç¶ææ¾ä¸ä¼ æé® â browser_click(ä¸ä¼ ) â browser_file_upload
â ä»è¿åç¶ææ¾åºç¨æé® â browser_click(åºç¨)
â ä»è¿åç¶ææ¾æ 颿¡ â browser_type(æ é¢)
â ç¹å»ç¼è¾å¨ â browser_press_key(Meta+v)
â ...
5. åå¤å·¥ä½åç½®
å¨å¼å§æµè§å¨æä½ä¹åï¼å 宿ææåå¤å·¥ä½ï¼
- æ«æä¸æ¯æçå ç´ ï¼è¡¨æ ¼ãMermaidãæ·±å±æ é¢ï¼
- 转æ¢è¡¨æ ¼/Mermaid 为å¾ç
- è§£æ Markdown è·å JSON æ°æ®
- çæ HTML æä»¶å° /tmp/
- è®°å½ titleãcover_imageãcontent_images çä¿¡æ¯
è¿æ ·æµè§å¨æä½é¶æ®µå¯ä»¥è¿ç»æ§è¡ï¼ä¸éè¦ä¸éå䏿¥å¤çæ°æ®ã
Step 0: Read and Adapt the Article
First, read the article. Understand what it’s about, how it’s structured, and what the author is trying to communicate.
Preserve the Original
IMPORTANT: Never modify the user’s original file. If adaptations are needed:
- Save the adapted version as a copy (e.g.,
/tmp/article_adapted.mdor alongside the original asarticle_for_x.md) - Tell the user what was changed and where both files are:
I've adapted your article for X Premium. Here's what changed: - Converted 2 tables to images - Restructured 3 H3 headers to bold text for better flow Original preserved: /path/to/article.md Adapted version: /path/to/article_for_x.md - Proceed with the adapted copy for publishing
This ensures the user can review the changes and keeps their original work intact.
Adaptation Based on Subscription
For Premium Users (Basic Tier)
Ask yourself:
- Are there tables? â Convert each to a PNG image
- Are there mermaid diagrams? â Convert each to a PNG image
- Are there H3+ headers? â Restructure them thoughtfully (see header guidelines above)
Create a modified version of the markdown that will work within Premium’s limitations while preserving readability.
For Premium+ Users
Ask yourself:
- Are there mermaid diagrams? â Convert to PNG (still not supported on any tier)
- Tables and H3+ headers can stay as-is
Converting Elements to Images
# Tables â PNG
python ~/.claude/skills/publish-x-article/scripts/table_to_image.py /tmp/table-1.md /tmp/table-1.png
# Mermaid â PNG
mmdc -i /tmp/diagram-1.mmd -o /tmp/diagram-1.png -b white -s 2
Replace these elements in the markdown with image references, positioning them where the original element was.
Step 1: Parse Markdown (Python)
Use parse_markdown.py to extract all structured data:
python ~/.claude/skills/publish-x-article/scripts/parse_markdown.py /path/to/modified_article.md
Output JSON:
{
"title": "Article Title",
"cover_image": "/path/to/first-image.jpg",
"content_images": [
{"path": "/tmp/table-1.png", "block_index": 5, "after_text": "context..."},
{"path": "/tmp/mermaid-1.png", "block_index": 12, "after_text": "another context..."}
],
"dividers": [
{"block_index": 7, "after_text": "context before divider..."},
{"block_index": 15, "after_text": "another context..."}
],
"html": "<p>Content...</p><h2>Section</h2>...",
"total_blocks": 45
}
Key fields:
block_index: The image/divider should be inserted AFTER block element at this index (0-indexed)total_blocks: Total number of block elements in the HTMLafter_text: Kept for reference/debugging only, NOT for positioningdividers: Array of divider positions (markdown---must be inserted via X’s menu, not HTML<hr>)
Save HTML to temp file for clipboard:
python parse_markdown.py modified_article.md --html-only > /tmp/article_html.html
Step 2: Open X Articles Editor
browser_navigate: https://x.com/compose/articles
éè¦: 页é¢å è½½å伿¾ç¤ºè稿å表ï¼ä¸æ¯ç¼è¾å¨ãéè¦ï¼
- çå¾
页é¢å è½½å®æ: 使ç¨
browser_snapshotæ£æ¥é¡µé¢ç¶æ - ç«å³ç¹å» “create” æé®: ä¸è¦çå¾ “æ·»å æ 颔 çç¼è¾å¨å ç´ ï¼å®ä»¬åªæç¹å» create åæåºç°
- çå¾ ç¼è¾å¨å è½½: ç¹å» create åï¼çå¾ ç¼è¾å¨å ç´ åºç°
# 1. 导èªå°é¡µé¢
browser_navigate: https://x.com/compose/articles
# 2. è·å页é¢å¿«ç
§ï¼æ¾å° create æé®
browser_snapshot
# 3. ç¹å» create æé®ï¼é常 ref 类似 "create" æå¸¦æ create æ ç¾ï¼
browser_click: element="create button", ref=<create_button_ref>
# 4. ç°å¨ç¼è¾å¨åºè¯¥æå¼äºï¼å¯ä»¥ç»§ç»ä¸ä¼ å°é¢å¾çæä½
注æ: ä¸è¦ä½¿ç¨ browser_wait_for text="æ·»å æ é¢" æ¥çå¾
页é¢å è½½ï¼å 为è¿ä¸ªææ¬åªæå¨ç¹å» create åæåºç°ï¼ä¼å¯¼è´è¶
æ¶ã
If login needed, prompt user to log in manually.
Step 3: Upload Cover Image
- Click “æ·»å ç §çæè§é¢” button
- Use browser_file_upload with the cover image path (from JSON output)
- Verify image uploaded
Step 4: Fill Title
- Find textbox with “æ·»å æ 颔 placeholder
- Use browser_type to input title (from JSON output)
Step 5: Paste Text Content (Python Clipboard)
Copy HTML to system clipboard using Python, then paste:
# Copy HTML to clipboard
python ~/.claude/skills/publish-x-article/scripts/copy_to_clipboard.py html --file /tmp/article_html.html
Then in browser:
browser_click on editor textbox
browser_press_key: Meta+v
This preserves all rich text formatting (H2, bold, links, lists).
Step 6: Insert Content Images (Block Index Positioning)
å
³é®æ¹è¿: ä½¿ç¨ block_index 精确å®ä½ï¼èéä¾èµæåå¹é
ã
å®ä½åç
ç²è´´ HTML åï¼ç¼è¾å¨ä¸çå
å®¹ç»æä¸ºä¸ç³»ååå
ç´ ï¼æ®µè½ãæ é¢ãå¼ç¨çï¼ãæ¯å¼ å¾çç block_index 表示å®åºè¯¥æå
¥å¨ç¬¬ N 个åå
ç´ ä¹åã
æä½æ¥éª¤
- è·åææåå ç´ : ä½¿ç¨ browser_snapshot è·åç¼è¾å¨å å®¹ï¼æ¾å° textbox ä¸çææåå ç´
- æç´¢å¼å®ä½: æ ¹æ®
block_indexç¹å»å¯¹åºçåå ç´ - ç²è´´å¾ç: å¤å¶å¾çå°åªè´´æ¿åç²è´´
For each content image (from content_images array):
# 1. Copy image to clipboard (with compression)
python ~/.claude/skills/publish-x-article/scripts/copy_to_clipboard.py image /path/to/img.jpg --quality 85
# 2. Click the block element at block_index
# Example: if block_index=5, click the 6th block element (0-indexed)
browser_click on the element at position block_index in the editor
# 3. Paste image
browser_press_key: Meta+v
# 4. Wait for upload (use short time, returns immediately when done)
browser_wait_for textGone="æ£å¨ä¸ä¼ åªä½" time=2
ååæå ¥
注æ: æ¯æå
¥ä¸å¼ å¾çåï¼åç»å¾ççå®é
ä½ç½®ä¼åç§»ã建议æ block_index ä»å¤§å°å°çé¡ºåºæå
¥å¾çã
妿æ3å¼ å¾çï¼block_index åå«ä¸º 5, 12, 27ï¼
- å æå ¥ block_index=27 çå¾ç
- åæå ¥ block_index=12 çå¾ç
- æåæå ¥ block_index=5 çå¾ç
Step 6.5: Insert Dividers (Via Menu)
éè¦: Markdown ä¸ç --- åå²çº¿ä¸è½éè¿ HTML <hr> æ ç¾ç²è´´ï¼X Articles ä¼å¿½ç¥å®ï¼ãå¿
é¡»éè¿ X Articles ç Insert èåæå
¥ã
为ä»ä¹éè¦ç¹æ®å¤ç
X Articles æèªå·±çåçåå²çº¿å
ç´ ï¼åªè½éè¿ Insert > Divider èåæå
¥ãHTML <hr> æ ç¾ä¼è¢«å®å
¨å¿½ç¥ã
æä½æ¥éª¤
For each divider (from dividers array), in reverse order of block_index:
# 1. Click the block element at block_index position
browser_click on the element at position block_index in the editor
# 2. Open Insert menu
browser_click on "Insert" button (Add Media button)
# 3. Click Divider menu item
browser_click on "Divider" menuitem
# Divider is inserted at cursor position
ååæå ¥
åå¾ç䏿 ·ï¼æ block_index ä»å¤§å°å°çé¡ºåºæå
¥åå²çº¿ï¼é¿å
ä½ç½®åç§»é®é¢ã
ä¸å¾ççæå ¥é¡ºåº
å»ºè®®å æå ¥ææå¾çï¼åæå ¥ææåå²çº¿ã两è 齿 block_index ä»å¤§å°å°ç顺åºï¼
- æå ¥ææå¾çï¼ä»æå¤§ block_index å¼å§ï¼
- æå ¥ææåå²çº¿ï¼ä»æå¤§ block_index å¼å§ï¼
Step 7: Save Draft
- Verify content pasted (check word count indicator)
- Draft auto-saves, or click Save button if needed
- Click “é¢è§” to verify formatting
- Report: “Draft saved. Review and publish manually.”
Critical Rules
- NEVER publish – Only save draft
- Pre-process first – Convert tables/mermaid/deep headers before parsing
- First image = cover – Upload first image as cover image
- Rich text conversion – Always convert Markdown to HTML before pasting
- Use clipboard API – Paste via clipboard for proper formatting
- Block index positioning – Use block_index for precise image/divider placement
- Reverse order insertion – Insert images and dividers from highest to lowest block_index
- H1 title handling – H1 is used as title only, not included in body
- Dividers via menu – Markdown
---must be inserted via Insert > Divider menu (HTML<hr>is ignored)
Supported Formatting (After Pre-Processing)
| Element | Support | Notes |
|---|---|---|
H2 (##) |
Native | Section headers |
Bold (**) |
Native | Strong emphasis |
Italic (*) |
Native | Emphasis |
Links ([](url)) |
Native | Hyperlinks |
| Ordered lists | Native | 1. 2. 3. |
| Unordered lists | Native | – bullets |
Blockquotes (>) |
Native | Quoted text |
| Code blocks | Converted | â Blockquotes |
| Tables | Converted | â PNG images |
| Mermaid | Converted | â PNG images |
| H3+ headers | Converted | â H2 or bold |
Dividers (---) |
Menu insert | â Insert > Divider |
Example Flow
User: “Publish /path/to/article.md to X”
# Step 0: Analyze content
# Found: 1 table, 1 mermaid diagram, 2 H3 headers
# Step 0.1: Convert table to image
python ~/.claude/skills/publish-x-article/scripts/table_to_image.py /tmp/table-1.md /tmp/table-1.png
# Step 0.2: Convert mermaid to image
mmdc -i /tmp/mermaid-1.mmd -o /tmp/mermaid-1.png -b white -s 2
# Step 0.3: Create modified markdown with image refs and flattened headers
# Save to /tmp/article_modified.md
# Step 1: Parse modified markdown
python ~/.claude/skills/publish-x-article/scripts/parse_markdown.py /tmp/article_modified.md > /tmp/article.json
python ~/.claude/skills/publish-x-article/scripts/parse_markdown.py /tmp/article_modified.md --html-only > /tmp/article_html.html
- Navigate to https://x.com/compose/articles
- Click create, upload cover image (browser_file_upload for cover only)
- Fill title (from JSON:
title) - Copy & paste HTML:
Then: browser_press_key Meta+vpython ~/.claude/skills/publish-x-article/scripts/copy_to_clipboard.py html --file /tmp/article_html.html - For each content image (including converted table/mermaid PNGs), in reverse order of block_index:
python copy_to_clipboard.py image /path/to/img.jpg --quality 85- Click block element at
block_indexposition - browser_press_key Meta+v
- Wait until upload complete
- Click block element at
- Verify in preview
- “Draft saved. Please review and publish manually.”
Best Practices
为ä»ä¹ç¨ block_index èéæåå¹é ï¼
- 精确å®ä½: ä¸ä¾èµæåå 容ï¼å³ä½¿å¤å¤æåç¸ä¼¼ä¹è½æ£ç¡®å®ä½
- å¯é æ§: ç´¢å¼æ¯ç¡®å®æ§çï¼ä¸ä¼å 为æåç¸ä¼¼èæ··æ·
- è°è¯æ¹ä¾¿:
after_textä»ä¿çç¨äºäººå·¥æ ¸éª
为ä»ä¹ç¨ Python èéæµè§å¨å JavaScriptï¼
- æ¬å°å¤çæ´å¯é : Python ç´æ¥æä½ç³»ç»åªè´´æ¿ï¼ä¸åæµè§å¨æ²çéå¶
- å¾çå缩: ä¸ä¼ åå缩å¾ç (–quality 85)ï¼åå°ä¸ä¼ æ¶é´
- 代ç å¤ç¨: èæ¬åºå®ä¸åï¼æ éæ¯æ¬¡éæ°ç¼å转æ¢é»è¾
- è°è¯æ¹ä¾¿: èæ¬å¯åç¬æµè¯ï¼é®é¢æå®ä½
çå¾ çç¥
å
³é®çè§£: browser_wait_for ç textGone åæ°ä¼å¨æåæ¶å¤±æ¶ç«å³è¿åï¼time åªæ¯æå¤§çå¾
æ¶é´ï¼ä¸æ¯åºå®çå¾
æ¶é´ã
# æ£ç¡®ç¨æ³ï¼ç time å¼ï¼æ¡ä»¶æ»¡è¶³ç«å³è¿å
browser_wait_for textGone="æ£å¨ä¸ä¼ åªä½" time=2
# éè¯¯ç¨æ³ï¼åºå®é¿æ¶é´çå¾
browser_wait_for time=5 # æ æ¡ä»¶çå¾
5ç§ï¼æµªè´¹æ¶é´
å°é¢å¾ vs å 容å¾
- å°é¢å¾: ä½¿ç¨ browser_file_uploadï¼å 为æä¸é¨çä¸ä¼ æé®ï¼
- å 容å¾: ä½¿ç¨ Python åªè´´æ¿ + ç²è´´ï¼æ´é«æï¼
Troubleshooting
Table not rendering correctly
- Ensure Pillow is installed:
pip install pillow - Check table markdown syntax is valid
Mermaid conversion fails
- Install mermaid-cli:
npm install -g @mermaid-js/mermaid-cli - Check mermaid syntax is valid
Deep headers still showing
- Manually flatten
###â##or**bold** - Re-run pre-processing
Image upload timeout
- Compress images with
--quality 70 - Use shorter
browser_wait_for time=2