skills/shared/confluence-to-md/SKILL.md
Convert Confluence pages to clean GitHub-Flavored Markdown files. Use this skill whenever the user wants to pull a Confluence page into the local repo, convert Confluence content to markdown, download a spec from Confluence, or batch-convert multiple pages. Also triggers on Confluence URLs, page IDs, or phrases like "pull this page", "download this spec", "confluence to md". Use this even if the user just pastes a Confluence URL and says something vague like "get this" or "convert this".
npx skillsauth add qa-aman/claude-skills confluence-to-mdInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Pull Confluence pages into the local repo as clean markdown. The bundled script handles all the messy Confluence storage format edge cases (user mentions, complex tables, images, status badges) so you don't have to. Zero LLM tokens spent on the actual conversion.
# Single page
python3 .claude/skills/confluence-to-md/scripts/confluence-to-md.py <page_id> <output_path>
# Batch (write a Python loop - don't run CLI commands one by one)
python3 scripts/batch-convert.py
The script auto-loads credentials from .env at the project root.
Extract from the Confluence URL - it's the number in the path:
https://[your-instance].atlassian.net/wiki/spaces/[SPACE]/pages/1234567890/Page+Title
^^^^^^^^^^ this
If the user gives a title instead of URL, search via API:
curl -s -u "$CONFLUENCE_EMAIL:$CONFLUENCE_TOKEN" \
"$CONFLUENCE_BASE_URL/wiki/rest/api/content?spaceKey=[SPACE]&title=$(python3 -c 'import urllib.parse; print(urllib.parse.quote("Page Title"))')"
Follow your project's naming conventions. A common pattern:
| Content type | Path pattern |
|---|---|
| Feature specs | outputs/features/NNN-feature-name/feature-name.md |
| Knowledge docs | inputs/knowledge/slugified-title.md |
| Cross-functional | outputs/cross-functional/doc-name.md |
Folder naming - strip from Confluence titles:
[Author Name] SPEC | Feature -> featureSPEC |, PRD |, DOC | -> removePhase 2 | Product Overview -> use product namepython3 .claude/skills/confluence-to-md/scripts/confluence-to-md.py 1234567890 outputs/features/001-my-feature/my-feature.md
<a> tags with data-* attributes (embedded media) - replace with markdown linksimages/ subfolder automatically)Write a Python driver script for multiple pages:
import subprocess
pages = {
"1234567890": "outputs/000-topic-a/topic-a.md",
"9876543210": "outputs/001-topic-b/topic-b.md",
}
for page_id, output_path in pages.items():
subprocess.run(["python3", ".claude/skills/confluence-to-md/scripts/confluence-to-md.py", page_id, output_path], check=True)
For overview pages, don't convert - parse programmatically:
body.storage)<ac:link> tags with regexThe script automatically resolves these Confluence storage format quirks:
<time datetime="..."/> self-closing tags<ri:user> mentions (resolves display names via API, cached)<ac:link> without URLs (resolves from body.view)numberingColumn, colgroup, highlights[Yes]/[No] text<ac:image> attachments (downloaded to images/, handles CDN 302 redirects)Snapshot auto-save — after every successful pull, the script saves a copy
to .local/confluence-snapshots/<page_id>.md (auto-creates the folder). This
baseline is the "last known sync" — every new pull overwrites it.
Whenever you later push changes back to the same Confluence page, run the preflight FIRST to detect whether anyone edited that page on Confluence since your last pull. Without this check, you can silently overwrite other people's edits — a real-world incident that motivated this safeguard.
The preflight script lives inside this skill's scripts/ folder (and also
inside md-to-confluence/scripts/ — both copies work identically):
python3 .claude/skills/confluence-to-md/scripts/confluence-preflight.py <page_id> <local.md>
# OR equivalently:
python3 .claude/skills/md-to-confluence/scripts/confluence-preflight.py <page_id> <local.md>
Exit codes:
Use --show-diff to see full diffs, --force only if you deliberately want
to overwrite.
If something looks wrong in the output, read references/storage-format-gotchas.md for the full
list of 12 known issues and their fixes.
Scripts live INSIDE the skill folder, NOT in a shared .claude/scripts/ folder:
.claude/skills/confluence-to-md/scripts/confluence-to-md.py~/.claude/skills/confluence-to-md/scripts/confluence-to-md.pyNEVER use symlinks — always copy actual Python files. Symlinks break when the target moves.
Keep both locations in sync when modifying the script.
After conversion, automatically verify:
<ac: tags — grep output for <ac: to catch unconverted Confluence macrosimages/ folder exists, verify every  ref has a matching file# Title should be > Source: [Confluence](...)brew install pandoc).env with: CONFLUENCE_EMAIL, CONFLUENCE_TOKEN, CONFLUENCE_BASE_URLdevelopment
Plan a webinar end-to-end using April Dunford's Obviously Awesome positioning framework to find the topic angle that makes the webinar obviously valuable to the right audience. Produces topic positioning, abstract, speaker brief, registration page, promotion sequence, day-of run-of-show, and post-webinar follow-up. Use when the user asks to plan a webinar, virtual event, online workshop, "we need a webinar on X", host a webinar, online masterclass, or any live virtual event with promotion and follow-up. Reads ICP, services, and brand voice from knowledge/.
development
Write long-form thought leadership articles, opinion pieces, industry POV essays, and CEO/founder bylines using the Made to Stick SUCCESs framework (Chip and Dan Heath). Use when the user asks for a long-form article, executive byline, opinion piece, industry POV, manifesto, "explain our point of view on X", or wants to publish an authority-building piece (1200-2500 words). Reads brand voice and positioning from knowledge/.
development
Plan a monthly content calendar across channels using the Content Marketing Matrix (Dave Chaffey, Smart Insights) - Entertain/Inspire/Educate/Convince. Every post gets a quadrant label. The monthly calendar must hit 40% Educate, 40% Inspire+Convince, 20% Entertain. Produces a week-by-week posting schedule with topics, formats, channels, and asset links. Use when the user says "content calendar", "social calendar", "plan next month's content", "what should we post", "content plan", "editorial calendar", "schedule posts for the month", or wants a structured posting plan for LinkedIn, Twitter, email, or blog. Reads brand voice, ICP, and past learnings from knowledge/.
development
Write SEO-optimized long-form articles targeting specific keywords using the They Ask You Answer Big 5 framework (Marcus Sheridan). Articles are categorized by Big 5 type (Cost, Problems, Versus, Best/Reviews, How-To) and structured accordingly. The "answer first" rule applies to every article. Use when the user asks for an SEO article, blog post for ranking, "rank for keyword X", organic content, search-optimized post, pillar page, or content for organic traffic. Includes keyword targeting, search intent matching, internal linking suggestions, and meta tags.