Supported Blocks
Every Notion block type that Kami converts, and how each one maps to Markdown.
Kami converts all standard Notion block types to clean, portable Markdown. The table below shows each block, its Notion HTML representation, and the resulting Markdown output.
Block-level elements
Headings
Notion heading blocks map directly to Markdown headings.
| Notion block | Markdown output |
|---|---|
| Heading 1 | # Heading |
| Heading 2 | ## Heading |
| Heading 3 | ### Heading |
The page title (<h1 class="page-title">) is emitted as an H1 heading by default. You can disable this with the includeTitle: false option in the library.
Lists
Bulleted list
- First item
- Second item
- Nested itemNumbered list
1. First item
2. Second item
3. Third itemList merging
Notion wraps each top-level list item in its own <ul> or <ol> tag. Kami detects consecutive lists and merges them into a single list for clean output.
To-do list
- [x] Completed task
- [ ] Pending taskNotion to-do lists are converted to GitHub-style task lists.
Tables
| Column A | Column B | Column C |
| --- | --- | --- |
| Cell 1 | Cell 2 | Cell 3 |
| Cell 4 | Cell 5 | Cell 6 |Headers are detected from <thead> or the first row. Columns are auto-padded for readability.
Code blocks
```javascript
function hello() {
console.log("world");
}
```The language is extracted from Notion's language-* CSS class. Text inside code blocks is preserved exactly as-is with no escaping.
Blockquotes
> This is a blockquote.
> It can span multiple lines.Callouts
Notion callouts are converted to emoji-prefixed blockquotes:
> emoji Content of the callout goes here.The emoji is extracted from Notion's icon span. If no emoji is present, the content renders as a plain blockquote.
Images
Images inside <figure> tags with optional <figcaption> are supported. The caption becomes the alt text. Image paths are URL-encoded to handle spaces and parentheses.
Toggle blocks
Toggle blocks (<details>) are passed through as native HTML for Markdown renderers that support them:
<details>
<summary>Click to expand</summary>
Hidden content goes here.
</details>Dividers
Horizontal rules in Notion become Markdown thematic breaks:
---Bookmarks
Notion bookmark blocks are converted to standard links:
[Bookmark Title](https://example.com)Child page links
Links to other Notion pages within the export:
[Page Title](relative-path.html)These are tracked in the converter's metadata as childPageLinks for navigation generation.
Column layouts
Notion column layouts are serialized top-to-bottom (left column first, then right column) since Markdown has no native column support.
Table of contents
Notion's table of contents block is converted to a nested Markdown list:
- Section One
- Subsection
- Section TwoIndent levels from Notion's table_of_contents-indent-N classes are preserved.
Inline elements
| Notion formatting | Markdown output |
|---|---|
| Bold | **bold** |
| Italic | *italic* |
~~strikethrough~~ | |
Inline code | `code` |
| Link | [text](url) |
| Highlight | Plain text (stripped) |
| Underline | Plain text (no Markdown equivalent) |
Document metadata
In addition to the Markdown content, the converter extracts metadata about each page:
| Field | Description |
|---|---|
title | Page title from the H1 heading |
icon | Page emoji icon (e.g. "rocket") |
coverImage | Cover image URL if present |
childPageLinks | Links to child Notion pages |
images | All image references with src and alt |
Elements that are skipped
- CSS styles: Notion's ~680-line
<style>block is ignored entirely - Scripts: Any
<script>tags are ignored - Page description: The
page-descriptionparagraph is skipped - Empty paragraphs: Blank
<p>tags produce no output
Next steps
- npm Library — use the converter programmatically
- Notion to Google Docs — export to Google Drive