{"id":16547487,"url":"https://github.com/gustavocaso/n2o","last_synced_at":"2025-09-22T23:31:51.711Z","repository":{"id":221044207,"uuid":"753294079","full_name":"GustavoCaso/n2o","owner":"GustavoCaso","description":"Notion to Obsidian migrator","archived":false,"fork":false,"pushed_at":"2025-09-13T15:30:24.000Z","size":174,"stargazers_count":7,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-13T16:26:31.050Z","etag":null,"topics":["migrator","notion","obsidian","tool"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GustavoCaso.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-02-05T20:52:23.000Z","updated_at":"2025-08-20T08:51:46.000Z","dependencies_parsed_at":"2024-10-23T11:23:43.560Z","dependency_job_id":null,"html_url":"https://github.com/GustavoCaso/n2o","commit_stats":null,"previous_names":["gustavocaso/n2o"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/GustavoCaso/n2o","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GustavoCaso%2Fn2o","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GustavoCaso%2Fn2o/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GustavoCaso%2Fn2o/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GustavoCaso%2Fn2o/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GustavoCaso","download_url":"https://codeload.github.com/GustavoCaso/n2o/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GustavoCaso%2Fn2o/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276489777,"owners_count":25651605,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-22T02:00:08.972Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["migrator","notion","obsidian","tool"],"created_at":"2024-10-11T19:14:32.157Z","updated_at":"2025-09-22T23:31:51.705Z","avatar_url":"https://github.com/GustavoCaso.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Notion To Obsidian migrator (n2o)\n\nMigration tool for your Notion workspace to Obsidian.\n\nThe current importer tool landscape usually requires you to import your entire workspace, does not allow you to select which page properties you would like to import, or fails to create a link between pages. \n\nWith `n2o`, you have complete control over what you import from your Notion workspace to your Obsidan vault.\n\n\n## Install\n\nDownload the `n2o` artifact from the [releases page](https://github.com/GustavoCaso/n2o/releases).\n\n## Usage\n\n```\n$ n2o\nUsage of n2o:\n  -download-images\n    \tdownload external images to the Obsidian vault\n  -notion-db-ID string\n    \tNotion database to migrate\n  -notion-page-ID string\n    \tNotion page to migrate\n  -notion-token string\n    \tNotion token\n  -page-name string\n    \tNotion page properties to extract the Obsidian page title.\n    \tSupport selecting different page attributes and formatting. To select multiple properties, use a comma-separated list.\n    \tThe attributes that support custom formatting are Notion date attributes.\n    \tExample of how to use a Notion date property with custom format as the title for the Obsidian page:\n    \t-name=date:%Y/%B/%d-%A\n\n    \tBy default if you do not configure any we get the Title property\n\n  -page-properties string\n    \tNotion page properties to convert to Obsidian frontmater.\n    \tYou can select multiple properties using a comma-separated list.\n\n  -save-to-disk\n    \twrite the pages in the Obsidian vault\n  -vault-folder string\n    \tfolder to store pages inside the Obsidian Vault\n  -vault-path string\n    \tObsidian vault location\n```\n\n## How do you get your Notion token?\n\nTo get your Notion token, you either have to create an integration or use an existing integration that has access to the workspace you want to migrate. The Notion website has many resources.\n\n- [What is an Integration](https://developers.notion.com/docs/getting-started#what-is-a-notion-integration)\n- [Build your first integration Guide](https://developers.notion.com/docs/create-a-notion-integration)\n\nOnce your integration is installed in your workspace, we can migrate single pages or complete databases to our Obsidian vault.\n\n## How do I get the database ID?\n\nCopied from the Notion website: [Retrieve a database](https://developers.notion.com/reference/retrieve-a-database)\n\n\u003e To find a database ID, navigate to the database URL in your Notion workspace. The ID is the string of characters in the URL that is between the slash following the workspace name (if applicable) and the question mark. The ID is a 32 characters alphanumeric string.\n\n![databaseID](img/databaseID.png)\n\n## How do I retrieve the Page ID?\n\nCopied from the Notion website: [Working with page content](https://developers.notion.com/docs/working-with-page-content)\n\u003e Here's a quick procedure to find the page ID for a specific page in Notion: \nOpen the page in Notion. Use the Share menu to Copy link. Now paste the link in your text editor so you can take a closer look. The URL ends in a page ID.\nIt should be a 32 character long string. Format this value by inserting hyphens (-) in the following pattern: 8-4-4-4-12 (each number is the length of characters between the hyphens).\nExample: 1429989fe8ac4effbc8f57f56486db54 becomes 1429989f-e8ac-4eff-bc8f-57f56486db54.\nThis value is your page ID.\n\n## Supported Notion blocks to Obsidian markdown\n\n- [x] bookmark\n- [x] bulleted_list_item\n- [x] callout\n- [x] child_database\n- [x] child_page\n- [x] column\n- [x] column_list\n- [x] divider\n- [x] embed\n- [x] equation\n- [x] file\n- [x] heading_1\n- [x] heading_2\n- [x] heading_3\n- [x] image\n- [x] link_preview\n- [x] link_to_page\n- [x] numbered_list_item\n- [x] paragraph\n- [x] pdf\n- [x] quote\n- [ ] synced_block\n- [x] table\n- [x] table_of_contents\n- [x] table_row\n- [x] to_do\n- [x] toggle\n- [x] unsupported\n- [x] video\n\n## Supported Notion page properties to Obsidian frontmatter\n\n- [x] checkbox\n- [x] created_by\n- [x] created_time\n- [x] date\n- [x] email\n- [ ] files (No information from the Notion API)\n- [ ] formula (No equivalent in Obsidian)\n- [x] last_edited_by\n- [x] last_edited_time\n- [x] multi_select\n- [x] number\n- [ ] people (No information from the Notion API)\n- [x] phone_number\n- [x] relation\n- [x] rich_text\n- [x] rollup\n- [x] select\n- [x] status\n- [x] title\n- [x] url\n\n## Supported Notion rich text mentions. Every mention would create a link between notes.\n\n- [ ] database (Partial support. We do not fetch the datadase pages)\n- [x] date \n- [x] link_preview \n- [x] page \n- [ ] template_mention (No equivalent in Obsidian)\n- [ ] user\n\n## Known Limitations\n\nChild page and child datadase blocks do not include information that allow to query the Notion API. If you want to migrate those you would have to manually call `n2o`\n\n## Examples\n\n### Get information about the pages that would be created in your Obsidian Vault\n```\nn2o -notion-token=\"NOTION_TOKEN\" \\\n-notion-page-ID=\"1429989f-e8ac-4eff-bc8f-57f56486db54\" \\\n-page-properties=\"all\" \\\n-vault-path=\"/Users/johndoe/Obsidian\\ Vault/Testing\" \\\n-vault-folder=\"Migrated\"\n```\n\nThe command prints the pages that would be created in the Obsidian vault and their references. The reference is displayed with `|-\u003e` \n\n```\nfetching notion pages information 100% |███████████████████████████████████████████████| (7/7, 17 it/min)\n[INFO] Displaying the pages that would be created in your vault\nWeekly Plan/Wednesday.md\n |-\u003e Meals/Egg Muffins.md\n |-\u003e Meals/Quinoa and Black Bean Bowl.md\n |-\u003e Meals/Beef Stir-Fry.md\nWeekly Plan/Monday.md\n |-\u003e Meals/Overnight Oats.md\n |-\u003e Meals/Chicken Salad.md\n |-\u003e Meals/Turkey Stuffed Peppers.md\nWeekly Plan/Sunday.md\n |-\u003e Meals/Overnight Oats.md\n |-\u003e Meals/Chicken Salad.md\n |-\u003e Meals/Salmon and Asparagus.md\nWeekly Plan/Thursday.md\n |-\u003e Meals/Overnight Oats.md\n |-\u003e Meals/Smoothie.md\n |-\u003e Meals/Salmon and Asparagus.md\n```\n\n### Download a single page and convert all page properties to frontmatter\n```\nn2o -notion-token=\"NOTION_TOKEN\" \\\n-notion-page-ID=\"1429989f-e8ac-4eff-bc8f-57f56486db54\" \\\n-page-properties=\"all\" \\\n-vault-path=\"/Users/johndoe/Obsidian\\ Vault/Testing\" \\\n-vault-folder=\"Migrated\" \\\n-save-to-disk\n```\n\n### Download a full database and images, and convert some page properties to frontmatter\n```\nn2o -notion-token=\"NOTION_TOKEN\" \\\n-notion-page-ID=\"668d797c-76fa-4934-9b05-ad288df2d136\" \\\n-page-properties=\"location\" \\\n-vault-path=\"/Users/johndoe/Obsidian\\ Vault/Testing\" \\\n-vault-folder=\"Migrated\" \\\n-download-images \\\n-save-to-disk\n```\n\n### Download a complete database and customize the resulting Obsidan page name\n```\nn2o -notion-token=\"NOTION_TOKEN\" \\\n-notion-page-ID=\"668d797c-76fa-4934-9b05-ad288df2d136\" \\\n-page-name=\"date:%Y/%B/%d-%A\" \\\n-vault-path=\"/Users/johndoe/Obsidian\\ Vault/Testing\" \\\n-vault-folder=\"Migrated\" \\\n-download-images \\\n-save-to-disk\n```\n\nFor these examples, the location of the different pages would be based dynamically on the `date` value in the Notion page property and the custom format `%Y/%B/%d-%A`. For a list of available formatting options for dates, refer to [man 3 strftime](https://linux.die.net/man/3/strftime)\n\nA notion page with the date value `2024-09-30` would be stored in: `/Users/johndoe/Obsidian\\ Vault/Testing/Migrated/2024/September/09-Monday`\n\n## Roadmap\n\n- [ ] Figure out how to parse self-referential links. Transform links like `/\u003cNotion_PAGE_ID\u003e#\u003cBLOCK_ID\u003e` to `[[Page^Block_ID]]` or `[[Page#Block_ID]]`\n- [ ] Add more unit tests\n- [ ] Add support for custom configuration file. The configuration file allows to specify the different DB and pages that we want to migrate and their properties, increasing the usabilty of `n2o`.\n- [ ] Create a HomeBrew formula\n\n## Contributing\nPull requests are welcome. Feel free to...\n\n- Revise documentation\n- Add new features\n- Fix bugs\n- Suggest improvements\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgustavocaso%2Fn2o","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgustavocaso%2Fn2o","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgustavocaso%2Fn2o/lists"}