Comparing Markdown-based Note Taking Software
Janne Kemppainen |Services like Roam Research or Notion have made note taking really trendy recently. The problem with hosted services is that you don’t own the platform and the content there, so what do you do if they go out of service or increase their prices?
That is why I find Markdown-based note taking the best way to store my thoughts and ideas. Markdown is a plaintext format that doesn’t bind me to a proprietary database or file format, so I can choose to open the files in my knowledge vault with any text editor.
From a data standpoint the only difference between the editors are their additional capabilities to handle my notes and to display the content, even though some of them have extended syntax. This means that I own the information, and that I can switch to another tool if I need to.
The text format has another great benefit too; it works well with version control systems. I can have my notes in a Git repository and keep a remote copy of the data on GitHub, so that I’m safe from hard drive failures. If you’re not comfortable with Git, then cloud storage services such as Dropbox or OneDrive will work just as well to keep a cloud copy of your notes.
In this post I will talk about software that provide additional capabilities over just writing and highlighting Markdown. The process of creating a collection of highly linked vault of notes can also be referred to as personal knowledge management, a second brain, or Zettelkasten. Links are first-class citizens in all programs that I’m showing here.
I use Typora to write my blog posts, and I absolutely love it for its way to handle text formatting so transparently. However, it doesn’t really fall in this category of (linked) note taking software, so it is not included in this comparison. If you’re interested in writing Markdown with a WYSIWYG editor then you might want to check out my Typora review.
Let’s get started!
Zettlr
The first contestant is free and open source software, called Zettlr. It is quite popular among researchers in many universities, and the GitHub repository has almost five thousand stars at the time of this writing.
The main selling points of Zettlr are the reference manager integrations, citations, interlinking, file exports to multiple formats, and an advanced search algorithm. And to many people the most important “feature” is it being open-source under the GPL-3.0 License.
The focus with Zettlr is to provide the tools for authoring and research. It has the ability to add citations and export to Pandoc, LaTeX and Textbundle, so it is a good fit for academics.
Linking files
Zettlr uses [[wikilinks]]
for internal linking. If you have a note called Daily tasks.md
then you can link to it from other notes with [[Daily tasks]]
. These links can then be used to navigate between the different pages. If you’re worried about using a syntax that is not standard Markdown you can also choose to use the [Daily tasks](Daily tasks.md)
style links too.
Adding links is easy. If you start with opening square brackets Zettlr will show you a popup with suggested notes as you start typing. The autofilled entry will then contain the name of the file and then the note title.
The common problem with wikilinks is that each file in the vault needs to have a unique name so that it can be linked to without knowing the file full file path. With Zettlr you have two options:
- choose the file names yourself, or
- use autogenerated numerical IDs.
The first option makes sure that each note has an understandable file name, so that it can be theoretically found even from a pure directory listing. It will also make the wikilinks look nicer since they will then contain human-readable text. This does have one problem though, if you update the file name, then you will also break all existing links.
This is why the “Zettelkasten ID” is automatically provided to you when you create a new file. It is basically a timestamp from when the note is created, so even if you change the title within the note, all link references will continue to work. Because these numerical values would be difficult to remember and understand in the context of other notes, Zettlr will automatically include the note title when you link to it:
[[20210326195658]] Hello world
The titles also work in the left sidebar file manager wiew, where you see the note titles instead of file names when the file name matches the ID format.
Tags can be used to create shallow links between notes, for example #todo
. When you control/command-click a tag you will see a list of search results of pages using that tag. You can also view a word cloud of tags and see how many notes each one has.
Frontmatter
Zettlr supports standard YAML frontmatter that starts with three dashes (---
) at the start of a file. Some variables have a specific meaning, others will be ignored but still highlighted normally.
Use the title
tag to define the final title of your document. This is also the title that is shown in the search view in place of the filename. The list of authors is used when exporting to PDF.
Keywords act as tags in the frontmatter. You need to use the frontmatter keywords when if you want to have tags with spaces since that is not possible with the hashtag syntax.
Check the rest of the supported frontmatter variables from the official documentation.
Finding files
The search functionality is excellent. Zettlr uses some sort of a fuzzy algorithm to find matching content. You’re quite likely to find what you’re searching for, if it just exists in the vault. The results are shown as sort of a heatmap; the more times your search query appears in the file the brighter green it will be in the listing.
When you navigate to another note through a link the search query will be automatically changed to the file name or the note title, depending on whether you’re using the Zettelkasten IDs or not. Basically this gives you an automatic list of backlinks and mentions to the note that you’re currently reading. The other note doesn’t necessarily even need to link to the file, if it contains the title phrase somewhere, it will be included.
Because of the way that files are linked together you don’t necessarily need to maintain a specific folder structure. You can keep all files at the same directory level and rely on the search functionality to find the files you need. You can also maintain an index note that contains links to the major topics in your vault and acts as the entry poient. Each main topic would then contain links to individual thoughts and concepts. Your file organization won’t be rigid, and notes can belong to multiple categories at the same time.
UI and user experience
Zettlr has arguably a very clean look. I think the text editor has the right amount of highlighting without being a WYSIWYG editor. The syntax for normal Markdown links is hidden, so you only see the highlighted link text until you move the cursor over the link. The wikilinks are shown as is since they are already so minimal, but they use the same green link color.
The current tab management flow and a lack of “back” button are the things that I find the most difficult to live with. If you edit a file and then ctrl/command-click a link it will be opened in a new tab. If you haven’t edited the file it will be opened in the current tab. To me this feels a little unintuitive. I would like to have the ability to open in a new tab as needed, just like in a web browser.
The missing back button is somewhat mitigated by the search view. When you navigate to another note you can go back to the previous one from the search results since it’s guaranteed to be there. On the other hand, if you find yourself navigating between two notes a lot maybe that means that you should build strong two-way links, instead of relying on one-directional links.
Export to different file formats
If you wish to share your notes with others then the Markdown format may not be the most convenient choice, especially if you have embedded any images. Zettlr comes with a multitude of export options built-in. It uses Pandoc and LaTeX behind the scenes to convert to PDF, Word document, HTML, and more.
To be able to export as PDF you’ll need to install a LaTeX distribution, but it is straight forward if you just follow the instructions and choose the recommended version. The default output is pretty clean, but you can unleash the full power of LaTeX and create your own templates if you wish.
You can also turn your directory into a project which lets you to export everything as a single PDF. In theory, you could even write a book as a separate Markdown files within a project, and then use the export feature to create a publishable PDF. The exported file can contain a title page and a table of conents, and the output can be customized with a custom TeX template.
Other features
Zettlr comes with some additional productivity features. With the built-in Pomodoro timer you can use the Pomodoro Technique to manage your time usage by breaking your work into short intervals.
You can export the library data from your reference manager software, such as Zotero, and use it directly inside Zettlr. Then you can add citations using a special syntax that will render a preview within your notes. Pandoc will automatically handle the citations when you export your notes to other file formats.
Automatic spell checking is also available for some languages, and you can create autocorrect rules that replace phrases with something else.
Verdict
Zettlr is a great piece of free software with features that cater especially to the academic crowd. It works wonderfully for basic note taking too and the UI doesn’t look bad at all!
The search functionality is really useful and easy to use, but the current tab management is keeping me from adopting the software. Also you either love or hate the ID based filenames that you need to use if you don’t want to worry about breaking internal links.
The export options are great when you need to share your notes with others.
Obsidian
Next we have Obsidian which is a commercial product. It is free for personal use, and it’s also free for commercial purposes when you work alone. If you use the product for revenue-generating, work-related activities in a company that has two or more people you need to get a commercial license for each user. So if you’re a blogger who makes money from their blog, and don’t employ other people, then you’re still allowed to use the product for free.
Odsidian markets itself as your second brain. It is the place where you store your knowledge and access as needed. Linked notes form a knowledge graph that you can inspect in the graph view.
Notes can be viewed in two modes: edit mode and preview. The edit mode formats your Markdown code with proper highlighting and font adjustments but keeps the syntax visible. The preview mode generates a nicer looking output when you want to read your notes, but it doesn’t let you edit the content. It’s quick to switch between these modes with a keyboard shortcut, though.
The above image shows my quite heavily customized Obsidian configuration. You can modify the look and feel with custom themes and add new functionality with built-in and community plugins.
The view management is quite versatile. You can open notes in separate panes that can be reorganized as you wish.
Linking
Obsidian uses the same [[wikilink]]
style for internal linking between notes. Usually a link is just the file name without the .md
extension no matter where it is located, but if you have files with identical names, then the relative path should be defined too. Links can also point to a header in case your notes are long.
While Zettlr relies on filenames that will never change, Obsidian takes the route where it manages the links and filenames for you. When you rename a file you can let Obsidian update all the existing links in your vault. This means that your filenames can be as descriptive as needed.
Notes can also be embedded within other notes, which is especially nice when you have small atomic notes that can be used in many contexts.
The internal links form a graph of nodes that Obsidian tracks in the background. You can use the graph view to visualize the connections in your vault, find clusters of information, detect links that don’t have a note yet, and just play around with. The graph view is one of the killer features of Obsidian, not necessarily due to its usefulness, but because of the cool-factor. It motivates you to keep on building your knowledge base as you see the connections become more and more complex.
Color coding rules make it easier to understand where the files are located or what tags they use. When you zoom closer the note names will also fade in.
You can open a local graph to a separate pane. It shows the local connections to the currently active note, making it easier to understand the immediate space around your note. The local graph can be used for navigation too, just click the node that you’re interested in.
Metadata
There are different ways you can include metadata in your notes. The simplest way is to add tags using the hashtag syntax, for example #todo
. The tag can be anywhere in the note and it will be picked up automatically. Clicking a tag opens the search view where you can find all related notes.
Tags don’t need to be text-only. You can create emoji tags and give them custom meanings in your vault. You could mark work-in-progress with the construction sign emoji 🚧, or the status of a note with ✅ and ❌.
Tags can be nested, so you can create a custom tag hierarchy, for example:
#blog
a general blog note#blog/post
a blog post note, also matches#blog
#blog/idea
a blog note that is still on the idea level, also matches#blog
I hope you got the idea.
Custom metadata can be defined with a YAML frontmatter at the beginning of the file. The keys and values can be anything you want or need for plugins or other applications, such as static site generators.
Tags can be defined in the frontmatter with the tags
keyword. You can also define alternative names for your notes with the aliases
attribute.
Search and backlinks
The search view can be accessed from a tab on the left side pane. Files can be searched based on the content, path, file name and tags, and you can limit the search to keywords on the same line or under the same heading. These rules can be combined to build more complex search queries.
Searches can be embedded on a note with a query
block. With embedded queries you can create dynamic hub pages that could contain pages under a certain directory, or pages with a specific tag:
```query
tag:#TODO
```
I already mentioned that links are visualized through the graph view. The Linked mentions and Unlinked mentions view on the right hand pane is a place where you can check the backlinks to the current note. Linked mentions lists all notes that contain an explicit link while unlinked mentions is where Obsidian thinks that a note could be linking. You can use the unlinked mentions to add real links when you spot that one is missing.
Templates
Templates can make your life easier. If you find yourself constantly typing something, for example many frontmatter parameters, consider creating a template. When you enable the built-in template plugin you can create a directory that contains normal Markdown files that can be used as templates and added to your notes with a shortcut.
Having separate templates for each note type means that you won’t forget to fill in the needed information. The template can also include all your valid frontmatter arguments so that you can choose which ones to keep instead of trying to remember which you need to fill.
Sharing your vault
While you don’t have as many options as Zettlr, there are two ways you can share the content in your vault.
Obsidian Publish is an add-on service that you can use to publish your notes on the internet for a monthly fee. You can choose which notes to make public, and the selected pages can be viewed on any browser. At the time of writing this feature is still under development, but in future you should be able to add password protection and a custom domain.
Alternatively, you can export single notes to a PDF. There aren’t that many customization options but maybe this feature will be improved in the future too.
Community plugins
The main architectural choice of the Obsidian team is to make the software highly modular and configurable. Therefore community-made plugins can use the public API to modify and interact with the application. The visuals can also be configured through custom theming or CSS inside the vault. Here I’m going to list some plugins that I actively use.
The Templater plugin improves the built-in template feature by adding custom keyword replacements. You can use internal templates to replace the template contents with the file name, folder, current date, yesterday, tomorrow, and so on. User defined replacements call arbitrary command line programs and replace the custom template with the command output.
As an example, I have created a custom replacement rule that finds the previous available daily note from my journal directory (should work on Linux and Mac):
ls -1 journal | tail -n 1 | head -1 | sed -e 's/\.md//'
When I create a new journal entry my journal template will then find the previous one and link to it automatically. It also contains #
for the title and places the caret after it so that I can start typing the note title right away.
The Calendar plugin adds a handy calendar to the right sidebar. When you click a date it will open or create the corresponding daily note for journaling.
Advanced Tables makes Markdown table creation and editing a breeze. Create a table with a single |
, use Tab to go to the next cell and Enter to go to the next row. The table controls can be used to reorder, insert and delete rows and colums, and to change the text alignment. When the content of a column on one row gets longer, the rest of the rows are adjusted automatically to keep the table pretty.
Dataview is a real game-changer. It lets you query your vault with an SQL-like syntax and display the data as a list, table, or a list of tasks. It’s a bit similar to the built-in embedded query
feature, but even more powerful. A dataview table can show frontmatter data, so you could easily use it to filter your favorite recipes or find all #TODO
notes with their due-dates. I’m currently experimenting to create a custom Kanban board with the Dataview plugin (as seen on the UI overview image).
Hider is a simple plugin that lets you hide UI elements from the app to make the experience even leaner. Don’t care about the status bar, title bar, scrollbars or tooltips? Use the Hider plugin to make them disappear!
Dangerzone Writing is a fun plugin that forces you to the flow state by removing the file contents if you stop writing. Recently, I made a separate post about getting in the flow where I talk about my first experience using the plugin.
Verdict
Right now Obsidian is the tool that I like to use to build my knowledge vault. It has most of the features I need, and due to the plugin architecture it will get new features that wouldn’t be implemented otherwise.
Obsidian is under active development and gets new updates on a regular basis. It is free to use for commercial purposes if you’re working alone, so I can use it to take notes for my blog even if I earn a few dollars from ads.
The graph view is addictive.
Conclusion
If you’re looking for Markdown-based note taking software there are lots of options available with their strengths and weaknesses. Here I have covered only two options but I’m planning to include comparisons of other software as soon as I have the time to really test them out and write down my thoughts.
I find personal knowledge management exciting, and I have already noticed how it has helped me organize my thoughts and keep track of the things that interest me. If you’d like to hear more about how I use Obsidian day-to-day respond to the embedded tweet with your questions/comments and I might write other blog posts to answer them.
Discuss on Twitter
I've been super interested in personal knowledge management, so I decided to write a blog post about the Markdown-based tools that I've consideredhttps://t.co/2vK8fVr4Ye
— Janne Kemppainen (@pakstech) April 6, 2021
Previous post
Show a Progress Bar in PythonNext post
Analytics Addiction is a Thing