NoteShift exports Notion content to Obsidian-friendly Markdown with predictable filenames, link rewriting, and checkpoint/resume support.
Teams migrating from Notion to Obsidian consistently report four pains:
- broken internal links after export
- inconsistent filenames and folder layout
- long exports failing midway without resume
- low confidence in migration correctness
NoteShift is focused on solving those pains first.
- Export a Notion page tree to Markdown
- Export Notion data sources/databases through API layer
- Rewrite internal links for Obsidian compatibility
- Preserve and download attachments
- Resume interrupted runs via checkpoint file
- Emit migration report (
migration_report.json+.md)
- Docs index:
docs/ - Start here: Getting started
- Library integration: API contract
uv tool install noteshift
# or
pipx install noteshiftuv tool install .
uv sync --extra dev --extra testSet a Notion integration token in NOTION_TOKEN.
export NOTION_TOKEN="secret_xxx"noteshift export \
--page-id "<notion-page-id>" \
--out ./export \
--max-depth 2 \
--overwriteA successful run writes:
- Markdown files for exported pages
- downloaded assets in the export tree
.checkpoint.jsonfor resumemigration_report.jsonmigration_report.md
uv sync --extra dev --extra test
uv run ruff format .
uv run ruff check .
uv run mypy src
uv run pytest --cov=noteshift --cov-report=termContract tests are deterministic and replay HTTP traffic from sanitized cassettes:
uv run pytest -m contractTo re-record cassettes intentionally, set a real token in your environment and run:
VCR_RECORD_MODE=once uv run pytest -m contractMIT