Migrate thousands of Evernote notes to organized Markdown files in minutes, not hours.
Built by Evangel Oputa at Begine Fusion & OnStack AI Labs after migrating 6,453 notes from 293 Evernote notebooks in a single session.
Evernote makes it nearly impossible to leave:
- No bulk export (manual, one-notebook-at-a-time clicking)
- No MCP server for AI integration
- Deprecated developer tokens
- Proprietary format (HTML-in-XML)
- CA$325/year for something your existing cloud storage can do
If you have hundreds of notebooks and thousands of notes, manual migration would take 15-20 hours of clicking. This toolkit does it in under 30 minutes.
Evernote Account
|
v
[1. Bulk Download] --> SQLite DB (all notes via API)
|
v
[2. ENEX Export] --> .enex files (one per notebook)
|
v
[3. Convert to Markdown] --> Organized .md files with YAML frontmatter
|
v
[4. Set Up Vault] --> Obsidian-ready system with search, templates, AI export
|
v
[5. Organize Stacks] --> Evernote-style Stack > Notebook > Note hierarchy
- Every note as a clean
.mdfile with YAML metadata (title, created, updated, tags, notebook) - Every attachment extracted and linked (images, PDFs, files)
- Notebook structure preserved as folders
- Stack organization (group folders into stacks, just like Evernote)
- Full-text search tool (replaces Evernote search)
- Quick note capture tool (replaces Evernote quick note)
- AI export tool (JSON/JSONL for embeddings, RAG, LLM pipelines)
- Obsidian configuration (templates, bookmarks, daily notes)
- Works with any Markdown editor (Obsidian, VS Code, Typora, etc.)
- Python 3.10+ (tested on 3.11)
- Evernote account (any plan)
- ~10 minutes for download + conversion
git clone https://github.com/beginefusion/evernote-to-markdown.git
cd evernote-to-markdown
pip install -r requirements.txtOption A: Developer Token (if available)
- Go to https://www.evernote.com/api/DeveloperToken.action
- Sign in and create a token
- Copy the token string
Option B: Browser Cookie (works for all accounts)
- Open https://www.evernote.com/client/ in your browser
- Sign in to your account
- Open DevTools (F12) > Application tab > Cookies
- Find the cookie with a value starting with
S=s###:U=... - Copy that value
# Step 1: Download all notes from Evernote
python scripts/export_evernote.py
# Step 2: Convert to Markdown
python scripts/convert_to_markdown.py --input ./enex_export --output ~/NoteVault
# Step 3: Set up your note system
python scripts/setup_vault.py --vault ~/NoteVault
# Step 4 (optional): Organize into stacks
python scripts/organize_stacks.py --vault ~/NoteVault --config stacks.jsonOr run everything at once:
python migrate.py- Download Obsidian (free)
- Open vault > select your NoteVault folder
- Done. All your notes are there.
Edit stacks.json to define how your notebooks group into stacks:
{
"Business": [
"Meeting Notes",
"Client Projects",
"Proposals"
],
"Learning": [
"Courses",
"Certifications",
"Book Notes"
],
"Personal": [
"Journal",
"Recipes",
"Travel"
]
}# Output to a cloud-synced folder
python scripts/convert_to_markdown.py --output "C:\Users\you\OneDrive\NoteVault"
python scripts/convert_to_markdown.py --output ~/Dropbox/NoteVault
python scripts/convert_to_markdown.py --output ~/Google\ Drive/NoteVault# Export all notes as JSON (for RAG, embeddings, knowledge graphs)
python scripts/ai_export.py --vault ~/NoteVault --format json
# Export as JSONL (one note per line, for streaming/batch processing)
python scripts/ai_export.py --vault ~/NoteVault --format jsonl
# Export specific notebook or tag
python scripts/ai_export.py --vault ~/NoteVault --notebook "Meeting Notes"
python scripts/ai_export.py --vault ~/NoteVault --tag "AI"Every note becomes a .md file with structured frontmatter:
---
title: "Meeting with Client X"
created: "2024-03-15 14:30:00"
updated: "2024-03-16 09:00:00"
notebook: "Client Meetings"
source: "evernote"
tags: ["meeting", "client", "Q1"]
source_url: "https://..."
---
# Meeting with Client X
The actual note content in clean Markdown...
- [x] Action item completed
- [ ] Action item pending
NoteVault/
Dashboard.md # Homepage with links to all stacks
_INDEX.md # Master index
_TAG_INDEX.md # Browse by tag
_templates/ # Note templates
daily-note.md
meeting-note.md
project-note.md
quick-note.md
Inbox/ # Quick capture destination
Business Stack/ # Stack (group of notebooks)
Client Projects/ # Notebook (group of notes)
Meeting Note 1.md # Note
Meeting Note 2.md
_attachments/
screenshot.png
Proposals/
...
Personal Stack/
Journal/
...
search_notes.py # Full-text search tool
quick_note.py # Quick capture tool
ai_export.py # AI data export tool
| Metric | Our Migration |
|---|---|
| Notes | 6,453 |
| Notebooks | 293 |
| Attachments | 3,172 |
| Data volume | 2.2 GB |
| Download time | ~25 minutes |
| Conversion time | ~5 minutes |
| Total time | ~30 minutes |
| Errors | 0 |
Make sure you paste the token without surrounding quotes. The token should start with S=s not "S=s.
Some Evernote note titles are very long. The converter automatically truncates filenames to 100 characters. If you still get path errors, try a shorter output path (e.g., C:\NV instead of C:\Users\...\NoteVault).
The converter handles emoji and special characters in note titles. If you see encoding errors on Windows, the converter automatically switches to UTF-8 output.
Cloud sync services may lock newly created files. The converter gracefully skips cleanup operations that fail due to locks. This doesn't affect your notes.
Some notes may fail with JDBCConnectionException. These are Evernote server-side issues. Re-run the sync command to retry:
python -m evernote_backup sync -d evernote_backup.db| Tool | Issue |
|---|---|
| Evernote's built-in export | Manual, one notebook at a time. 293 notebooks = 15+ hours of clicking. |
| Import2 / CloudHQ | Per-note pricing ($200-500 for large accounts). Still needs API access. |
| Notion import | Imports to another SaaS with its own lock-in. |
| Google Keep | No bulk import. Different use case (sticky notes vs. documents). |
| Copy-paste | Not serious for 6,000+ notes. |
Issues and pull requests welcome. Key areas for contribution:
- Linux/macOS testing and path handling
- Additional export formats (HTML, PDF)
- Notion/Obsidian/Logseq-specific optimizations
- Web UI for non-technical users
- Progress bars and ETA display
- Incremental sync (only convert new/changed notes)
MIT License. Use it, modify it, share it.
Built by Evangel (Ev) Oputa, Founder of Begine Fusion and Co-Founder of OnStack AI Labs.
Begine Fusion is a digital adoption company. We set up AI, CRM, automation, and growth marketing systems inside businesses, then make sure they actually run.
OnStack AI Labs — Calgary's first innovative, structured, collaborative skills and applied AI lab, working across a global ecosystem.
Technical implementation assisted by Claude Code (Anthropic).
If this tool saved you from Evernote jail, give it a star and share it with others stuck in the same situation.