A tool to use Notion as a Markdown editor.
⚠️ NOTE: Narkdown is dependent on notion-py, the unofficial Notion API created by Jamie Alexandre. It can not gurantee it will stay stable. If you need to use in production, I recommend waiting for their official release.
pip install narkdown
# pip3 install narkdown
⚠️ NOTE: the latest version of narkdown requires Python 3.5 or greater.
How To Find Your Notion v2 Token - Red Gregory
python3 example.py
Here is an database template page for importing pages from the database. Move to that page, duplicate it, and test it.
-
Import page from Notion and save it to the desired path.
-
Import database from Notion and save pages to the desired path.
-
Useful for CMS(Contents Manage System) of static pages such as blog or docs page.
-
Support import by status of content.
-
Support filter contents.
-
-
Import child page in Notion page recursively. And import linked page as a Notion page link.
-
Support nested block. (e.g. bulleted, numbered, to-do, toggle)
-
Support language selection of code block.
Narkdown provides some configuration for how to extract documents. You can configure Narkdown via narkdown.config.json
.
Create narkdown.config.json
and run python3 -m narkdown
in that directory.
// narkdown.config.json
{
"exportConfig": {
"recursiveExport": true,
"createPageDirectory": true,
"addMetadata": true,
"appendCreatedTime": true,
"generateSlug": true
},
"databaseConfig": {
"categoryColumnName": "Category",
"statusColumnName": "Status",
"currentStatus": "✅ Completed",
"nextStatus": "🖨 Published"
}
}
Name | Description | Default |
---|---|---|
recursiveExport |
Whether or not to recursively export child page. | [true ] |
createPageDirectory |
Whether or not to create subdirectories with page titles for each page. | [true ] |
addMetadata |
Whether or not to add metadata to content. | [false ] |
appendCreatedTime |
Whether or not to append created time to filename. ( The page must have a created time property.) | [false ] |
generateSlug |
Whether or not to generate and append slug to metatdata. | [false ] |
Name | Description | Default |
---|---|---|
categoryColumnName |
In Notion database, content can be classified by category by select property. When you create the select property in the Notion database and pass the name of the column, folders are created by category. |
["" ] |
statusColumnName |
In the Notion database, you can manage the status of content with Select property. If you create a Select property in the Notion database and pass the name of the column, you can import contents in a specific state or change the status of the content. (should be used with the currentStatus or nextStatus option.) |
["" ] |
currentStatus |
Import only the content that corresponds to currentStatus value. ( statusColumnName must be set.) |
["" ] |
nextStatus |
Changes content status to nextStatus value after import. ( statusColumnName must be set.) |
["" ] |
The token_v2
of notion is a variable that should not be shared. You can use os environment variable for notion token.
Narkdown use the NOTION_TOKEN
as an environment variable for token_v2
. Setting this environment variable allow the CLI to omit token_v2
input.
Notion2Github recommended
Github action to synchronize the content of the notion database with github.
Block Type | Supported | Notes |
---|---|---|
Heading 1 | ✅ Yes | Converted to heading 2 in markdown. |
Heading 2 | ✅ Yes | Converted to heading 3 in markdown. |
Heading 3 | ✅ Yes | Converted to heading 4 in markdown. |
Text | ✅ Yes | |
Divider | ✅ Yes | Divider after the Heading 1 is not added. |
Callout | ✅ Yes | Callout block will be exported as quote block with emoji. |
Quote | ✅ Yes | |
Bulleted list | ✅ Yes | Support nested block. |
Numbered list | ✅ Yes | Support nested block. |
To-do list | ✅ Yes | Support nested block. |
Toggle list | ✅ Yes | Support nested block. |
Code | ✅ Yes | Support syntax highlighting. |
Image | ✅ Yes | Uploaded image will be downloaded to local. Linked image will be linked not be downloaded. |
Web bookmark | ✅ Yes | Same as link text. |
Page | ✅ Yes | Import "Child page" in Notion page recursively. And import "Linked page" as a Notion page link. |
Table (aka database) | ✅ Yes | |
Video | ❌ No | |
Audio | ❌ No | |
File | ❌ No | |
Embed other services | ❌ No | |
Advanced | ❌ No | |
Layout in page | ❌ No |
MIT © younho9