Kamiby Typo Monster
Docs

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 blockMarkdown 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

markdown
- First item
- Second item
  - Nested item

Numbered list

markdown
1. First item
2. Second item
3. Third item

List merging

Notion wraps each top-level list item in its own &lt;ul&gt; or &lt;ol&gt; tag. Kami detects consecutive lists and merges them into a single list for clean output.

To-do list

markdown
- [x] Completed task
- [ ] Pending task

Notion to-do lists are converted to GitHub-style task lists.

Tables

markdown
| 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

markdown
```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

markdown
> This is a blockquote.
> It can span multiple lines.

Callouts

Notion callouts are converted to emoji-prefixed blockquotes:

markdown
> 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

markdown
![Alt text or caption](image-path.png)

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:

html
<details>
<summary>Click to expand</summary>
 
Hidden content goes here.
 
</details>

Dividers

Horizontal rules in Notion become Markdown thematic breaks:

markdown
---

Bookmarks

Notion bookmark blocks are converted to standard links:

markdown
[Bookmark Title](https://example.com)

Links to other Notion pages within the export:

markdown
[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:

markdown
- Section One
  - Subsection
- Section Two

Indent levels from Notion's table_of_contents-indent-N classes are preserved.

Inline elements

Notion formattingMarkdown output
Bold**bold**
Italic*italic*
Strikethrough~~strikethrough~~
Inline code`code`
Link[text](url)
HighlightPlain text (stripped)
UnderlinePlain text (no Markdown equivalent)

Document metadata

In addition to the Markdown content, the converter extracts metadata about each page:

FieldDescription
titlePage title from the H1 heading
iconPage emoji icon (e.g. "rocket")
coverImageCover image URL if present
childPageLinksLinks to child Notion pages
imagesAll 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-description paragraph is skipped
  • Empty paragraphs: Blank <p> tags produce no output

Next steps