Lately I’ve been using a more organized approach to note-taking than simply jotting things down in a text file or a scrap of paper and then archive or discard them once they’re not immediately relevant to me anymore — let me briefly introduce you to the Zettelkasten method for note-taking, my approach for syncing notes between devices, and securely storing them on an offsite Git-repository.
Whenever I’m in the research phase of working on something I tend to write many notes, from todo’s, to links to relevant blogpost, to little tidbits I need to remember — this helps me to organize my thoughts. As soon as I’m done with the particular job though, I move everything to an unorganized archive or simply discard the information, which is fine most of the time. But still, many other times I’ve found myself circling back to a particular subject at a later time and thinking “I definitley remember there being a very helpful blogpost about this subject the last time I researched it”, and then having to Google for it for 20 minutes before finding it again. I figured there’s room for improvement there :)
So when I was working on my homelab earlier this year, I decided to look for some tooling to host on it, that could facilitate this wish. In particular I was looking for tooling that could help me connect notes, preferably with an ‘evidence board’-like visualizer, so I can feel like the often most sane characters on TV shows who make those boards.

This led me to Niklas Luhmann’s Zettelkasten method, which scratched my itch nearly perfectly. Foremost because many other people also happen to find it a very useful approach to note-taking, and therefore a lot of FOSS tooling has been created around it.
I’m not going to delve too deep into the method here, because there are many resources on it explaining it a lot better than I can in a single blogpost — the page I linked earlier in previous paragraph does a good job for example.
So, in a nutshell: you write down your thoughts in non-divisible units and string them together as hypertext, forming a web of thoughts. In the days of Luhmann you’d achieve that by using an index card and uniquely identified little scraps of paper that you’d then put in a box with little drawers — one might call it a… Zettelkasten — so you could easily retrieve them, but today you simply use tags and hyperlinks in your note-taking tool of choice.
My setup
Now you’re familiar with what I was hoping to achieve, let’s move on to how I achieved it. Also, this seems like a good time to list the other demands I had aside from simply ‘organizing notes’:
- Must support Markdown
- Must have reasonable Neovim support for note management and searching
- Must be usable on Linux
- Must be usable on Android
- Must be easily syncable between devices
- Must be easily versionable with Git or alike
- Must be transparently encryptable at rest offsite
Luckily, I was able to find a solution that checks all of these boxes.
Zk — A command line application that allows you to create and manage notes. These notes will be stored as a text file with a preconfigured file extension in a directory of choice. In my case I have it generate a Markdown file with a random name containing nothing more than a template that looks like the snippet below.
---
title:
date: <today>
tags: []
---
So whenever I feel like writing a note, I simply run the zkn
alias I created for zk new
and start writing my thougths in Markdown format in the predefined template. Pretty nice.
Zk-Nvim — Supports pretty much all the actions that Zk brings, which means you can easily create a new note with preset template, display links and backlinks, follow said links, filter files by tags, and more.
Marksman — Provides completion, goto definition, find references, rename refactoring, diagnostics, and more in your favorite editor using LSP. In addition to regular Markdown, it also supports wiki-link-style references.
Syncthing — When I’m not on my laptop — don’t worry, just hypothetically — and only have my phone nearby, I still want to be able to take notes. And I don’t want to manually sync the notes between my devices, because I will definitely forget about that. So I setup a Syncthing server that constantly and immediately syncs specified directories between devices whenever they’re connected to my home WiFi, or VPN when I’m outside — again, hypothetical scenario, of course.
I paired it with both my laptop and my phone — on my laptop I simply run another Syncthing instance to stay in sync and on my Android Phone I use Syncthing-Fork.
Obsidian — This is the app that I use for note-taking on my phone, it supports all the stuff Zk-Nvim does and more. It will store your notes as Markdown files in a directory you specify, which you then sync with Syncthing. And not to forget, it includes an interactive graph of all your notes, which comes pretty close to my ‘evidence board’-fantasy I mentioned earlier!
Git — To version my notes and store them offsite, I use Git with the Git Remote GCrypt remote helper, to push the versioned notes GnuPG-encrypted (AES256) to a private GitHub-repository. So now I have the full version history of all my notes stored offsite, without having to worry about someone breaking into my GitHub account and retrieving all my notes.
Emanote (optional) — Generate a searchable static website from your notes. I love to use it on my desktop, because even though the Zk-Nvim and Marksman allow navigation of notes very well, I really like the Uplink trees it creates for your notes.
Word of caution
I must stress that should you decide to use the setup described above, you please configure somekind of automated, periodic and offsite backup: just one of your devices running Syncthing needs to be compromised and all your notes are lost forever, or only taken hostage for ransom if you’re lucky.
Syncing with versioned — so files cannot inadvertently or not-so-inadvertently be overwritten — S3 storage, using a user without delete permissions would be an affordable and pragmatic way to go about that. I like to use Duplicity for this myself.
Also, don’t forget that your notes are only encrypted on your remote Git repository — files in your local repository aren’t. So make sure to take necessary precautions there as well, e.g. use full disk encryption, make sure your network security is in check, etc.
Conclusion
If you’re looking for a way to up your note-taking game, consider using the approach I described in this post. I’ve been using it for some time now and I’m very happy with it.
Just make sure to also work on your backup-game, because otherwise there’ll be tears when ransomware hijacks your virtual Zettelkasten.