Jiho Song66 downloadsBidirectional Obsidian and Notion synchronization with explicit conflict protection.
Bidirectional synchronization between Obsidian Markdown notes and Notion pages with explicit conflict protection.
LLM Wiki Sync is an Obsidian desktop plugin for manual, safety-first synchronization between local Markdown notes and Notion pages. It is designed around stable page identity, persisted sync baselines, and explicit user decisions when both sides changed.
notion_page_id mappingSync current note automatic direction detectionKeep Obsidian and Keep Notion resolutionEach linked note stores a notion_page_id in local frontmatter. The plugin uses that ID as the stable identity for the Notion page, so local filename changes do not break the mapping.
After a successful full sync, the plugin stores a synchronization baseline in plugin data. The baseline contains independent local and remote fingerprints. Those fingerprints include both title and body content.
On the next sync, LLM Wiki Sync compares the current local state against the baseline local state, and the current Notion state against the baseline remote state. It uses one four-state model:
CLEANLOCAL_ONLY_CHANGEDREMOTE_ONLY_CHANGEDCONFLICTSync current note pushes or pulls only when one side changed. If both sides changed, it stops and asks the user to choose which version to keep.
LLM Wiki Sync is available in the official Obsidian Community Plugins directory.
Settings -> Community plugins.Browse.LLM Wiki Sync.Install.Enable.Current public release: v0.9.1.
For development or manual testing, place the plugin folder at:
<vault>/.obsidian/plugins/llm-wiki-sync
Then enable it from Settings -> Community plugins.
Use a placeholder such as YOUR_NOTION_TOKEN in examples. Do not commit real tokens.
Test Notion connection.For old notes that already have notion_page_id but no v0.6 baseline, run Initialize sync baseline once before normal syncing.
Sync current note.Sync folder with Notion to choose a folder and reconcile that folder with Notion.Sync entire vault to reconcile the vault root.Keep ObsidianKeep NotionUnlinked local notes are created under the matching Notion folder hierarchy. Linked notes sync in the safe direction determined by the baseline state.
Use Sync folder with Notion to choose the vault root or any nested folder. The selected folder and its subfolders become the sync scope.
Folder sync performs a conservative reconciliation workflow:
During folder and entire-vault sync, a progress modal shows the current phase, current note or folder, processed note count, elapsed time, and live counters. A global sync lock prevents overlapping sync, push, repair, initialize, and audit operations while a sync run is active.
It does not delete Obsidian files, trash Notion pages, or automatically resolve conflicts. Ambiguous identity cases are reported and skipped.
Use Push current folder to Notion to export the active Markdown note's folder and subfolders. If the active note is in the vault root, the vault root is used.
Use Push entire vault to Notion to export all supported Markdown notes in the vault after confirmation. Folder hierarchy is preserved by creating Notion pages for folders from top to bottom, then creating Markdown note pages under their corresponding folder pages.
Bulk push keeps the same baseline conflict protection as single-note push:
notion_page_id frontmatter and a normal sync baseline.Folder-to-Notion page mappings are stored in plugin data, not in Markdown frontmatter. They are scoped to the configured Notion root page, so changing the root page creates or reuses a separate folder hierarchy. The vault root maps to the configured Notion root page and does not create an extra folder page.
Folder sync may create LLM Wiki Sync Review under the configured Notion root. A previously synced Notion page is moved to LLM Wiki Sync Review/Obsidian missing only when it has a sync baseline, has no local mapped note in the selected scope after mutation re-validation, and is not ambiguous. Unknown remote-only pages are reported, not moved.
The plugin does not automatically merge or choose the newest version. If both Obsidian and Notion changed since the last baseline, sync is blocked.
Use:
Resolve conflict — Keep ObsidianResolve conflict — Keep NotionAfter a successful resolution, the baseline is refreshed and the state returns to clean.
The command palette keeps the normal commands visible and groups troubleshooting workflows behind advanced pickers:
LLM Wiki Sync: Sync current noteLLM Wiki Sync: Push current note to NotionLLM Wiki Sync: Pull from NotionLLM Wiki Sync: Sync folder or vault...LLM Wiki Sync: Advanced tools...The advanced tools picker includes connection testing, grammar probing, media capability probes, media push dry-run, bulk push, hierarchy audit, mapping initialization, baseline initialization, debug mapping, and explicit conflict resolution.
These are intended for troubleshooting, migration, and explicit manual control. Sync current note is the recommended normal workflow.
LLM Wiki Sync is designed to avoid silent overwrites:
notion_page_id is the canonical mapping key.LLM Wiki Sync Pull/ and LLM Wiki Sync Review/ by default to avoid pushing system copies as duplicate hierarchy.v0.9.0 adds explicit conversion boundaries between Obsidian Markdown and Notion's Markdown API. Supported callouts, tables, highlights, underlines, and Notion block colors are converted before writes and normalized after pulls. Unknown but valid Notion callout icon/color combinations pull as a neutral Obsidian callout with a private HTML comment that preserves the original values for Push round-trips.
When content contains a Notion construct that cannot be reproduced safely, LLM Wiki Sync stops that operation and leaves both sides unchanged. This currently includes media, embeds, columns, tabs, databases, non-child page references, and related Notion objects unless covered by the image handling below.
v0.9.0 includes experimental support for pushing local images in Markdown notes to Notion in narrow, safety-first cases:
The plugin refuses image changes it cannot preserve, including adding, removing, reordering, recaptioning, table-embedded images, width or alias modifiers, external images, unsupported image formats, and files that require multipart upload.
notion_page_id and sync baselines remain the identity mechanisms..yaml and .yml files are not synchronized; Obsidian YAML frontmatter in Markdown notes is preserved for local mapping metadata.The Notion token is stored through Obsidian SecretStorage when available. It is not stored in plugin data.json.
The plugin sends requests to the Notion API only when the user runs connection testing, sync, folder sync, pull, push, bulk push, baseline initialization, debug lookup, or conflict resolution commands. It does not use analytics or telemetry.
Plugin data.json may contain Notion page IDs, folder mappings, root page configuration, sync baselines, Review quarantine records, and fingerprints. Do not publish user-specific plugin data.
From the plugin folder:
npm run build
The local Obsidian plugin needs main.js to run. Treat main.js as a generated release/build artifact according to the repository release workflow.
0.9.0
LLM Wiki Sync is licensed under the GNU General Public License v3.0 (GPL-3.0-only).