Changelog
v0.9.92 - April 2026
Section titled “v0.9.92 - April 2026”Pages with mentions and linked views now sync correctly.
Section titled “Pages with mentions and linked views now sync correctly.”If you have dashboards, MOCs, or hub pages that link out to other Notion pages and databases, this release fixes the cases where those references didn’t come through cleanly.
- Mentioned pages and database rows land in the right folder. When a page mentions a row from your Tasks DB, that row now appears under your Tasks DB folder instead of getting orphaned under the page that mentioned it. Before, you’d find duplicates scattered across
_Pages/for items that already belonged to a database. - Linked views automatically generate their
.basefile. A “linked view” is when you embed a filtered slice of a database into another page. Obsidian needs a.basefile to render those, and the plugin now generates it inline as part of the sync. No manual setup, no missing tables. - Mention-following stays sane on big pages. Inline mentions are followed once from your seed pages, not transitively. Pages with 80+ mentions no longer trigger workspace-wide BFS explosions that took ages to finish (or never did).
A subtle resolver bug that quietly stuck blocks as “unresolved.”
Section titled “A subtle resolver bug that quietly stuck blocks as “unresolved.””Some block references couldn’t be resolved on the first sync attempt — usually for legitimate reasons like the target hadn’t been fetched yet. The plugin was caching that “unresolved” state and re-using it on every future sync, so those blocks stayed permanently broken even after the underlying issue went away.
The cache now stores only successful resolutions. Failed resolutions are retried fresh on the next sync — when conditions change, the block resolves automatically without you having to reset anything.
Behind the scenes
Section titled “Behind the scenes”This release is heavy on discovery and apply-pipeline fixes for the gnarliest cross-reference cases. If you previously had pages where mentions came through as plain text or wikilinks that didn’t resolve, run Sync → Pull on the affected pages and they should pick up the new behavior.
v0.9.90 - April 2026
Section titled “v0.9.90 - April 2026”Big sync runs now feel alive instead of frozen.
Section titled “Big sync runs now feel alive instead of frozen.”The dashboard tells you what’s actually happening while a sync runs.
- Files appear as they land. The Recent Activity card on the dashboard now updates live during a sync. Before, it only refreshed after the run finished, so a 30-minute sync looked stuck on the previous run’s items the whole time.
- Hero gauge fills smoothly. Open the dashboard mid-sync and the percentage ring animates up to where you are instead of teleporting. The ring also breathes gently while syncing so it reads as “working” at a glance.
- PASS 1 / PASS 2 chip. Selected pages get pulled first (PASS 1) so your vault starts filling fast, then a second pass picks up nested child pages and databases (PASS 2). The chip in the hero tells you which pass you’re on.
- Per-database progress. Each selected database in the Notion/ scopecard now shows “synced / total” while the run is active - e.g. “Books DB - 47 / 245” - so you can see which DBs are done and which are still working.
- Live file count. The “files” tile on the Notion/ scopecard reflects the actual
.mdcount in your vault as the sync writes new files. Before it sat at the count from the previous run until the current one ended.
Two data-loss bugs fixed.
Section titled “Two data-loss bugs fixed.”These are the kind of bugs that quietly eat content. Both gone now.
- Pages with 100+ blocks were getting silently truncated on certain Notion API code paths. Long pages now sync in full.
- YouTube and embed URLs were being saved as
.binfiles. If you had a YouTube video or Vimeo embed in a Notion page, the plugin tried to download the URL as a file, couldn’t figure out what kind of file it was, and saved it as a useless.bin. Embed URLs are now left as inline embeds, which Obsidian renders directly.
Cancel really cancels now.
Section titled “Cancel really cancels now.”The “Pause” buttons in the dashboard were misleading - clicking them actually cancelled the sync. They’ve been removed. The Cancel button is the only mid-sync control, and it’s honest about what it does.
If you cancel mid-sync, anything already written stays. The next run picks up from there.
Faster first sync on big workspaces.
Section titled “Faster first sync on big workspaces.”The plugin now starts writing your selected pages to disk while it’s still discovering nested content. Big initial syncs feel responsive from the first few seconds instead of staring at “Discovering…” for minutes.
Re-runs are also leaner - the second pass reuses block data fetched during the first pass, cutting Notion API calls roughly in half.
Factory reset really resets.
Section titled “Factory reset really resets.”If you used “Reset N2O” in v0.9.39 or earlier, the dashboard could keep showing a “still synced” record for a page that was already cleared from the database. The leftover entry would clear on the next plugin reload but was confusing in the meantime. Reset is now consistent - everything is gone the moment it returns.
Linked-view databases render correctly again.
Section titled “Linked-view databases render correctly again.”Nested linked database views (the ones that show another database’s pages inside the current page) were sometimes generating empty .base files because the discovery walk was only going one level deep. The walk now goes the full depth, so linked views render their items the first time around.
v0.9.39 - April 2026
Section titled “v0.9.39 - April 2026”A calmer Connect to Notion screen, and your sidebar gets its margins back.
Section titled “A calmer Connect to Notion screen, and your sidebar gets its margins back.”A small follow-up to v0.9.38. Two fixes you’ll notice the first time you open the dashboard.
”Connect to Notion” no longer surprises you.
Section titled “”Connect to Notion” no longer surprises you.”When you click Connect to Notion, the dashboard now shows a calm “Approve in Notion.” screen for a few seconds before the browser actually opens. Same screen explains what’s about to happen (“Opening Notion in your browser in a moment…”) so the OAuth tab doesn’t pop up unannounced.
The waiting screen is also focused now - no more “What you get” card or marketing copy underneath the spinner. Once you’ve clicked Connect, you don’t need to be sold the feature again. Just the status, the timeout, and a clear “Cancel and go back” link if you change your mind.
If you cancel during the first few seconds, the browser tab never opens.
Fixed: the connected dashboard had a horizontal scrollbar.
Section titled “Fixed: the connected dashboard had a horizontal scrollbar.”If you connected to Notion in v0.9.38, you may have noticed the dashboard’s right edge had no padding and a horizontal scrollbar at the bottom. That’s gone. The connected view now lines up cleanly inside the sidebar, same as the connect screen.
This was a CSS specificity slip from a refactor in v0.9.38. The “Not connected” hero never had the bug, only the connected view.
v0.9.38 - April 2026
Section titled “v0.9.38 - April 2026”Conflicts that read like English, motion that respects your settings, and a quieter sync engine.
Section titled “Conflicts that read like English, motion that respects your settings, and a quieter sync engine.”A maintenance release. Most of the work this round is invisible - faster lookups, smaller memory ceilings, fewer wasted round-trips. The user-visible parts:
The conflict modal speaks English now.
Section titled “The conflict modal speaks English now.”When N2O detected the same page edited in both Notion and Obsidian it used to show you a panel labeled “Base (Ancestor)” and ask you to “Accept Notion / Accept Obsidian”. The wording read like a merge algorithm spec. It now reads like a sentence:
- “This page was edited in both places” instead of “Resolve Conflict”
- “Last synced” / “Now in Notion” / “Now in Obsidian” panels instead of “Base (Ancestor)” / “Notion Version” / “Obsidian Version”
- “Use Notion’s version” / “Use Obsidian’s version” / “Decide later” instead of “Accept Notion” / “Accept Obsidian” / “Skip”
Same flow, same outcomes. Easier to read at a glance.
N2O now respects “Reduce motion” in your OS settings.
Section titled “N2O now respects “Reduce motion” in your OS settings.”If you have macOS Reduce Motion or Windows “Show animations” turned off, every pulse, shimmer, slide-in, and progress sweep across the plugin now collapses to near-zero duration automatically. Useful for vestibular disorder / motion sensitivity, and faster on slow hardware. The plugin’s own buttons still register state changes - they just don’t visibly animate.
Tree picker filter is much faster on big workspaces.
Section titled “Tree picker filter is much faster on big workspaces.”When you opened the sync picker and started typing in the filter box, the entire tree used to be destroyed and rebuilt on every keystroke. On a workspace with hundreds of pages this made typing feel laggy. The picker now hides non-matching rows in place. Same result, no rebuild.
Less wasted CPU during sync.
Section titled “Less wasted CPU during sync.”Two background quality-of-life fixes:
- The block cache now reflects the current Notion state even when a push fails partway through. Pre-fix, a failed push left the cache stale and every subsequent push for that page paid an extra Notion API round-trip.
- The internal sync state is read 15+ times per sync cycle. Those reads now share a cached result that invalidates on every write. Noticeable speedup on workspaces with hundreds of synced pages.
Bigger media uploads stop bloating memory.
Section titled “Bigger media uploads stop bloating memory.”The download cache used to bound itself by entry count only. 200 large videos in a row could push memory past 1GB on a slow connection. The cache is now byte-bounded (200MB total ceiling, 25MB per item), so memory stays predictable regardless of what you’re syncing.
Permanent sync failures no longer hide silently.
Section titled “Permanent sync failures no longer hide silently.”When a page failed to sync 5 times in a row, the retry queue used to drop it without a sound. Now the sync record’s last error message gets updated to “Permanently failed after N retries: …” so you can see in the dashboard which pages are stuck and why.
Behind the scenes.
Section titled “Behind the scenes.”- Long-range block moves (more than 25 positions) keep their Notion block IDs. Pre-fix, these became delete-and-reinsert which dropped comments and threads attached to those blocks.
- The frontmatter writeback loop is closed. Pages with
created/updated/notion_id/n2o_*fields no longer trigger a spurious second push just because the post-push writeback shifted those bytes. - Schema migration errors that aren’t “duplicate column name” (disk full, lock contention, real corruption) now surface instead of being silently caught.
If you hit any of these in the past month, retry after updating. Nothing in your settings needs to change.
v0.9.37 - April 2026
Section titled “v0.9.37 - April 2026”Connect to Notion works again on Edge / Win 11.
Section titled “Connect to Notion works again on Edge / Win 11.”A few of you ran into “Invalid session ID format” when you went through Quick Connect on Microsoft Edge. The Notion login worked, the page-picker worked, the browser even showed the “Redirecting to Obsidian” screen - but the moment Obsidian came back to the front, the connection failed with that error and you were stuck.
That’s fixed. Edge sometimes hands the obsidian:// link back with extra whitespace tucked onto the end, and the plugin used to reject anything that wasn’t an exact 64-character match. It now trims whitespace and accepts a wider range of session shapes, so the hand-off from your browser back into Obsidian works whether you’re on Edge, Chrome, Firefox, or Arc.
If you hit this in the past week, retry Quick Connect after updating. Nothing on your side needs to change.
v0.9.36 - April 2026
Section titled “v0.9.36 - April 2026””Sync current file” you can finally trust, plus bookmarks that survive push.
Section titled “”Sync current file” you can finally trust, plus bookmarks that survive push.”A rolling release of everything that’s landed since v0.9.32. Nothing in your settings needs to change.
”Sync current file” picks up your latest edit, every time.
Section titled “”Sync current file” picks up your latest edit, every time.”If you ever ran “Sync current file” right after editing the same page on both sides, you might have noticed nothing happened, or the wrong side won, or your local edit just disappeared. All three are fixed now.
Two things changed:
- Silent local-edit loss is gone. If both sides had changes and
you ran “Sync current file”, N2O used to overwrite your local
edit without warning. Now it always preserves the discarded
version next to the file as a
.conflict-*.md(or shows the conflict modal if you’re on the Ask strategy). - Same-minute edits are no longer missed. When an Obsidian edit and a Notion edit landed in the same minute, N2O used to think nothing had changed and skip the sync entirely. Now it always reads Notion fresh and decides from the actual content, not from a timestamp.
What “Sync current file” does now:
- Nothing changed -> skip
- Only Notion changed -> pull the new version into your vault
- Only your local file changed -> push your edit up to Notion
- Both sides changed -> three-way merge, with a
.conflict-*.mdbackup if there’s a real conflict
Background syncing (the scheduler, auto-push, fast-poll) is unchanged. Those run often enough that a missed sub-minute edit gets picked up on the next tick. This work targets the command you run yourself when you want a page synced right now.
Bookmarks survive push.
Section titled “Bookmarks survive push.”If you had a Notion page with rich bookmark previews, the ones with cover images, favicons, and page descriptions, every push used to quietly flatten them into plain URL text in your vault. The Notion side stayed fine. Your Obsidian copy didn’t. Pull again and they’d come back, but the next push would strip them again.
That’s fixed. Bookmarks now keep their cover image, favicon, title, and description through a full push-then-pull cycle.
v0.9.32 - April 2026
Section titled “v0.9.32 - April 2026”Sync you can trust. Push that feels fast.
Section titled “Sync you can trust. Push that feels fast.”If you’ve been holding back from using N2O for the two-way stuff - if you’ve been pulling from Notion but scared to push the other way because something always came back a little wrong - this is the release where you can stop holding back.
Every Notion block you care about now survives a round-trip cleanly. Images stop duplicating on every push. Attachments live in one tidy folder. The dashboard stops telling you you’re disconnected when you’re not. Edit-in-place pushes are measurably faster. Conflicts show you a modal instead of silently picking a side.
Nothing in your setup needs to change. Update, sync, and the fixes just start applying.
Your Notion pages come back looking like your Notion pages
Section titled “Your Notion pages come back looking like your Notion pages”For a while, some of Notion’s richer features would quietly lose shape when they came through Obsidian. A headerless table would get a header. A red-background callout would turn generic blue. A lettered list (a., b., c.) would flip to plain numbers on push. Those small papercuts are what made bidirectional sync feel untrustworthy, even when it was technically working.
v0.9.32 fixes that class of problem across the board.
- Tables keep their shape. Headerless Notion tables stay headerless. Row headers stay row headers. And when you edit a single cell and push, N2O updates that row instead of rebuilding the whole table from scratch.
- Toggles stay toggleable. That empty toggleable heading you made in Notion? The arrow’s still there after a round-trip.
- Lettered and roman lists stop turning into decimals.
a. b. c.staysa. b. c..i. ii. iii.staysi. ii. iii. - Colors stick. Red-background callouts stay red. Blue headings stay blue. Colored quotes, todos, equations, dividers - all of it keeps its color instead of resetting to default every time you push.
- Callouts keep their custom icon. That 🔁 or 🚧 or 💡 emoji you set as the callout icon - it stays that emoji. It used to reset to the generic blue info icon on every push.
- Code blocks keep their language. No more silent fallback to “plain text” on uncommon languages.
- Embeds stay embeds. Notion’s embed and bookmark blocks look similar but aren’t the same thing. They now preserve their type instead of flattening into each other.
- Synced-block references work. Referenced synced blocks from other Notion pages now survive round-trip as actual synced blocks instead of degrading into plain page links.
- Filenames with brackets stop leaking. If an image file is
named
My [2024] Notes.png, it embeds correctly instead of spilling “Notes.png]]” into the visible text.
Most of this works through invisible markers in source mode that let the parser reconstruct Notion-specific attributes on the next pull. You never see them in Live Preview or Reading view. Your content just keeps working.
Images stop duplicating on every push
Section titled “Images stop duplicating on every push”This one was the single most common complaint, and the fix is permanent. Before v0.9.32, every time you pushed an Obsidian note containing an image back to Notion, the image block got recreated from scratch. Push five times - your Notion page has five copies of the same image, your vault has five garbage attachment files with weird hash suffixes.
That’s done. Every synced block now carries a permanent identity marker, so the next push recognizes “this image is already in Notion, don’t add it again.” First-time push also works correctly: after the push, the local file picks up Notion’s authoritative IDs so the next push works too.
And the “download pending” placeholder that used to appear after pushing a new image? That’s gone. Images download as part of the push so the preview works immediately in your vault.
If you’ve been avoiding pushing notes because of this, try it again.
Push feels 1-2 seconds faster per edit
Section titled “Push feels 1-2 seconds faster per edit”When you edit an existing note and push it, N2O used to do a chunk of work it didn’t strictly need to - two extra round-trips to Notion to double-check things that hadn’t changed. It now notices when your local file is already in sync and skips that work.
Concretely: an edit-in-place push is 1.4 to 2.4 seconds faster than it was in v0.9.20. If you push often, it adds up.
The “Sync this file” command is also meaningfully better. It used to take a shortcut that could silently overwrite your local edits if Notion had also changed. It now runs the same real three-way merge that full sync does.
Attachments live in one folder now
Section titled “Attachments live in one folder now”Every synced image, PDF, and file now lands in a single shared folder
-
Notion/_files/at the root of your sync folder. No more per-page attachment folders sprinkled throughout your vault. -
Easier to back up. Back up one folder, you’ve got every attachment.
-
Easier to search. Every attachment is in one place.
-
Easier to audit. You can see at a glance what N2O has pulled.
-
Deduplicated automatically. If the same PDF is referenced from four different synced pages, it’s stored once and wikilinked from all four.
There’s a new opt-in Auto-organize toggle in Settings >
Attachments. If you’ve been loose about where images land in your
vault, turn it on and N2O will move stray vault-root media into
_files/ on the next sync. Nothing gets deleted; files are moved,
not copied.
Files larger than 20 MiB now upload correctly too - they used to
fail silently because Notion’s single-part upload endpoint caps at
20 MiB. N2O now uses the multi-part endpoint for anything larger.
PDFs and other attachments also render as proper embed wikilinks
(![[doc.pdf]]) so preview works in Live Preview and Reading view.
The dashboard tells the truth
Section titled “The dashboard tells the truth”A few small-but-grating trust issues with the sidebar panel are fixed:
- “Not connected” no longer shows when you’re connected. If you set your Notion token programmatically (via settings-set, template, or any path that skipped the in-app connect flow), the dashboard used to insist you weren’t connected. It now reads the token directly instead of trusting a stale cache.
- The scope card shows your actual scope. If you set sync scope to three specific pages, the card says three pages. It used to show whole-vault totals, which made it look like nothing was set up right.
- Recent Activity always has a surface. The activity feed used to vanish entirely when there was nothing recent. It now always shows something - empty-state copy, a placeholder, or your actual recent syncs.
- Stale red errors clear on success. A transient failure used to leave a permanent red error on the dashboard even after the next push succeeded. It now clears the moment things recover.
Sync does the honest thing when something’s ambiguous
Section titled “Sync does the honest thing when something’s ambiguous”- Conflicts are conflicts. If you edit a note in Obsidian while the same section changes in Notion, N2O used to occasionally pick one side and move on. Now you see a conflict modal with both versions and you choose.
- Archive actually archives. When you archive a page in Notion, the local sync record marks it as archived instead of quietly re-pulling the archived content as if nothing changed.
- Reset actually stops.
Reset N2Oused to kick off a scheduler tick and start a whole-workspace sweep before you had a chance to reconfigure. It now lands in a quiet state - reconnect at your own pace, no surprise pull starts in the background. - Mentions and block-links stop breaking on push. Text-only edits used to regenerate Notion block IDs on every push. Any @mention or block-link in Notion pointing at the edited block would silently break. Block IDs are now preserved through text edits; only the content actually changes.
- Per-page failures are visible. A single bad page in a large pull used to fail silently. It now shows up in Recent Activity with the specific page named, and goes into the retry queue to try again on the next tick.
- Schema drift is a warning, not a silent drop. If you push a row with properties that no longer exist in Notion, the drop used to be invisible. It now warns you in Recent Activity with the specific property names.
Errors stop spamming you
Section titled “Errors stop spamming you”A sync that hit 50 errors used to fire 50 toasts that piled up in the corner. Errors from the same sync cycle now consolidate into a single grouped notice with a count. One summary, not a flood.
Bigger files, larger workspaces
Section titled “Bigger files, larger workspaces”Rate-limited syncs used to get stuck in a weird state where 30 queued calls would fire against whatever the user was doing now, even though they’d been sitting around for a minute. Those stale calls now expire gracefully.
If Notion’s paginated discovery returns an incomplete response, N2O now detects the truncation and surfaces the partial state instead of treating it as “done.”
Extensively tested
Section titled “Extensively tested”Every fix above is verified end to end against a real Notion workspace on every build. Visual regression tests catch UI drift. Recovery tests intentionally damage the local database to confirm N2O handles it cleanly.
You won’t see any of that at runtime. It’s what keeps the fixes sticking.
v0.9.20 - April 2026
Section titled “v0.9.20 - April 2026”The dashboard is new. All of it.
Section titled “The dashboard is new. All of it.”v0.9.20 is a ground-up redesign of the N2O dashboard. The sidebar panel now feels like a calm, living product surface instead of a stack of settings rows. Every state the plugin can be in - not connected, connecting, connected, syncing, discovering, idle, success, error, paused - has its own hero scene, its own copy, its own motion. You glance at the panel and you know what N2O is doing.
A short list of what that means in practice:
- A hero gauge that breathes. The central N₂O ring gently pulses in a 2.6-second cadence so the panel always feels alive, even when nothing’s syncing. Inner and outer accent hairlines frame the track with a soft glow.
- A state pill at the top. “Not connected / Connecting / Connected / Syncing / Paused / All caught up” - the pill color-codes with the dot, so you always know the plugin’s mood at a glance.
- A radar scan, not a spinner. When N2O is discovering pages in your workspace, the ring becomes a live radar - sweeping hand, crosshair, bearing ticks, blinking blips, and a hot spot of light that the hand paints onto the ring as it rotates. See the next entry for the full story.
- Theme-aware everything. Every new surface reads well in both light and dark Obsidian themes. The hero gradient, gauge track, scope card, automation toggles, and shimmer levels are tuned per-theme so nothing looks washed out on white or muddy on dark.
- A consistent vertical rhythm. Scope card, Automation, Recent activity, and every section in Settings now share the same 14px internal padding and 16px external spacing. The dashboard and settings feel like the same design system instead of two.
The rest of this section unpacks the individual pieces.
Live radar while N2O scans your workspace
Section titled “Live radar while N2O scans your workspace”The dashboard plays a full radar animation in the hero while N2O is discovering pages in your Notion workspace - whether it’s the first scan after connecting, a kebab “Rediscover”, or the background refresh that fires when you open the tree picker. The radar has a rotating sweep fan, a bright hand, a crosshair reticle, eight bearing ticks that flash as the hand passes, blips that pulse in staggered sequence, and a concentrated hotspot of accent light that “paints” the ring wherever the hand is currently pointing - so the effect reads as “the hand is actively lighting the ring.”
Live progress flows into the hero subtitle as the scan runs: “Querying databases 6 of 11 / Exercises DB / Productivity Techniques…”. Small workspaces always get at least 10 seconds of visible scan, so even a five-page workspace shows the radar long enough for you to register it.
Connect to Notion is one continuous screen
Section titled “Connect to Notion is one continuous screen”Clicking “Connect to Notion” used to rebuild the whole panel three times - hero, then a bare waiting spinner, then a celebration screen, then the main dashboard. The flow now lives in a single hero panel where only the primary button morphs in place:
- Connect to Notion - solid orange CTA, ready to click.
- Connecting… - same position, button disabled, three dots shimmer in a ripple, a soft left-to-right highlight sweeps across the button, “Timeout in 1:54 / Cancel” appears below.
- ✓ Connected to <workspace> - button turns green, a check icon appears, a narrow progress bar counts down the 2-second hand-off to the main dashboard.
The pill at the top reflects the current state the whole time (Not connected / Connecting / Connected) so you always know where you are in the flow. One panel, three states, zero jarring rebuilds.
Tree picker joins the existing scan instead of starting a new one
Section titled “Tree picker joins the existing scan instead of starting a new one”Opening the tree picker while a discovery is already running used to show partial cached data with no indication more was coming. Now the picker joins the in-flight scan, shows the same “Querying databases…” progress banner the hero does, and loads the full tree once discovery finishes. There is exactly one discovery in flight across the plugin at any time - no matter how many places asked for it.
Factory Reset actually returns to first-install state
Section titled “Factory Reset actually returns to first-install state”Previous Factory Reset hand-listed a handful of fields to wipe, so newly-added settings (OAuth workspace ID, sync folder, property mappings, automation intervals, child-page flags, and more) silently persisted across resets. It now clears every profile field back to the shipping defaults. The confirmation modal also shows accurate copy for each variant - “Reset N2O” is explicit that it preserves your token and license; “Factory Reset” is explicit that it removes them.
Open sync log lands on the Activity tab
Section titled “Open sync log lands on the Activity tab”The “Open sync log” kebab item used to open the N2O plugin tab and leave you to click into Activity yourself. It now opens Settings > N2O > Activity directly, where Recent Activity and Sync History live.
Enable real-time sync from the kebab menu
Section titled “Enable real-time sync from the kebab menu”A new “Enable real-time sync” entry sits right next to “Enable auto-sync” in the dashboard kebab menu, so you can flip on bidirectional real-time without scrolling down to the Automation section.
Notion’s built-in callout icons render in Obsidian
Section titled “Notion’s built-in callout icons render in Obsidian”Callouts created in Notion with the new built-in icon picker (the coloured symbols like ☘, ⚗, 📌) used to render as generic “note” callouts with no icon. N2O now reads Notion’s icon name and inlines the matching emoji into the callout title, so the symbol you picked in Notion shows up in Obsidian.
Every Obsidian Base gets the full layout set
Section titled “Every Obsidian Base gets the full layout set”Each .base file N2O generates now ships with the same 7 built-in
view layouts (Table, Gallery, List, Board, Timeline, Compact,
Books) plus one view that matches what Notion shows. So even for a
simple Notion gallery, you get the full set of Obsidian Bases
layouts to explore your data - Board and Timeline views become
available for any database without any manual setup. The Manage
Base Views modal has a new “Apply N2O defaults” button that stamps
the same 7 layouts into any hand-created .base file.
v0.9.17 - April 2026
Section titled “v0.9.17 - April 2026”Real-time pull stays alive across pauses
Section titled “Real-time pull stays alive across pauses”Pausing sync, toggling real-time off and on, or switching settings no longer kills the real-time pull. Previously the first pause would silently drop the change listener, so every edit in Notion after that was invisible to Obsidian until a full plugin reload. Now callbacks survive every stop and start.
Unresolved linked views render cleanly
Section titled “Unresolved linked views render cleanly”When a child database block couldn’t be resolved on first sync, N2O used to write a multi-line [!missing] callout that could overwrite a real .base embed further down the page. Unresolved child databases now render as a stable placeholder embed (![[Untitled Database (<id>).base]]) that keeps a consistent filename across re-syncs and doesn’t destroy neighbouring content.
Stable filenames for linked views
Section titled “Stable filenames for linked views”Linked database views now get a deterministic name derived from their identity (Gallery - Parent Page (abc12345).base) rather than a title that can drift between syncs. The underlying block identity is cached for seven days so the same block keeps the same file even when Notion’s titles change or the view temporarily can’t be resolved.
Paragraph-before-database push fix
Section titled “Paragraph-before-database push fix”When you had a paragraph sitting right before a child-database embed on a Notion page, pushing from Obsidian used to drop the paragraph’s position anchor. The push now emits a sentinel that preserves the block’s location so the database stays where it should.
v0.9.14 - April 2026
Section titled “v0.9.14 - April 2026”75% faster sync with Views API
Section titled “75% faster sync with Views API”N2O now uses Notion’s official Views API to discover linked database views. Instead of scanning every page’s blocks to find linked views (254+ API calls), it makes 11 list calls plus one retrieve per view (~64 total). Discovery that took over a minute now takes seconds.
Linked views resolve without Enhanced Metadata
Section titled “Linked views resolve without Enhanced Metadata”The Views API gives N2O everything it needs to resolve linked database views: which database they point to, what page they live on, their view type, and which properties are visible. No unofficial API token needed. Pages that previously showed ”[!missing] Linked Database View” now render correctly for all users.
Gallery views show what Notion shows
Section titled “Gallery views show what Notion shows”Gallery card property visibility now comes from the official Views API. If your Notion gallery shows only cover images and titles, Obsidian matches. When Notion hasn’t customized a gallery (default view), N2O shows cover and title only - matching Notion’s clean default.
10 audit fixes
Section titled “10 audit fixes”A three-agent code audit found and fixed 10 issues: CSS injection vulnerability in bookmark covers, auto-push data safety guard when content hash is missing, format metadata round-trip (image width, code wrap, alignment survive push back to Notion), image width extracted from markdown, bookmark HTML cards parsed back for push, column width preserved with custom callout types, memory leak guard in link hover previews, extended column CSS range, and stable progress counter.
v0.9.12 - April 2026
Section titled “v0.9.12 - April 2026”Hover over any link to see a preview
Section titled “Hover over any link to see a preview”Move your mouse over any [[wiki link]] and a preview card appears: the page’s banner image, title, first paragraph, tags, and when it was last updated. No clicks needed, no navigation away from what you’re reading. Cards position themselves smartly so they never clip off the edge of your screen. Inspired by Wikipedia’s page previews and Arc Browser’s hover cards.
Bookmarks look like Notion
Section titled “Bookmarks look like Notion”Notion bookmarks render as clean cards with a title, description, site favicon, and cover image. N2O now does the same in Obsidian. Hover over a bookmark card to see the full cover image and description in a centered popup. All data comes from your synced Notion content, so there’s no loading delay and it works offline.
Columns match Notion’s layout
Section titled “Columns match Notion’s layout”If you set a 60/40 column split in Notion, it shows as 60/40 in Obsidian now. Previously all columns were equal width regardless of what Notion had. Images inside columns fill the available space instead of rendering at a fixed pixel size.
Gallery views show what Notion shows
Section titled “Gallery views show what Notion shows”If your Notion gallery only displays cover images and titles, the Obsidian Base now matches. N2O reads which properties are visible in each Notion view and hides the rest. No more cluttered card views showing every property.
Images at the right size
Section titled “Images at the right size”Images display at the width you set in Notion instead of full-width or a fixed 140px. Resize an image in Notion, sync, and Obsidian renders it at the same size.
Smarter failed download handling
Section titled “Smarter failed download handling”When media downloads fail, you can now see exactly which files failed and why (timeout, server error, empty response) right on the dashboard. Click Retry and only the failed pages re-sync, not your entire workspace. Large files get a 120-second timeout instead of 60.
Pull-only by default
Section titled “Pull-only by default”New installations start in read-only mode: Notion to Obsidian only. Nothing in Notion gets modified until you explicitly enable push in settings. When you do enable it, you’ll see a clear warning about what push does, and a confirmation dialog before pushing more than five pages.
Update notifications
Section titled “Update notifications”A small banner appears on the dashboard when a newer version of N2O is available. Check once a day, dismiss to hide. No more wondering if you’re running the latest.
Sync history in settings
Section titled “Sync history in settings”The separate Sync Log sidebar panel is gone. All your sync history, with expandable details per entry, now lives in Settings under the Activity tab.
Linked database views actually resolve
Section titled “Linked database views actually resolve”Pages that had placeholder [!missing] callouts for unresolved linked views now fix themselves. When the view gets resolved (through the unofficial API or the resolver modal), the page re-renders automatically instead of staying stuck with the placeholder.
v0.9.4 - April 2026
Section titled “v0.9.4 - April 2026”Relation filters trim cleanly
Section titled “Relation filters trim cleanly”Relation property page names with trailing spaces no longer break Bases filters. If a Notion relation pointed to “Project Alpha ” (with a trailing space), the filter would silently fail to match. Spaces are now trimmed automatically.
Unofficial API linked view detection fixed
Section titled “Unofficial API linked view detection fixed”Linked database views that were silently failing to resolve via the unofficial API now work correctly. View type detection (gallery, table, list) is also more reliable.
v0.9.3 - March 2026
Section titled “v0.9.3 - March 2026”Performance audit
Section titled “Performance audit”Cache invalidation is smarter and deferred warmup reduces startup time. Part of a broader performance sweep across the sync pipeline.
BRAT install method
Section titled “BRAT install method”You can now install N2O via BRAT for beta testing. Instructions added to the README.
v0.9.2 - March 2026
Section titled “v0.9.2 - March 2026”Settings redesign
Section titled “Settings redesign”The settings page is cleaner and better organized. Sync settings are more compact, the Advanced tab is tidied up, and a shared footer with version info appears across all tabs.
Dashboard polish
Section titled “Dashboard polish”Advanced buttons are flattened into the main layout instead of hidden behind a submenu. The dashboard footer now shows version and helpful links.
Enhanced Metadata moved to Connection tab
Section titled “Enhanced Metadata moved to Connection tab”The Enhanced Metadata toggle (for unofficial API features like view detection and linked view resolution) is now in the Connection tab where it belongs, not buried in Advanced.
v0.9.1 - March 2026
Section titled “v0.9.1 - March 2026”Security and quality audit
Section titled “Security and quality audit”A full 360-degree audit covering security fixes, test coverage improvements, and code quality cleanup. Nothing user-facing changed, but the codebase is significantly more robust.
WASM fallback for sql.js
Section titled “WASM fallback for sql.js”If the bundled sql-wasm.wasm file fails to load, N2O now falls back to a CDN copy. This fixes a rare issue where the database engine couldn’t start on some systems.
v0.9.0 - March 2026
Section titled “v0.9.0 - March 2026”One-click Notion connect
Section titled “One-click Notion connect”No more hunting for integration tokens. Connect to Notion with OAuth - click “Connect”, authorize in your browser, and you’re syncing. Manual tokens still work if you prefer them.
Child pages nest into folders
Section titled “Child pages nest into folders”When a Notion page has child pages, N2O now mirrors that hierarchy in your vault. The parent becomes both a markdown file and a folder containing its children - browse your Notion structure the same way in Obsidian.
Linked database views sync as filtered Bases
Section titled “Linked database views sync as filtered Bases”Database item pages that contain linked views (like a filtered gallery or table inside a Relationships page) now generate filtered .base files. Each linked view is its own Bases file, organized into a _views/ subfolder. You see exactly the data that Notion shows - not the entire database. Requires Enhanced Metadata.
Default Bases view auto-detected from Notion
Section titled “Default Bases view auto-detected from Notion”N2O reads which view is set as default in Notion and uses that as the default view in your .base file. No manual configuration needed. Requires Enhanced Metadata.
Push sync that doesn’t destroy your pages
Section titled “Push sync that doesn’t destroy your pages”N2O now protects Notion-hosted images, videos, and PDFs during push. Uploaded media stays untouched even when you edit the surrounding text in Obsidian. Inline database views (like linked gallery or table views inside a page) are also preserved.
Automatic conflict merging
Section titled “Automatic conflict merging”When you edit a page in both Obsidian and Notion, N2O tries to merge the changes automatically. If your edits are in different parts of the page, they merge silently - no interruption. The conflict modal only appears when N2O genuinely can’t decide.
Delete from Notion
Section titled “Delete from Notion”New command: trash a page in Notion and delete the local file in one action. Works from the file menu, command palette, or multi-file selection. Confirmation step so nothing gets deleted by accident.
Smarter same-minute conflict detection
Section titled “Smarter same-minute conflict detection”Notion timestamps only update once per minute. N2O now compares content instead of clocks when both sides were edited close together - so you don’t get a false conflict just because you saved twice in the same minute.
H4 heading support
Section titled “H4 heading support”Notion’s heading_4 block type is now fully supported in both directions. Use #### in Obsidian and it syncs to Notion as a proper H4 - and vice versa.
Typed embeds preserved
Section titled “Typed embeds preserved”Embeds with specific types - tweets, Google Maps, Figma, Google Drive, GitHub Gist, Miro, CodePen, Replit, Excalidraw - now round-trip correctly through sync. The embed type and URL are preserved so they stay linked to the right service. Requires Enhanced Metadata.
Pagination in the pages picker
Section titled “Pagination in the pages picker”Browsing large Notion workspaces in the tree picker now shows a “Load More” button instead of trying to load everything at once. Search also queries across all your Notion pages - not just ones you’ve previously synced.
Reset button
Section titled “Reset button”A new Reset button in the dashboard clears all sync state, block cache, and retry queue while keeping your Notion connection and license intact. Useful for starting fresh or recovering from an unusual state.
File property images display at proper size
Section titled “File property images display at proper size”Images from Notion’s files-type properties now display at their natural size. Width is determined by Notion’s format data when the unofficial API is enabled.
v0.8.0 - February 2026
Section titled “v0.8.0 - February 2026”Obsidian Bases views from your Notion databases
Section titled “Obsidian Bases views from your Notion databases”Every Notion database you sync now generates a native Obsidian Bases .base file - table, cards, and list views with your actual properties, filters, and sorts. No Dataview plugin required. Your databases look like databases, not just folders of markdown files.
Auto-push: Obsidian edits sync back to Notion automatically
Section titled “Auto-push: Obsidian edits sync back to Notion automatically”Edit your markdown in Obsidian and changes push to Notion automatically after a short delay. This is the live bidirectional half - your vault and Notion workspace stay in sync without manually triggering a push (Pro).
Fast-poll near real-time sync
Section titled “Fast-poll near real-time sync”A lightweight scheduler checks for Notion changes every 30 seconds on recently active pages. When something changes, it syncs immediately - without the overhead of a full workspace scan (Pro).
Push only syncs what changed
Section titled “Push only syncs what changed”Editing a heading no longer rewrites your entire Notion page. N2O diffs at the block level and only updates what actually changed - faster syncs, fewer API calls, and Notion block IDs stay stable.
Persistent retry queue
Section titled “Persistent retry queue”If a sync fails because Notion is temporarily down or rate-limited, N2O queues the operation and retries automatically - starting at 30 seconds, backing off up to 15 minutes, up to 5 attempts. Nothing gets silently dropped.
Multiple Notion workspaces (coming soon)
Section titled “Multiple Notion workspaces (coming soon)”Sync more than one Notion workspace from the same Obsidian vault - each with its own profile, database selection, and sync settings. The foundation is already built: storage is fully workspace-isolated and profile management is in place. Full UI for adding, switching, and managing workspaces is in progress.
Column layouts
Section titled “Column layouts”Notion pages with multi-column layouts now sync correctly. Columns appear as organized content in Obsidian and round-trip back to Notion without losing structure.
Filter what you sync, per database
Section titled “Filter what you sync, per database”Don’t want to sync every row in a large database? Set per-database filters in settings - by status, tag, owner, date, or any property. Only matching items sync.
Rename and reshape frontmatter properties
Section titled “Rename and reshape frontmatter properties”Map Notion properties to any frontmatter key name you want. Rename, reorder, exclude, or change the format. Your vault structure doesn’t have to mirror Notion’s.
Custom page templates
Section titled “Custom page templates”Define how synced pages look using templates with {{property.Name}}, {{body}}, conditional blocks, and loops. One template per database, stored in _templates/n2o/.
Side-by-side conflict resolution
Section titled “Side-by-side conflict resolution”When a conflict does need your input, a clear modal shows Notion’s version and your Obsidian version side by side. Accept one, accept the other, or take the auto-merged result. Resolve multiple conflicts in one pass.
Toggle headings look like headings
Section titled “Toggle headings look like headings”Toggle headings (H1/H2/H3 with a collapse arrow in Notion) now display with proper heading styles in Obsidian, not as plain text. They collapse and expand just like Notion’s.
PDFs and files open as links
Section titled “PDFs and files open as links”PDF and file attachment blocks now render as clean clickable links instead of full-size embeds, keeping your pages readable and fast.
Recover sync state from existing files
Section titled “Recover sync state from existing files”Already have synced files in your vault? “Scan Vault” reads their frontmatter metadata and rebuilds sync state - so N2O knows what’s already synced and won’t re-download everything or create duplicates.
All selected pages visible in picker
Section titled “All selected pages visible in picker”The tree picker now shows all currently-selected pages at a glance, so you can review your full sync scope before confirming.
v0.7.0 - January 2026
Section titled “v0.7.0 - January 2026”Initial release
Section titled “Initial release”- Pull sync - Notion pages and databases sync to Obsidian as markdown files with YAML frontmatter properties
- All block types - Headings, paragraphs, lists, toggles, callouts, code blocks, tables, quotes, dividers, images, videos, PDFs, file attachments, bookmarks, embeds, synced blocks, columns, and more
- All property types - Text, number, select, multi-select, date, checkbox, URL, email, phone, formula, relation, rollup, files, people, created/last edited time
- Media download - Images, videos, PDFs, and files saved locally in your vault with stable filenames
- Selective sync - Tree picker lets you choose exactly which pages and databases to sync; skip what you don’t need
- Incremental sync - Only pages changed since the last sync are re-fetched; first sync is fast, subsequent syncs are faster
- Database folders - Each Notion database becomes a folder; each database item becomes a markdown file with all its properties as frontmatter
- Auto-sync scheduling - Set a sync interval and N2O runs in the background automatically (Pro)
- Free tier - 100 items, pull sync, no time limit