Sharky220 downloadsSync your vault with Notion — preserves folder hierarchy, markdown formatting, internal links, metadata, and attachments.
Synchronize your entire Obsidian vault to Notion — preserving folder hierarchy, markdown formatting, internal links, frontmatter metadata, and attachments.
git status-style list of files that have local changes pending a push, each with its own push button[[wikilinks]] are resolved to their synced Notion page URLs![[file.png]]) can be uploaded to Notion via a configurable upload endpointhttps://notion.so/Your-Page-Title-abc123def456...Open Settings → Notion Vault Sync and fill in:
| Setting | Description |
|---|---|
| Notion API Token | Your integration secret (secret_...) |
| Root Notion Page ID | The page ID from step 2 |
| Sync Mode | Manual / On Save / Scheduled / Current File |
| Sync Attachments | Upload images and file embeds |
| Sync Metadata | Push YAML frontmatter as page properties |
| Download Images on Pull | Download Notion images locally and rewrite as ![[...]] embeds |
| Sync Interval | How often to auto-sync (minutes, scheduled mode only) |
| Attachment Upload URL | Optional external endpoint for file uploads |
Click Test Connection to verify everything is working.
| Mode | Behavior |
|---|---|
| Manual | Only syncs when you run a command |
| On Save | Syncs the current file every time you save |
| Scheduled | Syncs the entire vault at a set interval |
| Current File | Syncs only the currently open file on demand |
Open the panel from the ribbon icon (cloud) or the Open sync panel command. It gives you:
U for not-yet-synced notes, M for modified ones — each row opens the file or pushes it individuallySync is two-way. When pulling, Notion is the source of truth and local files are overwritten (a snapshot is saved to history first, so pulls can be rolled back).
| Action | Behavior |
|---|---|
| Pull all | Overwrites every mapped local note with its current Notion content |
| Pull new pages | Walks the Notion tree under your root page and creates local notes for pages that aren't mapped yet |
| Pull current note | Overwrites just the open note |
With Download Images on Pull enabled, images referenced in pulled pages are downloaded into a local _attachments folder and rewritten as ![[filename]] embeds.
All commands are available via the Command Palette (Cmd/Ctrl + P):
| Command | Description |
|---|---|
| Sync entire vault to Notion | Full sync of all notes and folders |
| Sync current note to Notion | Push only the currently open note |
| Sync changed files to Notion | Incremental sync — only changed files |
| Pull current note from Notion | Overwrite the open note with its Notion version |
| Pull all notes from Notion | Overwrite every mapped note with its Notion version |
| Pull new pages from Notion | Create local notes for Notion pages not yet in the vault |
| Rebuild Notion hierarchy | Re-create the folder structure in Notion without re-syncing content |
| Open sync panel | Open the sidebar panel with push/pull actions and the changes list |
| Open sync log | View a detailed log of all sync operations |
The following Obsidian/Markdown elements are converted to native Notion blocks:
#, ##, ###)inline code- [ ] / - [x])>)> [!note], > [!warning], …) mapped to colored Notion callouts---)![[...]])[[Note Name]]) resolved to Notion URLsBy default, attachment embeds are converted to placeholder callout blocks in Notion. To enable real image uploads:
The plugin will POST the file binary to this URL and use the returned url field as the Notion image source.
Your Notion API token and page IDs are stored locally in data.json inside your vault and are never sent anywhere except directly to the official Notion API (api.notion.com). This file is excluded from version control by the plugin's .gitignore.
main.js, manifest.json, and styles.css from the latest release on the Releases page.obsidian/plugins/notion-vault-sync/Pull requests and issues are welcome. Please open an issue before starting any large change so we can discuss the approach.