After 15+ years of note-taking, I finally said goodbye to Evernote. Here’s the technical journey of migrating 4,330 notes—with all their attachments, tables, and formatting—to Apple Notes.
Evernote had been my digital brain since the late 2000s. But with each passing version, the app became slower, more bloated, and increasingly expensive. Apple Notes, meanwhile, has quietly evolved into a capable, fast, and free alternative that syncs seamlessly across my devices.
The catch? There’s no official migration path. Evernote’s export format (ENEX) doesn’t preserve everything, and Apple Notes doesn’t have any bulk import feature. Manual copy-paste wasn’t an option.
So I built my own migration tool.
This wasn’t a simple file conversion:
Evernote v10 made things even more complicated. Unlike older versions that stored everything in a straightforward SQLite database, v10 uses a hybrid system with:
.dat files containing rich text content (tables/formatting)I built a Python-based migration pipeline that handles all of this complexity.
The first phase downloads attachments and generates PDFs in parallel using 10 worker threads. For notes with embedded images or files, I render the complete content (HTML + attachments) into a PDF using headless Chrome. This preserves formatting perfectly.
The second phase imports to Apple Notes via AppleScript—sequentially, because Apple Notes doesn’t handle concurrent modifications well.
Evernote embeds attachments using <en-media> tags with MD5 hashes. To resolve these to actual files, I:
My initial attempt at duplicate detection was fragile—comparing dates via AppleScript often failed. The fix was simple: track Evernote note IDs in a log file. This makes the migration fully resumable.
Once notes were in Apple Notes, I used Gemini AI to automatically categorize them into folders based on content.
AppleScript is slow but reliable — Building a cache at startup dropped duplicate checks from 0.5s to 0.001s per note.
Parallelism for I/O, sequential for mutations — Downloading attachments scales linearly with workers. Writing to Apple Notes must be sequential.
Auth tokens expire — Evernote’s tokens last about an hour. I kept Proxyman ready to capture fresh tokens.
PDF is a universal container — When your target doesn’t support rich formatting or attachments, bundle everything into a PDF.
The entire migration toolkit is available on GitHub: apple-notes-toolkit
⚠️ Note: This repo is fully vibe coded. Use with caution.
What started as a weekend project turned into a deep dive into Evernote’s internals, Apple’s Scripting Bridge, and the art of data migration. But the result is worth it: my 15 years of notes are now in Apple Notes, fully searchable, syncing across devices, and—most importantly—mine to keep.
If you’re considering leaving Evernote, know that it’s possible. It just takes a bit of engineering.
After 15+ years of note-taking, I finally said goodbye to Evernote. Here’s the technical journey of migrating 4,330 notes—with all their attachments, tables, and formatting—to Apple Notes.
Evernote had been my digital brain since the late 2000s. But with each passing version, the app became slower, more bloated, and increasingly expensive. Apple Notes, meanwhile, has quietly evolved into a capable, fast, and free alternative that syncs seamlessly across my devices.
The catch? There’s no official migration path. Evernote’s export format (ENEX) doesn’t preserve everything, and Apple Notes doesn’t have any bulk import feature. Manual copy-paste wasn’t an option.
So I built my own migration tool.
This wasn’t a simple file conversion:
Evernote v10 made things even more complicated. Unlike older versions that stored everything in a straightforward SQLite database, v10 uses a hybrid system with:
.dat files containing rich text content (tables/formatting)I built a Python-based migration pipeline that handles all of this complexity.
The first phase downloads attachments and generates PDFs in parallel using 10 worker threads. For notes with embedded images or files, I render the complete content (HTML + attachments) into a PDF using headless Chrome. This preserves formatting perfectly.
The second phase imports to Apple Notes via AppleScript—sequentially, because Apple Notes doesn’t handle concurrent modifications well.
Evernote embeds attachments using <en-media> tags with MD5 hashes. To resolve these to actual files, I:
My initial attempt at duplicate detection was fragile—comparing dates via AppleScript often failed. The fix was simple: track Evernote note IDs in a log file. This makes the migration fully resumable.
Once notes were in Apple Notes, I used Gemini AI to automatically categorize them into folders based on content.
AppleScript is slow but reliable — Building a cache at startup dropped duplicate checks from 0.5s to 0.001s per note.
Parallelism for I/O, sequential for mutations — Downloading attachments scales linearly with workers. Writing to Apple Notes must be sequential.
Auth tokens expire — Evernote’s tokens last about an hour. I kept Proxyman ready to capture fresh tokens.
PDF is a universal container — When your target doesn’t support rich formatting or attachments, bundle everything into a PDF.
The entire migration toolkit is available on GitHub: apple-notes-toolkit
⚠️ Note: This repo is fully vibe coded. Use with caution.
What started as a weekend project turned into a deep dive into Evernote’s internals, Apple’s Scripting Bridge, and the art of data migration. But the result is worth it: my 15 years of notes are now in Apple Notes, fully searchable, syncing across devices, and—most importantly—mine to keep.
If you’re considering leaving Evernote, know that it’s possible. It just takes a bit of engineering.