Thoughts about Zettelkästen

If one visits the silicon valley news-aggregator sites, such as Hacker News, those days one inevitably finds links to articles about a thing called Zettelkasten. A note taking and management method based on cross referenced index cards. Often those articles are long blog posts referencing one particular user of a Zettelkasten: Niklas Luhmann, a German sociologist with a particularly long publication list. This is catnip for the tech elites always on the search for new methods to help them in their never ending search for productivity.

An exemplary blog post about Zettelkästen (HTTPS)

Wikipedia on Niklas Luhmann (HTTPS)

Unfortunately, those articles often stop short of describing of how physical Zettelkästen are actually used and jump directly to software which implements this methodology. If one searches for Zettelkästen in the German web, one quickly discovers that Zettelkästen are much more widely (and longer) used and much less a specific method. In essence a Zettelkasten is just that a physical chest with notes. Users often maintain various indices referencing the notes, often as small Zettelkästen themselves.

German article about the history of Zettelkästen (HTTPS)

Inspired by the extensive usage of notebooks by the automated reasoning researcher Maria Paola Bonacina, I tried to stringently take physical notes in a notebooks that I always carry with me. If you ever had the pleasure to have a technical discussion with her, you probably encountered her ability to recall relevant information and look up the notes in her notebooks in seconds. Unfortunately, I only managed to stick with physical note-taking for very specific situations, such as lectures or in-person meetings. For me digital notes turned out to be much more useful.

Web page of Maria Paola Bonacina (HTTP)

For a while now I have used a Markdown files to take notes. Those files are named after the current month and life in a Git repository. I use git-sync to synchronize them between multiple machines. At startup I open the current file in a text editor and move the editor to an i3 scratchpad. Every day I add a new level-1 heading with the current date. This helps me a lot to keep things together during every day work, but I have not yet found a solution to easily go back to notes taken a while ago. In my never ending search for productivity I dreamt up some small tooling around this.

A Minimalist Markdown Zettelkasten

Let's start with a Git repository with one file per Note/Zettel. Every Zettel start with a level-1 heading and has some special lines detected by the tooling. Those lines can express some tags, or save the date and time the Zettel was created at. The Zettelkasten tool can concatenate some Zettel that satisfy a query and open them in a text editor. It should also be able to recognize new Zettel inserted and save them as individual files while also completing the special line.

The metadata could be expressed inside a code block, this would stop Pandoc from interpreting this part, while still putting it at the right point in the AST. If I'm not mistaken, the verious metadata blocks are presented as extra data to the complete AST.

Pandoc AST reference (HTTPS)

One problem is having a key per Zettel. Such a key would be very useful to have explicit links from one Zettel to others, it needs to be unique. In a physical Zettelkasten one would probably use a catalogue with multiple levels. This seems to be quite cumbersome and unnatural for a digital system. Maybe hand choosen keys might be a good idea, those are easier too remember too. Maybe they could be generated from the title line.

Another problem is linking physical notes and the digital Zettel. I think there is avalue in going over the physical notes again when typing them into the computer,

I'm certainly not the first one having thought about that. Others even implemented their own verion of a «Markdown Zettelkasten». Nevertheless, I think viewing and editing multiple Zettel together is necessary to make it work for me.

A Markdown Zettelkasten (HTTPS)


So far this is purely a theoretical system. To implement it I would probably go for using boring Haskell with Pandoc. Having toyed with the Pandoc API to extend Hakyll for my website, I got the impression that it's quite straightforward to use. Unfortunately, Pandoc is an incredibly huge library.

A first implementation would also just scan the Zettel files one by one for queries. Using some kind of cache would be nice, but much more involved.

As always, suggestions are welcome! Just drop me an email at ''.

Proxied content from gemini:// (external content)

Gemini request details:

Original URL
Status code
Proxied by

Be advised that no attempt was made to verify the remote SSL certificate.