Skip to main content
version 2.5.2
FREE

notion2obsidian

Fast Notion to Obsidian migration.
Clean, simple, minimal dependencies.

notion2obsidian
$ notion2obsidian Export-*.zip ~/synced/Notion
๐Ÿ’Ž Notion 2 Obsidian v2.5.0
๐Ÿ“ฆ Extracting 1 zip files...
โœ“ Extracted 2089 files
Found 1177 markdown files
Found 233 directories
โš  112 duplicate filenames
โ•โ•โ• MIGRATION PREVIEW โ•โ•โ•
๐Ÿ”— Convert ~5650 markdown links
๐Ÿ“Š Process 109 CSV databases
Phase 2: Executing migration...
โœ“ Processed 1177 files, converted 370 links
โœ“ Converted 23 Notion callouts
โœ“ Created 58 database indexes from 109 CSV files
โœ“ Moved 178 files into attachment folders
โœ… Migration complete! Processed 1.71 GB in 1.7s

Why notion2obsidian?

โšก

Lightning Fast

Migrate your entire workspace in seconds. Batch processing with concurrent operations handles thousands of files effortlessly.

๐Ÿ“ฆ

Zero-Friction Setup

Extract and migrate zip files in one command. Preview changes with dry-run mode. No manual extraction, no backups cluttering your workspace.

๐Ÿ”—

Perfect Migration

Smart link conversion, auto-tagging, frontmatter generation, callout conversion, database processing with Dataview support, and duplicate handling. Everything works in Obsidian from day one.

Who is this for?

๐Ÿ”„

Notion Refugees

Making the switch to Obsidian for better performance, offline access, or local-first control? Migrate your entire workspace in seconds.

๐Ÿง 

Second Brain Builders

Years of notes in Notion but want Obsidian's graph view, backlinks, and plugin ecosystem? Keep your structure intact during migration.

โš™๏ธ

Automation Enthusiasts

Need a scriptable, CLI-based migration that you can run on multiple exports or integrate into workflows? Built for the command line.

What it does

๐Ÿงน

Cleans filenames

Removes 32-character Notion IDs from files and directories

My Document 2d6fa1e585714845.md
โ†’
My Document.md
๐Ÿ“

Adds frontmatter

Generates YAML metadata including title, tags (auto-generated from folder structure), and Notion IDs

---
title: "My Document"
tags: [projects, work]
notion-alias:
  - "My Document 2d6fa1e585714845"
notion-id: "2d6fa1e585714845be81f7d5ca30194a"
published: false
---
๐Ÿ”—

Converts links

Transforms markdown links to Obsidian wiki links

[text](file.md)
โ†’
[[file|text]]
๐ŸŽฏ

Handles duplicates

Uses folder context to disambiguate files with identical names

folder: "Work/Projects"
๐Ÿ“ฆ

Organizes attachments

Moves markdown files into their attachment folders and simplifies image paths

![Image](My%20Doc%202d6fa1e5/img.png)
โ†’
![Image](img.png)
๐Ÿ’ฌ

Converts callouts

Transforms Notion callouts with icons to Obsidian format

<aside>...</aside>
โ†’
> [!note] ๐Ÿ“˜ Content
๐Ÿ“Š

Organizes databases

Creates clean CSV files with Dataview-compatible index pages showing all records

Default structure:
Tasks.csv (clean file)
Tasks_Index.md (Dataview query)
Tasks/_data/ (individual pages)

๐Ÿ“ฆ Requires: Dataview plugin

Get Started ~90 seconds

Why Bun? This tool is built with Bun, a modern JavaScript runtime that's significantly faster than Node.js. Bun handles thousands of files in seconds and provides native TypeScript support. Installing Bun takes just one command and won't interfere with your existing Node.js setup.

1

Install Bun runtime

Bun is a fast JavaScript runtime. If you already have it, skip to step 2.

curl -fsSL https://bun.sh/install | bash
2

Install notion2obsidian

Install the tool globally to use it anywhere.

bun install -g notion2obsidian
3

Export from Notion

In Notion: Settings & Members โ†’ Export โ†’ Export all workspace content โ†’ Markdown & CSV

4

Run the migration

Point to your downloaded zip file with optional output directory.

notion2obsidian Export-*.zip ~/Documents/Obsidian
Preview first: add --dry-run
5

Open in Obsidian & Install Dataview

Create a new vault and install the Dataview plugin for database features.

Common Questions

? Will this modify my original Notion export?

Your original .zip file is never modified. The tool extracts it to a temporary location, moves files to the output directory (specified with -o or created next to the zip), then cleans up the temp folder. The migration modifies only the output directory. Use --dry-run to preview changes before committing.

? What if I have duplicate filenames?

The tool handles duplicates in two ways:

1. Files in different folders: Folder context added to frontmatter
Work/Projects/README.md:
---
folder: "Work/Projects"
---

Personal/Notes/README.md:
---
folder: "Personal/Notes"
---
2. Naming conflicts: Sequential suffixes (-1, -2, etc.)
Untitled 888cfab6.md  โ†’  Untitled-1.md
Untitled 85f75240.md  โ†’  Untitled-2.md
Untitled 985c88c5.md  โ†’  Untitled-3.md

? Do I need to extract the zip file first?

No! Just point notion2obsidian at the .zip file and it will extract and migrate in one step.

? What about images and attachments?

All images, PDFs, and other attachments are preserved and organized. Files with attachments are moved into their attachment folders for better organization:

Before:
My Document.md
My Document 2d6fa1e5/
  image1.png
  image2.png
After:
My Document/
  My Document.md  โ† moved inside
  image1.png
  image2.png
Image paths simplified from My%20Document/image.png to just image.png

? Do I need any Obsidian plugins?

For database features: Install the Dataview plugin to view and query your Notion databases. Without it, database index pages will only show raw query code instead of interactive tables.

For cover images (with --enrich): Install the Obsidian Banners plugin to display cover images enriched from Notion. Covers are downloaded to _banners/ folder.

For icons (with --enrich): Install the Iconize plugin to display emoji and image icons enriched from Notion. Emoji icons work immediately; image icons are downloaded and configured automatically.

Install in Obsidian: Settings โ†’ Community plugins โ†’ Browse โ†’ Search plugin name โ†’ Install & Enable

? How do I enrich my vault with Notion API metadata?

The --enrich flag adds creation dates, last edited times, public URLs, and downloads cover images from Notion. Here's how to set it up:

Step 1: Get your Notion Integration Token
  1. Go to notion.so/my-integrations
  2. Click "New integration" and give it a name (e.g., "Obsidian Migration")
  3. Under "Capabilities", enable "Read content"
  4. Copy the "Internal Integration Secret" (starts with ntn_ for new tokens)
Step 2: Grant access to your pages
  1. Go to notion.so/profile/integrations/internal/
  2. Select your integration
  3. Choose pages to share (select both private and shared pages you want to enrich)
๐Ÿ’ก Note: Integration must be internal (not public)
Step 3: Set environment variable
Temporary (current session only):
export NOTION_TOKEN="ntn_xxx"
Permanent (add to shell config):
# For bash
echo 'export NOTION_TOKEN="ntn_xxx"' >> ~/.bashrc
source ~/.bashrc

# For zsh
echo 'export NOTION_TOKEN="ntn_xxx"' >> ~/.zshrc
source ~/.zshrc
Step 4: Run enrichment
cd ~/Documents/Obsidian/MyVault
notion2obsidian . --enrich

? Can I undo the migration?

Yes. Your original .zip file is never touched. Simply delete the output directory and run the migration again to start fresh. The tool automatically cleans up temporary files, so you only need to manage the output directory.

โ†‘