In case you have not read my last article on this topic, briefly described the Zettelkasten method is a way to organize notes and thoughts in an interconnected web of ideas rather than a hierarchical structure like with (sub)-directories. Even my old (lengthy) article is not the best intro to this huge topic, so if you’re new to it, I recommend that you first do some research about what a Zettelkasten actually it. If you’re a knowledge worker who regularly writes or gives presentations, this method will definitely be something for you and is worth the time and effort.
I have been using this method since October 2020 and had a few learnings along the way, which I would like to share with you in this article. In fact, these learnings have been so fundamentally that I actually “migrated” my Zettelkasten notes into a new structure that better fits my workflow and uses a lot more features from my dedicated note-taking tool, Obsidian. I will explain why this rather drastic approach was necessary and worthwhile. As always, I would like to hear your opinions in the comments below.
First, let’s talk about what has been bothering me in my old Zettelkasten.
On thing that kept happening over and over is that certain notes would get larger in size as time went on. The notes felt more like Wikipedia pages rather than the small ideas that were the foundation of Luhmann’s physical Zettelkasten.
The process of creating new notes was also slow. When you’re in the middle of something, e.g. pair programming with a colleague and writing something, and a thought crosses your mind, it is important to get that thought out of your head and persistent somewhere so you can get to a “mind like water”, as David Allen describes it with his “Getting Things Done” workflow. If you have to open up Obsidian, create the new note and maybe even fill it with a template, then this amount of work creates hesitation. In the end, the thought is lost.
I also failed to avoid the fallacy of hoarding notes that are not related to anything I work on. For example, my Zettelkasten included notes about Zettelkasten itself. This might be somewhat ironic because I am writing about the Zettelkasten method right now, but this is not the focus that I want to have in my notes. My notes should be focusing on what I want to do research on, i.e. software design, patterns and architecture1.
Then there were minor reasons that annoyed me, like YAML headers and Wikilinks I did not use consistently from the beginning. All these reasons combined let me to the conclusion that my initial Zettelkasten structure was not future-proof, so I came up with a different one, to which I migrated all my notes. Luckily, at that point in time, the number of notes was still manageable. Also, going through all the notes again brought some things back into my memory that were lost (partly due to the reason of big notes, as I stated above).
Enough vague talk, let’s start! I have separated my changes into tooling and content.
Let’s first talk about some of the tooling changes I have made during the last year.
Programmer log with easy access using Super + I
This is probably the biggest change in my workflow and toolset, so I wanted this to be at the top of this article. It addresses the issue that you do not want to loose focus when you’re working on something and want to take a quick note. I wanted to have a log of all the things I do during the day so when we have our daily standup meeting, I can simply have a look at the log and mention the most important points. In the past, I used to do this with a physical note book on my desk, but I wanted some way to enter thoughts into my Zettelkasten just as quickly, as well as TODOs for my daily work. Also, I did not want to have a whole lot of tools to rely on, so tools like Todoist were out of the picture.
I created a bash script that I have bound to a simple keyboard shortcut (Super + i). This script opens rofi, which I can then use to type any thought into. Then, a number of things can happen, depending on the input:
When none of the special prefixes are matches, the line of text, along with the current time, will be added to a log file for the current date. If this file does not exist, it will be created2.
If the input starts with “todo “, then the input will be added to a Kanban board in my Zettelkasten. This is easy, because the Kanban board plugin (see below) is just a markdown file with headings for each column. Likewise, there are other keywords for the columns “doing”, “waiting” and “done”, so I can quickly create entries for things that are completed or what I am waiting for. It also creates a line in the daily log. I wished I could hook into the state transitions on the board to reflect the change of an entry in the log as well, but for now, this works.
If the input starts with “z “, then a new Zettelkasten note with the status of “inbox” (more on statuses below) will be created, with the input as the title3. This also creates a line in the daily note.
I use this script all the time and it has really come in handy in the past. No more stuttering during daily standups because you struggle to remember what you did yesterday.
Initially, I only used a bare minimum of Obsidian plugins, like the Vim emulation mode and “Show whitespaces”. Now, the list has increased quite a lot. Some of the more noteworthy plugins that I can recommend:
- Kanban, which powers the kanban board described above
- Templater, which makes the templates a little “smarter”
- Dataview, which powers my Index page with always up-to-date overview of all the notes that are work-in-progress. I also have a dataview query in my daily notes template so I can easily see which notes were created on that day (since manually created notes will not show up in the log).
I must say that I initially did not believe the plugins were that useful, but when you have been working with the Zettelkasten method for a while, you start to see the potential of these things. My highest thanks to all developers who contribute their valuable time for these plugins 🙏!
Of course, tooling is only an enabler for the actual changes that we want to make, which are the content changes.
Avoid nouns, embrace statements
In the old Zettelkasten, I had a noted called “DevOps”. This note would contain an explanation of what the term meant and brief sections of how it related to other notes like “Agile Software Development” and “Cloud-native”. These notes filled over time, because a note called “DevOps” makes you think about it like a Wikipedia page. Stuff about DevOps goes here. This is because nouns are not atomic ideas, they define a term that combines a lot of different ideas. Besides, there are already Wikis out there in the internet, not need to copy the same information with different wording.
So in the new Zettelkasten, I tried to focus on statements. Instead of the note above, I created a note called “DevOps is a catalyst for agile transformations”, which in essence represents one of the many connections that exist between DevOps and Agile Software Development. These two terms still exist in the Zettelkasten, but they are completely empty. Their only purpose is to enable other notes to connect to them. For the most time, you do not even have to create a file for them, because in Obsidian, a reference to a not-existing note can still connect notes. So a great deal of nodes in the Zettelkasten graph have no file attached to them, they simply link notes about a term together.
Avoid negative statements
I had a note in my Zettelkasten with the title “Microservices do not create a better design”, so it basically said there is NO connection between the two terms “Microservices” and “Good Software Design”. And while the statement is true, the note leads to these two terms being closer together than they actually belong. I try to avoid these notes as good as I can and try to think about what kind of relation there is. So in the new Zettelkasten, the note has the following title: “Microservices lead to a false sense of good design”, a statement that can be linked to from more “psychological” note in the Zettelkasten, like cognitive biases.
Kudos to Bryan Jenks, who I stole quite a lot of ideas from 😉. I now use tags differently from what you might intuitively use them for. Tags are there to indicate the status of a note, i.e. whether it is new or already processed. Bryan uses emojis for that, but I do not like that, so I use words instead. I have the following tags for Zettelkasten notes:
#inbox: New, unexplored ideas. Can contain only a title or a single question (default for new Zettelkasten notes)
#wip: Started working on this, just dumping thoughts as text into it. Not sure where it might lead to
#unpolished: Almost done, but not quite. Some connections may be missing or it is not atomic enough to be an evergreen note
#evergreen: An atomic idea, connected with other notes in the Zettelkasten
#moc: A Map Of Content representing a larger topic area
I often find myself going from
wip directly to
evergreen and one could argue that a note that is
unpolished is also
wip, but it works for me.
Additionally, I have these tags for Literature Notes (that are also stored in my Zettelkasten):
#unread: For literature that is not read yet. Does not contain any notes apart from Reference Notes (Author, link, …)
#wipliterature: Contains (all?) notes for the literature, but is not done yet. Most importantly,
#inboxnotes still have to be created
#done: Literature is read and notes are stored for potential questions
Now or never
I am currently still in the long transitioning phase, which is not easy, because I basically have two Zettelkasten setups right now. The old one contains around 60 literature notes and 210 Zettelkasten notes, which is a lot, but still manageable. I started with transitioning the old literature notes first (because that’s basically copy and paste), and then changed to core ideas of each literature note to be content-wise more like I want them (no nouns, no negative statements, etc). After that, I went through the daunting task of carefully selecting the notes that I want to keep from my old Zettelkasten which are not automatically created during the literature note renewal, again with a strict focus on the properties I want to have for them content-wise. The good side of all this work is that I get to see and rewrite each Zettelkasten note again and I can really observe how much I learned in the last year.
The new Zettelkasten structure will not be perfect either, I know that. I do not think I will make such efforts again when I find more learnings in the future. But I hope you can learn from me to avoid some of the mistakes I made and gain something from the improvements I made along the way. Let me know in the comments below if you found this useful.
- If you’re wondering, this article was mostly not written using notes in my Zettelkasten because of this very reason. [return]
- Technical site note: When you’re using the Templater plugin for Obsidian for your templates, make sure Obsidian is actually running then creating a new file, as only then the template will be executed. [return]
- If you’re using my script, make sure you’re only using characters that are valid in file names. I often make the mistake of adding a question mark in the file name, which works on Linux, but not on Windows. [return]