Convert your notes from Google Keep's note format to Nextcloud Notes' format, ready to upload to your Nextcloud account.
  • JavaScript 100%
Find a file
2026-05-07 11:45:41 -07:00
.gitignore Initial commit. 2026-05-07 11:45:41 -07:00
convert.mjs Initial commit. 2026-05-07 11:45:41 -07:00
HUMAN-CONTRIBUTION-POLICY.md Initial commit. 2026-05-07 11:45:41 -07:00
LICENSE Initial commit. 2026-05-07 11:45:41 -07:00
package-lock.json Initial commit. 2026-05-07 11:45:41 -07:00
package.json Initial commit. 2026-05-07 11:45:41 -07:00
README.md Initial commit. 2026-05-07 11:45:41 -07:00

Google Keep to Nextcloud Notes Conversion Script

Convert your notes from Google Keep's note format to Nextcloud Notes' format, ready to upload to your Nextcloud account.

Requirements

  • macOS is best, but it will work with Linux, and it should work with Windows, but may need to be run through WSL.
  • Node.js.
  • Google Takeout of your Keep notes.

Instructions

  1. Clone this repo, and run npm install in the repo root.
  2. Use Google Takout to export your Keep notes, and move the "Keep" directory (the one that contains .html and .json files) to this directory.
  3. Run node convert.mjs.
  4. You now have a "md" directory that contains all your notes in Markdown format.
  5. Upload this entire directory using the Nextcloud web interface.
  6. Go into this "md" folder in the web interface and select all of the files and folders inside it.
  7. Move them (not copy) to the "Notes" folder.
  8. You can now delete the empty "md" folder.

Caveats

This script uses utimes to set the created/modified time of the notes to the correct date (the date from Keep), and Nextcloud uses these times when you upload the whole folder, so your notes will have the correct created/modified times. However, Linux does not support setting file creation time (btime), so the Note's creation times will be incorrect if you do this on Linux.

Attachments and annotations are not converted, and instead are appended in JSON format to the end of the note. Only the file names of the attachments are included. You will need to take the actual files from the "Keep" directory and reattach them manually in Nextcloud.

If a note doesn't have a title, the date it was created is used instead in "YYYY-MM-DD" format.

Nextcloud only supports one category for each note, so notes with multiple labels in Keep will only be in a category for the first label. Additional labels will be appended to their title in square brackets.

Every note will have the created/modified date prepended to it. If they are the same date, just the date will be prepended. If they are different, both dates will be prepended.

The script also looks for an existing date in the beginning of the note (in "YYYY-MM-DD" format) and will use this date instead of the creation date from Keep. It does this because that's how I migrated my notes from Evernote to Keep.

Trashed notes are skipped. If you want them, make a label in Keep, untrash them, and move them there.

Why is it so janky?

Because I wrote it for me. I don't bother to write exceptional code when I'm making a simple script for me. I figured it would be useful for other people too though, so here it is, basically unmodified from what I wrote for myself.

Why does it work best on macOS?

Because macOS lets you change the creation times of files, and Linux doesn't. Nextcloud reads those times when you upload your notes, so on macOS, every note will have the correct times, while on Linux, they'll only have the correct modified times.

Human Authorship

This project adheres to the SciActive Human Contribution Policy.

Seal of Human Authorship

License

Copyright 2026 Hunter Perrin

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.