Banana Sync to Notion
Automatically sync local Markdown files to Notion while preserving directory structure and full Markdown formatting.
Setup
Before using this skill:
-
Install dependencies in the skill directory:
cd banana-sync-to-notion npm install -
Configure environment variables by creating a
.envfile:NOTION_TOKEN=your_notion_integration_token NOTION_ROOT_PAGE_ID=target_page_idNOTION_TOKEN: Get from Notion IntegrationsNOTION_ROOT_PAGE_ID: The parent page ID where files will be synced- Ensure the integration has read/write permissions to the target page
Usage
Sync Files to Notion
Run from the skill directory:
npm run sync:notion
This command:
- Recursively scans the source directory (default:
Files/in project root) - Converts Markdown files to Notion blocks
- Preserves directory hierarchy as nested pages
- Assigns emoji icons based on filenames
- Skips existing pages (incremental sync)
- Shows detailed progress and statistics
Clean Notion Pages
Remove all child pages under the target page:
npm run clean:notion
Use this before a fresh re-sync.
Re-sync Everything
Clean existing content and sync fresh:
npm run resync:notion
Combines clean:notion + sync:notion.
Markdown Support
All standard Markdown syntax is converted to native Notion blocks:
| Syntax | Notion Output |
|--------|---------------|
| **bold** or __bold__ | Bold text |
| *italic* or _italic_ | Italic text |
| ***bold italic*** | Bold italic |
| `code` | Inline code |
| [text](url) | Clickable link (http/https only) |
| ```language ... ``` | Code block |
| - item or * item | Bullet list |
| 1. item | Numbered list |
| > quote | Quote block |
| > π‘ note | Callout (emoji-prefixed quotes) |
| --- or *** | Divider |
| Markdown tables | Native Notion tables |
Relative Links:
./file.mdor../folder/file.mdβ Converted to Notion page links./image.pngβ Preserved as text (no local file upload)http://...β Clickable external links
Automatic Icon Selection
The script assigns emoji icons based on filename patterns:
- π Chapters (e.g., "01-intro.md")
- π― Getting started, basics
- β FAQ, troubleshooting, problems
- π‘ Examples, case studies
- π§ Tools, utilities
- π Methods, tutorials
- π Data, analysis, reports
- βοΈ Configuration, settings
- ποΈ Architecture, system
- π» Scripts, code
- βοΈ Writing, creative
- π Notes, records
- π Advanced, recommendations
- π Guides
- π README files
- π¦ Downloads, resources
- π¨ Presentations
- π Default (no match)
Customize icons by editing the selectIcon function in scripts/sync-notion.js.
Smart Features
Duplicate Detection: Automatically skips pages that already exist with the same title, enabling incremental syncs without duplicates.
Smart Chunking:
- Handles Notion's 2000-character limit per block
- Supports files with >100 blocks
- Batches API requests to avoid rate limits
- Automatic retry on temporary failures
Progress Reporting: Shows detailed statistics during sync:
- Files processed
- Files created vs skipped
- Folders created
- Duration and errors
Output Example
π Starting Notion Sync...
π Source: /path/to/Files
π Target Page: My Knowledge Base
π Syncing directory: Files
β¨ Creating: π 01-Introduction
π Syncing directory: 01-Introduction
β¨ Creating: π 01-overview.md
βοΈ Skipping existing: 02-concepts.md
β¨ Creating: π― 03-quickstart.md
==================================================
β
Sync Complete!
==================================================
β±οΈ Duration: 45.2s
π Statistics:
β’ Files processed: 35
β’ Files created: 25
β’ Files skipped: 10
β’ Folders created: 5
β’ Errors: 0
==================================================
File Structure
banana-sync-to-notion/
βββ SKILL.md
βββ .env (user created)
βββ package.json
βββ scripts/
β βββ sync-notion.js # Main sync logic
β βββ clean-notion.js # Cleanup utility
βββ Files/ (default source directory)
Troubleshooting
Image support: Current version focuses on text/Markdown. Images require hosted URLs (image hosting) to display in Notion. Local image upload requires more complex authentication.
Missing icons: Files that don't match any icon pattern use the default π emoji. Add custom patterns in scripts/sync-notion.js.
Rate limits: The script includes automatic retry logic for Notion API rate limits. Large syncs (>100 files) may take several minutes.
Relative links not working: Ensure the linked Markdown file was also synced. Links only work to pages that exist in Notion.