stephenkall209 downloadsPush an entire Obsidian vault into a custom Confluence parent page using Confluence REST API.
Sync your entire Obsidian vault to Confluence, preserving the folder structure as a page hierarchy. Obsidian wiki links become real Confluence page links, callout blocks become Confluence macros, and code blocks get syntax highlighting.
.md file becomes a Confluence page nested under the correct parent_ (MOC files) supply its content[[Page]], [[Folder/Page]], [[Page|Display Text]], and ![[Embed]] all become working Confluence links> [!note], > [!warning], > [!tip], > [!danger] etc. become Confluence info/warning/tip panels404 errors, queuing the affected files for re-syncNot yet in Obsidian's official Community Plugins directory (submission pending). Use one of the methods below in the meantime.
Obsidian's built-in "Check for updates" only manages plugins installed through the official Community Plugins directory, so a manually installed copy of this plugin (Option B) will not auto-update. BRAT (Beta Reviewers Auto-update Tool) is a community plugin that installs and auto-updates plugins directly from their GitHub repo, without requiring the official listing — it works with this repo's releases as-is, with nothing special to configure.
stephenkall/obsidian-confluence-vault-uploader, and confirm.From then on, BRAT checks this repo's GitHub Releases for you and can update the plugin automatically — no manual re-download needed for future versions.
main.js, manifest.json, and styles.css from the latest release<your-vault>/.obsidian/plugins/confluence-vault-uploader/ — the folder name must match the id in manifest.json (confluence-vault-uploader)To build from source:
git clone https://github.com/stephenkall/obsidian-confluence-vault-uploader.git
cd obsidian-confluence-vault-uploader
npm install
npm run build
# copy main.js + manifest.json + styles.css to your vault's plugin folder
Open Settings → Confluence Vault Uploader and fill in:
| Field | Description |
|---|---|
| Confluence base URL | e.g. https://yourcompany.atlassian.net/wiki |
| Username | Your Atlassian account email |
| API token | Generate at Atlassian |
| Root page URL | Paste the full URL of the Confluence page that will be the sync root (space key and page ID are extracted automatically). Leave empty to sync under the space root. |
After filling in the root page URL, a confirmation line shows the extracted space and page ID. Use Test Connection to verify credentials before syncing.
Ctrl+P / Cmd+P)| Command | Purpose |
|---|---|
| Sync vault to Confluence | Runs the full two-phase sync. Resumes automatically from the last checkpoint if a previous run stopped early. |
| Stop Confluence sync | Cancels an in-progress sync after the current file finishes. Progress is saved. |
| Show Confluence sync status | Opens a status panel: current state, progress, cached page count, log level, and the last completed sync's result. |
| Show Confluence sync log | Opens the in-app sync log (respects the log level below), with copy-to-clipboard and clear actions. |
| Repair Confluence sync cache | Validates every cached page mapping against Confluence and drops stale ones, queuing affected files for re-sync. Run this if sync reports 404 errors. |
| Reconcile Confluence page titles | Renames already-synced pages whose title predates disambiguation (see below) to match their sibling's scheme. Opt-in — not run automatically on every sync. |
| Find Confluence pages not in vault | Lists Confluence pages under your Root page that no longer correspond to anything in the vault (leftovers from older sync attempts), for review before deleting. See Cleanup below. |
| Clear Confluence sync cache | Wipes all cached state; the next sync starts completely fresh. |
| Update Confluence page links (Phase 2) | Re-runs only the cross-page link resolution step, without re-syncing page content. |
You never have to guess whether a sync is running, idle, or stuck:
None (errors only), Normal (per-file progress), or Verbose (per-request detail). Errors are always captured regardless of this setting. Per Obsidian's plugin guidelines, the developer console only ever shows errors — everything else lives in the in-app log ("Show Confluence sync log").Both sync phases can process multiple pages at once instead of strictly one at a time. Set Sync concurrency (Settings → Confluence Vault Uploader → Performance) to how many pages to sync simultaneously — 1 disables concurrency (original one-at-a-time behavior), higher values finish large vaults faster. A few things worth knowing:
429), the sync automatically waits (honoring the server's Retry-After when given, or an exponential backoff otherwise) and retries — this is normal, self-correcting behavior at higher concurrency, not a failure.A sync only ever adds or updates pages — it never deletes anything on its own, even across many runs. If earlier (buggier) versions of this plugin left orphaned pages behind under old titles, those stay until you explicitly remove them.
Find Confluence pages not in vault helps with exactly that: it walks every page under your configured Root page and compares it against what the vault currently produces, then shows a checklist of anything left over — before touching anything. A few safety rails are built in:
This only prunes the Confluence side. It never creates, modifies, or deletes anything in your vault.
A file whose name starts with _ (e.g. _Overview MOC.md) is treated as the content of its parent folder's Confluence page rather than as a separate child page. This lets you write a rich index for each section.
01 - Overview/
├── _Overview MOC.md ← becomes the body of the "01 - Overview" page
├── Architecture.md ← child page
└── System Landscape.md ← child page
All standard Obsidian link formats are supported and resolved to real Confluence URLs in Phase 2:
| Obsidian syntax | Result |
|---|---|
[[Page Name]] |
Link to that page |
[[Folder/Page Name]] |
Link using a partial path (resolved from any depth) |
[[Page Name|Display text]] |
Link with custom display text |
![[Page Name]] |
Embed converted to a link |
| Obsidian callout | Confluence macro |
|---|---|
> [!note], > [!info] |
Info panel |
> [!tip], > [!success] |
Tip panel |
> [!warning], > [!caution] |
Warning panel |
> [!danger], > [!error], > [!bug] |
Warning panel |
![[file.jpg]] become links (Confluence image upload is not yet supported)- [ ] / - [x]) are converted to ☐/☑ plain text, since Confluence storage format does not support HTML checkbox elementsseg_0/GUID.xml instead of a bare GUID.xml), instead of failing with Request failed, status 400. This only affects the Confluence-visible title — internal link resolution always uses the full vault path, so links are unaffected. A page that already synced under its old bare title (e.g. from before this behavior existed) is not automatically renamed — on a vault with many collisions, attempting that in bulk on every sync risks its own update conflicts. It's purely cosmetic and does not affect sync correctness; run Reconcile Confluence page titles any time you want those brought in line with their sibling's scheme.This plugin reads every .md file in your vault to build the page hierarchy and resolve cross-file links. No file content is sent anywhere except to the Confluence instance you configure. Your Confluence credentials (URL, username, API token) are stored locally in Obsidian's plugin data and are never transmitted to any third party.