/bearnotes

A tool to migrate notes from Bear to Zettlr

Primary LanguageGoMIT LicenseMIT

Migrate your notes from Bear to Zettlr!

Background

I recently switch from Bear to Zettlr to manage my notes. However, I was sad to discover that Bear exports notes in a non-standard way:

  • File attachments are HTML links that don't even point to the correct file
  • All notes are stored in the same directory, regardless of your tag hierarchy
  • The tag format used by Bear (#foo/bar) is incompatible with Zettlr format (#bar)
  • Bonus: some file attachment were missing...

So, I decided to write this tool in order to save my hundreds of notes!

Usage

First, export all your notes from Bear.

  • Go to Notes
  • Hit Cmd+A to select all your notes
  • Go to File > Export Notes...
  • Select Markdown and check Export attachments
  • Select a directory to store your exported notes
  • Click Export notes

Then, install git and go.

brew install git golang

Checkout this repository.

git clone https://github.com/nmasse-itix/bearnotes.git
cd bearnotes/cli

Start a discovery of your notes.

go run main.go discover --from /path/to/bear-notes --tag-file /tmp/tags.yaml

If everything goes well, it should display a count of your exported notes along with the discovered tag list.

You can review the generated tag configuration file.

open /tmp/tags.yaml

Finally, launch the proper migration phase.

go run main.go migrate --from /path/to/bear-notes --to /path/to/zettlr-notes --tag-file /tmp/tags.yaml

Review the migrated notes.

If you want to change the default folder hierarchy, read the next section.

Configuration

You can configure how the migration tool stores your notes, in which folder and even rewrite the tags to match Zettlr's format.

The default configuration for a tag is:

foo/bar:
    ignore: false
    handling_strategy: same-folder
    target_directory: foo/bar
    target_tag_name: bar

It defines that any note having this tag will go to the foo/bar directory. The #foo/bar tag will be rewritten as #bar. All the notes having the #foo/bar tag, will be stored in the same directory, along with their embedded images and file attachments.

If you think the migration tool wrongly identified a tag, you can switch the ignore option to true.

foo/bar:
    ignore: true

If you want to rewrite the #foo/bar tag as #foo-bar, you can change the target_tag_name.

foo/bar:
    ignore: false
    handling_strategy: same-folder
    target_directory: foo/bar
    target_tag_name: foo-bar

Note: If you want to remove the tag from the migrated note, use target_tag_name: "".

The target_directory option is straightforward: it defines where to store the notes having this tag.

The handling_strategy option specifies how notes will be saved on the filesystem

  • same-folder: all notes having this tag are stored in the target_directory along with their embedded images and file attachments.
  • one-note-per-folder: each note will get a sub-folder in the target_directory

Note: given that a document can have multiple tags, it is perfectly valid for a tag to specify no target directory or no handling strategy if you know that another tag will provide them.

If by any chance, for a note the tool cannot determine a target directory or an handling strategy, the note will be stored in the root of the target directory.

And if a note receives different configurations by two different tags, the first one wins (by order of tag appearance in the document).

Filename encoding Between Mac and Linux

If you took your exported notes from a Mac and migrated them on a Linux box, you might encounter some filename encoding issue. Hopefully, convmv can fix filenames for you!

sudo dnf install convmv
convmv -f utf-8 -t utf-8 --nfc -r --notest /path/to/bear-notes

License

MIT