Building A SimpleNote to Obsidian notes converter
See it in action:
https://simplenote-to-obsidian.fly.dev/
WHY?
I like quickly jotting down notes in SimpleNote but after seeing Obsidian pop up all over the web I was curious and decided to try it out. And I liked it, the ability to add more structure and link documents seemed like a great way to build up to a longer post by referencing snippets and sections that I had saved up as un-related notes in SimpleNote.
The problem
SimpleNotes saves notes in .txt files and while it's easy to export out of SimpleNotes there's no direct way to transfer the notes over to Obsidian.
I tried looking into the official migration guide at:
https://help.obsidian.md/import
I even tried looking for community plugins that would handle this:
https://obsidian.md/plugins
It seemed bizarre that there was no official way to import from SimpleNotes, which is quite a popular platform. Then I stumbled across this python script from https://github.com/philgyford/simplenote-to-obsidian/blob/main/convert_notes.py and decided to build my own web version in JavaScript.
HOW IT WORKS
- Upload the JSON file from SimpleNote that contains an export of all the notes
- Parse each note and convert the Tags into Obsidian compatible #Tags
- Export this updated note into its own .md file
- Change the modified date to reflect the date from the original SimpleNote file
- Save these .md notes into a folder
- Create a Zip for export that can be downloaded to import into Obsidian
The stack
Usually I'd build this in NEXT.js and host it on Vercel but having recently run into a API route timeout I knew that Vercel allows only ~5-10 seconds for script execution in API routes (on the Hobby Tier) and I was worried that parsing the notes could take some time in larger collections so I built this as a simple Node + Express App and decided to try hosting it on Fly.io
It wasn't AS easy as connecting a github repo to Vercel, but within 20 mins I had my account setup on fly.io and the app deployed
Challenges
File Upload in Express v4
I just couldnt get the uploaded file through to the controller. The POST data from the form looked okay on the front-end and all my code looked ok on the Express end but any calls to req.body came up as an empty object {}!
I cracked my head around this for an hour before stumbling across this StackOverflow post where a kind poster pointed out that file uploads in forms are no longer handled by Express as of v4 and require an external library. I went with 'express-fileupload' https://www.npmjs.com/package/express-fileupload
Creation Date
There is a function to update the 'Modified by' and 'Last Accessed' date in 'fs' for node that works across platforms but changing the 'Created At' date is trickier.
The fs-futimessync function does not handle 'Created At' dates
https://www.geeksforgeeks.org/node-js-fs-futimessync-method/?ref=lbp
I did stumble upon https://github.com/baileyherbert/utimes.
A Cross-platform native addon to change the btime, mtime, and atime of files in Node.js.
It seems to fix the issue for Win + Mac systems so I might give it a try for the next iteration of this tool
Finally...
And that's it. I was finally able to build the tool and test it and it works great!
I was able to import all my SimpleNote data into Obsidian easily and the tags were preserved
See it in action:
https://simplenote-to-obsidian.fly.dev/
Give it a go and let me know if it helps you.
+ BONUS
I've shared the tool as a github-repo for other people to mess around with
https://github.com/ayushsaranGithuB/simplenote-to-obsidian
Comments, criticisms, suggestions are welcome
Please file an issue if you find a bug: https://github.com/ayushsaranGithuB/simplenote-to-obsidian/issues
Top comments (0)