I had 10 years worth of notes in Evernote.
The number of notes was around 1,640.
The reason I kept paying was for the search function, but things changed when Gemini was integrated with Google Drive.
If you put a few documents in a Drive folder and say "make a new contract based on this," it would fill in the information of the parties involved and generate a document for you.
After seeing this, I decided to escape Evernote, but transferring the data was the problem.
There's an official Evernote export (ENEX), but there are a lot of traps.
It's only possible in the PC app, and you can only select up to 100 at a time.
With 1,640 notes, that would be 17 repetitions. The real problem is that even if it says the export is complete, some notes are actually missing.
It doesn't tell you which notes are missing either.
As an alternative, there's HTML export.
It's hidden in the menu, so many people don't know about it. Each note comes out as a separate folder, and all 1,640 are exported without any errors.
The problem is that when you upload this HTML to Google Drive, it uploads the HTML file as is.
Since it doesn't convert to Google Docs, you can't edit it and Gemini can't read the content.
Existing services (cloudHQ, MultCloud) were all monthly subscriptions, and none of them supported Google Docs conversion.
So I decided to make it myself using Vibe coding.
I started by throwing requirements at Claude and getting code out of it, but unexpected problems arose one after another during the development process.
The problem with audio file extensions disappearing
When Evernote exports to HTML, it removes the audio file extension.
`.m4a` files come out without extensions, so they won't play even if you upload them to Drive.
I added logic to read the magic bytes at the beginning of the file and determine the format.
ftyp → .m4a
ID3 / 0xff 0xfb → .mp3
RIFF → .wav
OggS → .ogg
It's just a simple pattern matching, but if you don't do it, all the audio notes will be useless.
HTML → Google Docs conversion
If you upload with the conversion flag set in the Drive API, it will convert to Google Docs. However, since Evernote HTML includes audio tags and other elements, I had to check and process those parts.
I also created a pipeline to upload inline images separately and insert them into the document.
This accounted for more than half of the total workload.
Pause/Resume
Uploading 1,640 notes takes 4~5 hours due to Drive API quotas.
If my Mac goes to sleep, it won't start over from the beginning. So I recorded the upload status of each note in `progress.json` and made it resume from where it left off when rerun.
The stack is Python + PyObjC (macOS native UI) + lxml + google-api-python-client.
My experience with Vibe coding is that it's really fast for structuring and getting the basic logic out.
But ultimately, humans have to handle edge cases.
I had to manually check and fix things like audio tag processing.
Overall, I felt that 70% of the code was written by AI, and the remaining 30% was debugging and modifications made by me.
Here's the result.
1,640 notes are organized into folders named `date_title`, and they can be edited directly in Google Docs.
The Gemini integration I originally intended also works well.
It's now possible to create new documents based on the transferred documents.
There are some downsides too.
It only runs on macOS. Because it's based on PyObjC, it won't work on Windows.
Complex tables can collapse in layout when converted to Google Docs.
AMR format audio files won't play even if the extension is restored. Google doesn't support AMR.
I originally made this to transfer my own notes, but I'm also selling it on Gumroad.
If you're struggling to escape Evernote or have any questions about Vibe coding, please leave a comment.