CCFM — Confluence Cloud Flavoured Markdown¶
A CLI tool that converts Markdown to Atlassian Document Format (ADF) and deploys pages to Confluence Cloud. Write documentation as Markdown, deploy it as native Confluence pages — no legacy conversions, no storage format hacks, full editor compatibility.
Features¶
- Native ADF output — Pages open in the Confluence editor without any legacy conversion
- Automatic page hierarchy — Directory structure maps directly to Confluence page hierarchy
- CCFM extensions — Status badges, panels, expands, dates, smart page links, emoji, image width control
- Idempotent — Safe to run multiple times; creates or updates pages automatically
- Remote state — Deployment state stored in Confluence itself, no local files to commit
- Concurrent deploy protection — Terraform-style locking prevents conflicting deploys
- CI/CD ready — Deploy documentation on every commit to your main branch
Full syntax reference: CCFM Syntax Reference
Quick Start¶
1. Get an API token¶
Go to Atlassian API Tokens, create a token, and note your Atlassian email address.
2. Install¶
Or use Docker:
3. Initialise your space¶
Before deploying for the first time, initialise CCFM in your Confluence space. This creates
a _ccfm management page that stores deployment state and lock information.
ccfm \
--domain your-domain.atlassian.net \
--email your.email@example.com \
--token YOUR_API_TOKEN \
--space YOUR_SPACE_KEY \
init
This is idempotent — safe to run multiple times.
4. Write a page¶
---
page_meta:
title: My First Page
labels:
- docs
deploy_config:
ci_banner: false
---
# My First Page
This is **bold** text, this is *italic*.
> [!info]
> This is an info panel.
::In Progress::blue:: ::Stable::green::
5. Preview and apply¶
# See what would change without touching Confluence
ccfm plan --directory path/to/docs
# Apply changes
ccfm apply --directory path/to/docs
# Skip confirmation prompt (for CI)
ccfm apply --directory docs --auto-approve
6. Inspect ADF output¶
Use the dump subcommand to convert markdown to ADF JSON files locally without making any
API calls:
Page Hierarchy¶
Directories map directly to Confluence pages. A file at docs/Team/Engineering/api.md creates:
By default, container pages (Team, Engineering) are created as placeholders.
To control a container page's title and content, add a .page_content.md file inside the directory:
docs/
└── Team/
├── .page_content.md ← controls the "Team" Confluence page
└── Engineering/
├── .page_content.md
└── api.md
.page_content.md files support full CCFM syntax and frontmatter, including labels and
custom titles.
What's Next?¶
- Syntax Reference — Full CCFM syntax with ADF mapping
- CLI Reference — All subcommands, options, and examples
- Configuration — ccfm.yaml, frontmatter, state management, locking
- Deployment Patterns — Single-env, multi-env, multi-source
- Docker & CI/CD — Docker, GitHub Action, pipeline examples