The confluence-markdown-exporter exports Confluence pages in Markdown format. This exporter helps in migrating content from Confluence to platforms that support Markdown e.g. Obsidian, Gollum, Azure DevOps (ADO), Foam, Dendron and more.
- Converts Confluence pages to Markdown format.
- Uses the Atlassian API to export individual pages, pages including children, and whole spaces.
- Supports various Confluence elements such as headings, paragraphs, lists, tables, and more.
- Retains formatting such as bold, italic, and underline.
- Converts Confluence macros to equivalent Markdown syntax where possible.
- Handles images and attachments by linking them appropriately in the Markdown output.
- Supports extended Markdown features like tasks, alerts, and front matter.
- Skips unchanged pages by default — only re-exports pages that have changed since the last run.
- Supports Confluence add-ons: draw.io, PlantUML, Markdown Extensions
- Headings: Converts Confluence headings to Markdown headings.
- Paragraphs: Converts Confluence paragraphs to Markdown paragraphs.
- Lists: Supports both ordered and unordered lists.
- Tables: Converts Confluence tables to Markdown tables.
- Formatting: Supports bold, italic, and underline text.
- Links: Converts Confluence links to Markdown links.
- Images: Converts Confluence images to Markdown images with appropriate links.
- Code Blocks: Converts Confluence code blocks to Markdown code blocks.
- Tasks: Converts Confluence tasks to Markdown task lists.
- Alerts: Converts Confluence info panels to Markdown alert blocks.
- Front Matter: Adds front matter to the Markdown files for metadata like page properties and page labels.
- Mermaid: Converts Mermaid diagrams embedded in draw.io diagrams to Mermaid code blocks.
- PlantUML: Converts PlantUML diagrams to Markdown code blocks.
To use the confluence-markdown-exporter, follow these steps:
Install python package via pip.
pip install confluence-markdown-exporterRun the exporter with the desired Confluence page URL or space URL. Execute the console application by typing confluence-markdown-exporter and one of the commands pages, pages-with-descendants, spaces, orgs or config. If a command is unclear, you can always add --help to get additional information.
All export commands accept one or more URLs as space-separated arguments. Each command also has a singular alias (page, page-with-descendants, space, org) that behaves identically.
Export one or more Confluence pages by URL:
cme pages <page-url>
cme pages <page-url-1> <page-url-2> ...
# Singular alias (identical behaviour):
cme page <page-url>Supported page URL formats:
- Confluence Cloud: https://company.atlassian.net/wiki/spaces/SPACEKEY/pages/123456789/Page+Title
- Confluence Cloud (API gateway): https://api.atlassian.com/ex/confluence/CLOUDID/wiki/spaces/SPACEKEY/pages/123456789/Page+Title
- Confluence Server (long): https://wiki.company.com/display/SPACEKEY/Page+Title
- Confluence Server (short): https://wiki.company.com/SPACEKEY/Page+Title
Export one or more Confluence pages and all their descendant pages by URL:
cme pages-with-descendants <page-url>
cme pages-with-descendants <page-url-1> <page-url-2> ...
# Singular alias (identical behaviour):
cme page-with-descendants <page-url>Export all Confluence pages of one or more spaces by URL:
cme spaces <space-url>
cme spaces <space-url-1> <space-url-2> ...
# Singular alias (identical behaviour):
cme space <space-url>Supported space URL formats:
- Confluence Cloud: https://company.atlassian.net/wiki/spaces/SPACEKEY
- Confluence Cloud (API gateway): https://api.atlassian.com/ex/confluence/CLOUDID/wiki/spaces/SPACEKEY
- Confluence Server (long): https://wiki.company.com/display/SPACEKEY
- Confluence Server (short): https://wiki.company.com/SPACEKEY
Export all Confluence pages across all spaces of one or more organizations by URL:
cme orgs <base-url>
cme orgs <base-url-1> <base-url-2> ...
# Singular alias (identical behaviour):
cme org <base-url>The exported Markdown file(s) will be saved in the configured output directory (see export.output_path) e.g.:
output_path/
└── MYSPACE/
├── MYSPACE.md
└── MYSPACE/
├── My Confluence Page.md
└── My Confluence Page/
├── My nested Confluence Page.md
└── Another one.mdAll configuration and authentication is stored in a single JSON file managed by the application. You do not need to manually edit this file.
| Command | Description |
|---|---|
cme config |
Open the interactive configuration menu |
cme config list |
Print the full configuration as YAML |
cme config get <key> |
Print the value of a single config key |
cme config set <key=value>... |
Set one or more config values |
cme config edit <key> |
Open the interactive editor for a specific key |
cme config path |
Print the path to the config file |
cme config reset |
Reset all configuration to defaults |
cme configOpens a full interactive menu where you can:
- See all config options and their current values
- Select any option to change it (including authentication)
- Navigate into nested sections (e.g.
auth.confluence) - Reset all config to defaults
cme config list # YAML (default)
cme config list -o json # JSONPrints the entire current configuration. Output format defaults to YAML; use -o json for JSON.
cme config get export.log_level
cme config get connection_config.max_workersPrints the current value of the specified key. Nested sections are printed as YAML.
cme config set export.log_level=DEBUG
cme config set export.output_path=/tmp/export
cme config set export.skip_unchanged=falseSets one or more key=value pairs directly. Values are parsed as JSON where possible (so true, false, and numbers work as expected), falling back to a plain string.
Note
For auth keys that contain a URL (e.g. auth.confluence.https://...), use cme config edit auth.confluence instead — the interactive editor handles URL-based keys correctly.
cme config edit auth.confluence
cme config edit export.log_levelOpens the interactive editor directly at the specified config section, skipping the top-level menu.
cme config pathPrints the absolute path to the configuration file. Useful when CME_CONFIG_PATH is set or when locating the file for backup/inspection.
cme config reset
cme config reset --yes # skip confirmationResets the entire configuration to factory defaults after confirmation.
All options can be set via the config file (using cme config set) or overridden for the current session via environment variables. ENV vars take precedence over stored config and are not persisted. ENV var names use the CME_ prefix and __ as the nested delimiter (matching the key in uppercase).
Controls output verbosity: DEBUG (every step), INFO (key milestones), WARNING (warnings/errors only), ERROR (errors only).
- Default:
INFO - ENV Var:
CME_EXPORT__LOG_LEVEL
The directory where all exported files and folders will be written. Used as the base for relative and absolute links.
- Default:
./(current working directory) - ENV Var:
CME_EXPORT__OUTPUT_PATH
How to generate links to pages in Markdown. Options: relative (default) or absolute.
- Default:
relative - ENV Var:
CME_EXPORT__PAGE_HREF
Path template for exported pages.
- Default:
{space_name}/{homepage_title}/{ancestor_titles}/{page_title}.md - ENV Var:
CME_EXPORT__PAGE_PATH
How to generate links to attachments in Markdown. Options: relative (default) or absolute.
- Default:
relative - ENV Var:
CME_EXPORT__ATTACHMENT_HREF
Path template for attachments.
- Default:
{space_name}/attachments/{attachment_file_id}{attachment_extension} - ENV Var:
CME_EXPORT__ATTACHMENT_PATH
Export all attachments, not only those referenced by a page. Note: exporting large or many attachments increases export time.
- Default:
False - ENV Var:
CME_EXPORT__ATTACHMENT_EXPORT_ALL
Whether to include breadcrumb links at the top of the page.
- Default:
True - ENV Var:
CME_EXPORT__PAGE_BREADCRUMBS
Character mapping for filename encoding.
- Default: Default mappings for forbidden characters.
- ENV Var:
CME_EXPORT__FILENAME_ENCODING
Maximum length of filenames.
- Default:
255 - ENV Var:
CME_EXPORT__FILENAME_LENGTH
Whether to include the document title in the exported markdown file.
- Default:
True - ENV Var:
CME_EXPORT__INCLUDE_DOCUMENT_TITLE
Fetch Jira issue data to enrich Confluence pages. When enabled, Jira issue links include the issue summary. Requires Jira auth to be configured.
- Default:
True - ENV Var:
CME_EXPORT__ENABLE_JIRA_ENRICHMENT
Skip exporting pages that have not changed since last export. Uses a lockfile to track page versions.
- Default:
True - ENV Var:
CME_EXPORT__SKIP_UNCHANGED
After export, delete local files for pages removed from Confluence or whose export path has changed.
- Default:
True - ENV Var:
CME_EXPORT__CLEANUP_STALE
Name of the lock file used to track exported pages.
- Default:
confluence-lock.json - ENV Var:
CME_EXPORT__LOCKFILE_NAME
Number of page IDs per batch when checking page existence during cleanup. Capped at 25 for self-hosted (CQL).
- Default:
250 - ENV Var:
CME_EXPORT__EXISTENCE_CHECK_BATCH_SIZE
Enable automatic retry with exponential backoff.
- Default:
True - ENV Var:
CME_CONNECTION_CONFIG__BACKOFF_AND_RETRY
Multiplier for exponential backoff.
- Default:
2 - ENV Var:
CME_CONNECTION_CONFIG__BACKOFF_FACTOR
Maximum seconds to wait between retries.
- Default:
60 - ENV Var:
CME_CONNECTION_CONFIG__MAX_BACKOFF_SECONDS
Maximum number of retry attempts.
- Default:
5 - ENV Var:
CME_CONNECTION_CONFIG__MAX_BACKOFF_RETRIES
HTTP status codes that trigger a retry.
- Default:
[413, 429, 502, 503, 504] - ENV Var:
CME_CONNECTION_CONFIG__RETRY_STATUS_CODES
Timeout in seconds for API requests. Prevents hanging on slow or unresponsive servers.
- Default:
30 - ENV Var:
CME_CONNECTION_CONFIG__TIMEOUT
Whether to verify SSL certificates for HTTPS requests.
- Default:
True - ENV Var:
CME_CONNECTION_CONFIG__VERIFY_SSL
Enable Confluence REST API v2 endpoints. Supported on Atlassian Cloud and Data Center 8+. Disable for self-hosted Server instances.
- Default:
False - ENV Var:
CME_CONNECTION_CONFIG__USE_V2_API
Maximum number of parallel workers for page export. Set to 1 for serial/debug mode. Higher values improve performance but may hit API rate limits.
- Default:
20 - ENV Var:
CME_CONNECTION_CONFIG__MAX_WORKERS
Note
Auth credentials use URL-keyed nested dicts (e.g. auth.confluence["https://company.atlassian.net"]) and cannot be mapped to flat ENV var names. Use cme config edit auth.confluence or cme config set for auth configuration.
Confluence instance URL.
- Default:
""
Confluence username/email.
- Default:
""
Confluence API token.
- Default:
""
Confluence Personal Access Token.
- Default:
""
Atlassian Cloud ID for the Confluence instance. When set, API calls are routed through the Atlassian API gateway (https://api.atlassian.com/ex/confluence/{cloud_id}), which enables the use of scoped API tokens.
For Atlassian Cloud instances (.atlassian.net) this is fetched and stored automatically on first connection. You can also set it manually — see How to retrieve your Atlassian Cloud ID.
- Default:
""
Jira instance URL.
- Default:
""
Jira username/email.
- Default:
""
Jira API token.
- Default:
""
Jira Personal Access Token.
- Default:
""
Atlassian Cloud ID for the Jira instance. Works identically to auth.confluence.cloud_id above, routing API calls through https://api.atlassian.com/ex/jira/{cloud_id}.
For Atlassian Cloud instances this is fetched and stored automatically on first connection.
- Default:
""
You can always view and change the current config with the interactive menu above.
Some platforms have specific requirements for Markdown formatting, file structure, or metadata. You can adjust the export configuration to optimize output for your target system. Below are some common examples:
Run the following command to configure the exporter for Obsidian:
cme config set export.include_document_title=false export.page_breadcrumbs=falseObsidian natively renders the document title and page breadcrumbs, so both are disabled to avoid redundant output.
Run the following command to configure the exporter for ADO Wikis:
cme config set \
export.attachment_href=absolute \
'export.attachment_path=.attachments/{attachment_file_id}{attachment_extension}' \
'export.filename_encoding={" ":"-","\"":"%22","*":"%2A","-":"%2D",":":"%3A","<":"%3C",">":"%3E","?":"%3F","|":"%7C","\\":"_","#":"_","/":"_","\u0000":"_"}' \
export.filename_length=200ADO Wikis require absolute attachment links and expect attachments in a specific .attachments/ folder. Filenames are sanitized to match ADO's restrictions: spaces become dashes, dashes are percent-encoded, and other forbidden characters are replaced with underscores. The filename length is capped to stay within ADO's limits.
By default, configuration is stored in a platform-specific application directory. You can override the config file location by setting the CME_CONFIG_PATH environment variable to the desired file path. If set, the application will read and write config from this file instead. Example:
export CME_CONFIG_PATH=/path/to/your/custom_config.jsonThe exporter automatically detects CI environments and suppresses rich terminal formatting (colors, spinner animations, progress bar redraws) so that log output is clean and readable in CI logs.
Detection is based on two standard environment variables:
| Variable | Effect |
|---|---|
CI=true |
Disables ANSI color codes and live terminal output |
NO_COLOR=1 |
Same effect (follows the no-color.org convention) |
Most CI platforms (GitHub Actions, GitLab CI, CircleCI, Jenkins, etc.) set CI=true automatically.
You can control output verbosity via the CME_EXPORT__LOG_LEVEL env var or the export.log_level config option:
# Enable verbose debug logging for a single run (not persisted):
CME_EXPORT__LOG_LEVEL=DEBUG cme pages <page-url>
# Reduce verbosity permanently:
cme config set export.log_level=WARNING
# Or for the current session only:
CME_EXPORT__LOG_LEVEL=WARNING cme pages <page-url>This is useful for using different log levels for different environments or for scripting.
Update python package via pip.
pip install confluence-markdown-exporter --upgradeThis package is not tested extensively. Please check all output and report any issue here. It generally was tested on:
- Confluence Cloud 1000.0.0-b5426ab8524f (2025-05-28)
- Confluence Server 8.5.20
- Missing Attachment File ID on Server: For some Confluence Server version/configuration the attachment file ID might not be provided (#39). In the default configuration, this is used for the export path. Solution: Adjust the attachment path in the export config and use the
{attachment_id}or{attachment_title}instead. - Connection Issues when behind Proxy or VPN: There might be connection issues if your Confluence Server is behind a proxy or VPN (#38). If you experience issues, help to fix this is appreciated.
If you would like to contribute, please read our contribution guideline.
This tool is an open source project released under the MIT License.
