confluence
Confluence with orbit CLI
Manage Confluence pages, publish markdown documentation, and control page layout using the orbit CLI. Supports Confluence Cloud and Server/Data Center via REST API with multi-profile support and 1Password secret resolution.
Prerequisites
orbitCLI installed — ifwhich orbitfails, install with:- macOS/Linux (Homebrew):
brew install jorgemuza/tap/orbit - macOS/Linux (script):
curl -sSfL https://raw.githubusercontent.com/jorgemuza/orbit/main/install.sh | sh - Windows (Scoop):
scoop bucket add jorgemuza https://github.com/jorgemuza/scoop-bucket && scoop install orbit
- macOS/Linux (Homebrew):
- A profile with a
confluence-cloudorconfluence-serverservice configured in~/.config/orbit/config.yaml - Valid credentials (API token for Cloud, PAT for Server) — can be stored in 1Password with
op://prefix - For Cloud: auth type is
basicwith email as username and API token as password
Quick Reference
All commands follow the pattern: orbit -p <profile> confluence <command> [flags]
For full command details and flags, see references/commands.md.
For Confluence storage format (XHTML) details, see references/storage-format.md.
Core Workflows
Viewing Pages
# View page details
orbit -p myprofile confluence page 473676972036
# View as JSON (includes body content)
orbit -p myprofile confluence page 473676972036 -o json
# List child pages
orbit -p myprofile confluence children 473676972036
# Show full page hierarchy (ancestors + descendants tree)
orbit -p myprofile confluence hierarchy 473676972036
# Deeper tree (default depth is 2)
orbit -p myprofile confluence hierarchy 473676972036 --depth 5
# JSON tree output
orbit -p myprofile confluence hierarchy 473676972036 -o json
Searching Pages
# Search by space
orbit -p myprofile confluence search --space FO
# Search by title (fuzzy match)
orbit -p myprofile confluence search --space FO --title "Architecture"
# Search by label
orbit -p myprofile confluence search --space FO --label design
# Full-text search
orbit -p myprofile confluence search --space FO --text "deployment pipeline"
# Raw CQL query
orbit -p myprofile confluence search --cql 'space=FO AND label=design AND type=page'
# Increase result limit (default 25)
orbit -p myprofile confluence search --space ISMS --limit 100
Creating Pages from Markdown
When creating a page from a markdown file, the CLI automatically converts it to Confluence storage format (XHTML). The converter handles headings, lists, tables, code blocks, blockquotes, inline formatting, and images.
# Create page from markdown file
orbit -p myprofile confluence create --space FO --parent 473677299713 \
--title "My New Page" --file docs/overview.md
# Create page with inline body (storage format XHTML)
orbit -p myprofile confluence create --space FO --parent 473677299713 \
--title "Quick Page" --body "<p>Hello world</p>"
Pages are automatically created with wide width (full-width layout).
Updating Existing Pages
When --file is provided, the update command automatically reads the title from frontmatter, syncs labels from confluence_labels, prepends page properties from confluence_properties, and sets full-width layout — matching the publish command behavior. Use --title to override the frontmatter title.
# Update page from markdown (title, labels, properties auto-synced)
orbit -p myprofile confluence update 473676972036 --file docs/overview.md
# Override title explicitly
orbit -p myprofile confluence update 473676972036 \
--title "Custom Title" --file docs/overview.md
# Update with inline storage format
orbit -p myprofile confluence update 473676972036 --body "<p>New content</p>"
Publishing a Directory of Markdown Files
The publish command recursively converts an entire directory of markdown files to Confluence pages, preserving the folder hierarchy:
INDEX.mdfiles become the parent page for their directory- Other
.mdfiles become child pages under the directory's parent - Subdirectories are processed recursively
- Page titles come from frontmatter
title:, first# heading, or filename - Files with
confluence_ignore: trueare skipped; if previously published, the Confluence page is deleted. When anINDEX.mdis ignored, the entire subdirectory is skipped. - Upsert behavior: If a page has no
confluence_page_idin frontmatter, orbit searches by title first. If create fails due to a title conflict (e.g. special characters like&in the title), it falls back to listing the parent's children and updating the matching page. After success,confluence_page_idis written to frontmatter for future runs. - All pages are set to full-width layout on every create and update.
# Publish entire docs directory
orbit -p myprofile confluence publish ./docs --space FO --parent 473677299713
# Preview what would be created (no API calls)
orbit -p myprofile confluence publish ./docs --space FO --parent 473677299713 --dry-run
Diagram Rendering
Fenced code blocks with diagram languages are automatically rendered as images via kroki.io — no Confluence plugins required. Supported languages: mermaid, plantuml, graphviz, dot, d2, ditaa, erd, nomnoml, svgbob, vega, vegalite, wavedrom, pikchr, structurizr, excalidraw, c4plantuml.
```mermaid
graph LR
A-->B
A-->C
```
This renders as a PNG image (max 600px wide, 800px tall — auto-scaled) with a clickable link to the full-resolution image. Regular code blocks (python, go, bash, etc.) are unaffected. If Kroki rejects a diagram (syntax error), it falls back to a syntax-highlighted code block.
Mermaid diagrams are auto-sanitized before rendering to fix common Kroki compatibility issues:
<br/>tags stripped (replaced with.)- Parenthesized suffixes in participant aliases converted:
Worker (queue)→Worker - queue - Trailing
()on participant names removed - Port numbers after colons removed:
API:8000→API - Reverse arrows flipped:
Client<<--API: msg→API-->>Client: msg
When writing Mermaid diagrams for Confluence publishing, avoid:
- HTML tags (
<br/>) in participant names or notes - Colons in participant alias text (e.g.,
API:8000) - Parentheses in participant aliases (e.g.,
Worker(queue)) - Function-call syntax in aliases (e.g.,
dispatch()) - Reverse arrows (
<<--) — Mermaid only supports left-to-right arrows - ASCII box-drawing characters — use proper Mermaid syntax instead
Exporting Pages
# Export page as markdown (default)
orbit -p myprofile confluence export 12345
# Export to a directory
orbit -p myprofile confluence export 12345 --format markdown --output docs/
# Export raw storage format
orbit -p myprofile confluence export 12345 --format storage --output backup/
Setting Page Width
# Set single page to wide
orbit -p myprofile confluence set-width 473676972036
# Set page and all children to wide
orbit -p myprofile confluence set-width 473676972036 --recursive
# Set to fixed width
orbit -p myprofile confluence set-width 473676972036 --width fixed
Markdown Frontmatter Tracking
When publishing or converting markdown files for Confluence, track the mapping between local files and Confluence pages using YAML frontmatter. After creating or updating a page, update the source markdown file's frontmatter with:
---
title: "My Page Title"
confluence_ignore: false
confluence_page_id: "473676972036"
confluence_url: "https://mysite.atlassian.net/wiki/spaces/FO/pages/473676972036/My+Page+Title"
---
This enables:
- Re-running updates without needing to look up page IDs
- Tracking which files have been published
- Building scripts that sync local changes to Confluence
- Excluding files from Confluence with
confluence_ignore: true(deletes previously published pages)
When the user asks to publish or sync markdown files to Confluence:
- Run the orbit command to create/update the page
- Capture the page ID and URL from the output
- Update the markdown file's frontmatter with
confluence_page_idandconfluence_url - If the frontmatter doesn't exist, add it at the top of the file
Example workflow for syncing a file:
# If confluence_page_id exists in frontmatter, update (title auto-read from frontmatter):
orbit -p myprofile confluence update 473676972036 --file docs/overview.md
# If no confluence_page_id, create new:
orbit -p myprofile confluence create --space FO --parent 473677299713 \
--title "Overview" --file docs/overview.md
# Then update the frontmatter with the returned page ID and URL
Page Properties & Labels
The publish command supports Confluence Page Properties macros and labels via frontmatter, enabling dynamic Page Properties Report tables (like the ISMS Policies page pattern).
Labels (Tags)
Add confluence_labels to frontmatter to tag pages. Labels are applied after each page is created or updated during publish.
---
title: "My Policy"
confluence_labels:
- ai-process
- foundation
---
Page Properties (details macro)
Add confluence_properties to frontmatter to generate a Confluence Page Properties macro at the top of the page. This creates a structured metadata block that can be queried by Page Properties Report macros on other pages.
---
title: "Compounding Engineering & System Evolution"
confluence_properties:
id: status
fields:
Owner: AI Tooling Guild
Classification: Internal
Status: "{status:Green|approved}"
Reviewed on: 2026-03-06
Approved on: 2026-03-06
---
id-- sets the macro ID (used bydetailssummaryreports to target specific property blocks)fields-- ordered key-value pairs rendered as a two-column table inside the macro- Values matching
{status:Color|Text}are converted to status badge macros (emoji shortcodes like:green_circle: Greenare also supported) - Values matching
YYYY-MM-DDare converted to Confluence<time>date macros - Other values are rendered as plain text
Page Properties Report (detailssummary macro)
Add a directive in your markdown to generate a dynamic table that pulls Page Properties from labeled pages. Two formats are supported:
HTML comment format (full control):
<!-- confluence:properties-report cql="label = 'ai-process' and space = currentSpace()" firstcolumn="Document" headings="Status, Classification, Reviewed on" -->
Shorthand format:
{properties-report: label="ai-process", columns="Status, Classification, Reviewed on"}
Parameters:
cql-- CQL query to find pages (e.g.,label = "policy" and space = currentSpace())label-- shorthand for CQL: generateslabel = "value" and space = currentSpace()firstcolumn-- name of the first column (defaults to "Title")columns/headings-- comma-separated list of property names to show as columnssortBy-- optional column to sort by
Complete Example
Child page (e.g., overview.md):
---
title: Overview & Philosophy
confluence_labels:
- ai-process
confluence_properties:
id: status
fields:
Owner: AI Tooling Guild
Classification: Internal
Status: "{status:Green|approved}"
Reviewed on: 2026-03-06
---
Index page (e.g., INDEX.md):
---
title: AI Development Process
confluence_labels:
- ai-process
---
# AI Development Process
<!-- confluence:properties-report cql="label = 'ai-process' and space = currentSpace()" firstcolumn="Document" headings="Status, Classification, Owner, Reviewed on" -->
<!-- confluence:ignore-start -->
| Document | Version | Summary |
|----------|---------|---------|
| [Overview & Philosophy](./overview.md) | v2.0 | Core principles, four layers |
<!-- confluence:ignore-end -->
On Confluence, only the Properties Report macro is rendered (the static table is ignored). In markdown viewers (GitHub, local), the static table is shown alongside the HTML comment directives (which are invisible).
Markdown-to-Confluence Conversion
The converter handles the following transformations:
| Markdown | Confluence Storage Format |
|---|---|
# Heading (first one) |
Skipped -- Confluence shows the page title |
## Heading to ###### Heading |
<h2> to <h6> |
**bold** |
<strong> |
`code` |
<code> |
~~strike~~ |
<del> |
- bullet / * bullet |
<ul><li> |
1. numbered |
<ol><li> |
> blockquote |
Info panel macro |
```lang code blocks |
Code macro with language |
| table | rows | |
<table> with <thead> |
 |
<ac:image> |
[text](url) |
<a href> (relative .md links resolved to Confluence page links) |
--- horizontal rules |
<hr /> |
| YAML frontmatter | Stripped |
**Key**: Value metadata lines |
Two-column table (gray label column) |
<!-- confluence:toc-start/end --> |
TOC section replaced with Confluence toc macro |
confluence_properties frontmatter |
Page Properties (details) macro |
<!-- confluence:properties-report --> |
Page Properties Report (detailssummary) macro |
{properties-report: ...} |
Page Properties Report (detailssummary) macro |
<!-- confluence:ignore-start/end --> |
Content between markers is skipped (not sent to Confluence) |
Key behaviors to communicate to users:
- The first
# headingis always skipped because Confluence already displays the page title - Relative markdown links (
.md,./) are resolved to Confluence internal page links when publishing a directory (using thepublishcommand). The link map maps relative paths to page titles, generating<ac:link>macros. When converting a single file without a link map, relative links fall back to plain text - TOC sections wrapped in
<!-- confluence:toc-start -->/<!-- confluence:toc-end -->directives are replaced with Confluence's built-in TOC macro. Supports params:maxLevel,minLevel,style,outline,printable(e.g.,<!-- confluence:toc-start maxLevel=2 -->). Section numbering (outline) defaults tofalseto avoid duplicate numbering when the markdown TOC already uses numbered lists - Code blocks and tables use full-width layout
- Document metadata lines (
**Key**: Value) right after frontmatter are converted to a styled two-column table with gray labels - Code blocks with language hints get syntax highlighting via the code macro
confluence_labelsin frontmatter applies labels/tags to pages duringpublishconfluence_propertiesin frontmatter generates a Page Properties macro prepended to page content- Properties Report directives generate dynamic tables querying labeled pages
<!-- confluence:ignore-start -->/<!-- confluence:ignore-end -->blocks are stripped during conversion — content inside is completely skipped. This is useful for INDEX pages that need static markdown tables for GitHub/local rendering alongside dynamic Properties Report macros for Confluence. Ignore directives inside code blocks are treated as literal text (not processed)
Important Notes
- Wide width by default -- All pages created via
orbitare automatically set to full-width layout. Useset-width --width fixedto revert. - Cloud vs Server -- Use service type
confluence-cloudfor Atlassian Cloud (requires/wiki/prefix in API paths, handled automatically). Useconfluence-serverfor Data Center. - Auth for Cloud -- Basic auth with your email as username and an API token (not your password) as the password field.
- 1Password integration -- Credentials in config can use
op://vault/item/fieldand are resolved at runtime. Runorbit authonce to resolve and cache all secrets for 8 hours (single biometric prompt). Useorbit auth clearto wipe the cache. - Dry run before publish -- Always use
--dry-runfirst when publishing a directory to preview the page hierarchy before making API calls.
More from jorgemuza/orbit
gitlab
Create and manage GitLab projects, merge requests, pipelines, issues, branches, and more using the orbit CLI. Use this skill whenever the user asks about GitLab repositories, MRs (merge requests), CI/CD pipelines, branches, tags, commits, issues, groups, or project members. Trigger on phrases like 'list MRs', 'check the pipeline', 'create a branch', 'open a merge request', 'view the latest commits', 'list projects in group X', 'retry the CI', 'close the issue', 'who are the members', or any GitLab-related task — even casual references like 'what's running in CI', 'show me the MRs', 'tag a release', 'check if it merged', or 'list repos'. Also trigger when the user mentions PR/pull request in a GitLab context (GitLab calls them merge requests). The orbit CLI alias is `gl`.
97jira
Interact with Jira using the orbit CLI to create, list, view, edit, and transition issues, manage sprints and epics, export epic hierarchies to markdown, manage dashboards and gadgets, manage saved filters, manage custom fields and screen configurations, list statuses and issue types, and write properly formatted descriptions using Jira wiki markup. Use this skill whenever the user asks about Jira tasks, tickets, issues, sprints, epics, dashboards, filters, gadgets, or needs to manage project work items using orbit. Also trigger when the user says things like 'create a ticket', 'create epics', 'move this to done', 'assign the issue', 'update the description', 'format for Jira', 'create a custom field', 'add field to screen', 'list statuses', 'configure Jira', 'create a dashboard', 'add a gadget', 'list filters', 'search filters', 'export epic', 'dump epic hierarchy', or any Jira-related workflow — even casual references like 'update Jira', 'what tickets are in this sprint', 'add a comment to PROJ-123', 'set up AI tracking fields', 'show me the dashboards', or 'create a metrics dashboard'. Trigger especially when descriptions need proper formatting (headings, bullets, tables, links) since Jira Server uses wiki markup, not markdown.
95format-docs
Format and restructure markdown documents so they publish cleanly to Confluence via `orbit confluence publish`. Use this skill whenever the user wants to prepare docs for Confluence, fix markdown formatting for wiki publishing, add frontmatter to docs, restructure a docs directory, or ensure markdown files follow Confluence-friendly conventions. Also trigger when the user says things like 'format these docs', 'prepare docs for Confluence', 'fix the frontmatter', 'restructure the docs folder', 'make these docs publishable', 'clean up the markdown', or any task involving making markdown Confluence-ready — even if they just say 'format this' or 'prep for wiki' without mentioning Confluence explicitly. If the user has a docs/ directory and mentions publishing or syncing, this skill applies.
71draxarp
Manage Draxarp Intelligence — projects, tasks, specs, docs, memories, sprints, knowledge graph, context captures, and task decomposition via orbit CLI
68github
Create and manage GitHub repositories, pull requests, issues, releases, branches, secrets, and more using the orbit CLI. Use this skill whenever the user asks about GitHub repositories, PRs (pull requests), GitHub Actions workflow runs, branches, tags, commits, issues, releases, secrets, or organization repos. Trigger on phrases like 'list PRs', 'check the actions', 'watch the workflow', 'create a secret', 'open a pull request', 'view the latest commits', 'list repos in org X', 'rerun the workflow', 'close the issue', 'latest release', 'set a GitHub secret', or any GitHub-related task — even casual references like 'what's running in CI', 'show me the PRs', 'tag a release', 'check if it merged', 'list repos', 'is the build passing', or 'add a deploy key secret'. Also trigger when the user wants to monitor CI/CD progress, manage Actions secrets for deployments, or debug failing workflows. The orbit CLI alias is `gh`.
61bitbucket
Manage Bitbucket repositories, pull requests, branches, tags, commits, projects, and admin settings using the orbit CLI. Use this skill whenever the user asks about Bitbucket repos, PRs (pull requests), branches, tags, commits, code review, project management, default reviewer conditions, required approvals, merge restrictions, or PR approvals on Bitbucket Server/Data Center or Bitbucket Cloud. Trigger on phrases like 'list PRs', 'show pull requests', 'create a branch', 'open a PR', 'view the latest commits', 'list repos in project X', 'merge the PR', 'decline the PR', 'approve the PR', 'unapprove', 'request changes', 'needs work', 'mark as needs work', 'reject the PR', 'block the merge', 'check PR activity', 'bypass merge check', 'required approvals', 'reviewer conditions', 'who needs to approve', or any Bitbucket-related task — even casual references like 'what PRs are open', 'show me the repos', 'tag a release', 'check if it merged', 'who approved it', 'list branches', or 'why can't I merge'. Also trigger when the user provides a Bitbucket Server URL (e.g., https://git.example.com/projects/PROJ/repos/my-repo/) or mentions Bitbucket Data Center. The orbit CLI alias is `bb`.
58