Skip to main content

Migrate your Obsidian vault to AppFlowy — structure, images, and tables included

Project description

obsidian-to-appflowy

PyPI version Python License

Move your Obsidian vault into AppFlowy in one command.


A CLI tool for migrating Obsidian vaults into AppFlowy. It walks your vault, converts markdown to AppFlowy blocks, and uploads everything through the AppFlowy API — folders become nested pages, images get re-hosted, wikilinks become page links.

Built for one-time migrations. Your Obsidian files are never modified.

Before you start

  1. Python 3.11+pip install obsidian-to-appflowy
  2. An AppFlowy account on AppFlowy Cloud or your own deployment
  3. Your vault folder — the directory you opened in Obsidian

⚠️ Run --dry-run first to preview without touching anything.

What gets migrated

Obsidian AppFlowy
Folders Nested pages
Headings # ## Heading blocks (levels 1–6)
Bullet and numbered lists (nested) List blocks with children
Blockquotes > Quote blocks
Fenced code blocks Code blocks with language
Horizontal rules --- Divider blocks
Markdown tables simple_table blocks
bold, italic, strike, code, ==highlight==, [links] Inline formatting
Frontmatter --- ... --- Preserved as a YAML code block at the top
Wikilinks [[Note]] / [[Note|Alias]] Page links (clicking navigates to the page)
![[img.png]], ![alt](path) Uploaded image blocks
- [ ] / - [x] tasks Todo blocks (checked state preserved)

Try the example vault first

Not sure what to expect? Clone the repo and run try a dry-run on the included vault — it covers every supported block type (headings, lists, tables, code, images, wikilinks, tasks…):

git clone https://github.com/vsgusev/obsidian-to-appflowy
cd obsidian-to-appflowy
obsidian-to-appflowy --vault example_vault --dry-run

Or import it to AppFlowy to see the real result before touching your own notes:

obsidian-to-appflowy --vault example_vault --url https://cloud.appflowy.io --email you@example.com

Usage

Preview locally (no account needed):

# replace ~/Documents/MyVault with the absolute path to your vault
obsidian-to-appflowy --vault ~/Documents/MyVault --dry-run

Import to AppFlowy Cloud:

# for self-hosted, swap --url for your gateway, e.g. http://192.168.1.10:8800
obsidian-to-appflowy --vault ~/Documents/MyVault --url https://cloud.appflowy.io --email you@example.com

Password is prompted if not passed via --password or $APPFLOWY_PASSWORD.

Options

Flag Default
--vault PATH required Obsidian vault root
--url URL required for import AppFlowy API base URL
--email EMAIL $APPFLOWY_EMAIL Account email
--password PASS $APPFLOWY_PASSWORD / prompt Account password
--space NAME Obsidian Space name in AppFlowy
--space-color HEX #00BCF0 Space icon color
--skip-images off Text-only import, no uploads
--dry-run off Preview without API calls

Limitations

  • Tags#tag stays as plain text
  • Callouts> [!NOTE] becomes a plain quote block
  • Plugins — Dataview, Kanban, Excalidraw and other plugin syntax appear as plain text
  • Duplicate image filenames — if two images share a name, only one is used; a warning prints to stderr
  • Edge cases:
    • Duplicate page names — wikilinks resolve by filename stem, so [[Note]] is ambiguous if two Note.md exist in different folders (the first one wins)
    • [[Note#Section]] and [[Note^block]] link to the page itself; the section/block target is dropped
    • YAML frontmatter with a --- line inside a value may be only partially captured
    • Fenced code indented under a list bullet is not detected as a code block

Development

pip install -e ".[dev]"
pytest

Contributing

Open an issue before sending a PR. No AI-generated PRs.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

obsidian_to_appflowy-1.1.0.tar.gz (21.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

obsidian_to_appflowy-1.1.0-py3-none-any.whl (21.5 kB view details)

Uploaded Python 3

File details

Details for the file obsidian_to_appflowy-1.1.0.tar.gz.

File metadata

  • Download URL: obsidian_to_appflowy-1.1.0.tar.gz
  • Upload date:
  • Size: 21.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.6

File hashes

Hashes for obsidian_to_appflowy-1.1.0.tar.gz
Algorithm Hash digest
SHA256 17da4451ebb79196534cad71afab0cde9a552cd3b79ca6ef6182baa2147c66fd
MD5 c16e00a42ea2781b7111c89ce711d99c
BLAKE2b-256 fc48e497edab772ee846bdca0e5255c34064f99a9b65e9c1ba571c2dfcba2d9f

See more details on using hashes here.

File details

Details for the file obsidian_to_appflowy-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for obsidian_to_appflowy-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fe470f27406c4e00f95fb594c2607a6c48cd9fd4e08f7c8afb5b6cb14912d0af
MD5 09244e419665d4e5b7cdb5ce16968a85
BLAKE2b-256 539393d8e93b7312ae3ceea5791a9d6fdf5371d8e9417c6eaee10fa08774955e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page