• he/him

one more cute disaster… it’s hard here in paradise

last.fm listening



trangar
@trangar

For a while now I've been working on a zettelkasten system. I am excited to announce that the very first version is publicly available, and I've already started using it myself. In this post I will describe what a zettelkasten is, and how you use my implementation.

tldr download link: https://github.com/Trangar/zettelkasten/releases/tag/0.1.0

What is a zettelkasten

zettelkasten is a German word. From wikipedia: zettel means slip note and kasten means box. It is a way to store cards where the cards can reference to each other.

When growing up I used to make a lot of mindmaps. They look something like this

An image of a mind map. It has a central word, with branches that split off into other words. Those words have more branches splitting off into more words

This is a very hierarchical setup with 1 key point, several sub-points, and each sub-point can be nested to have more sub-points.

This system worked fairly well for my brain at the time, but it quickly outgrows its usefulness once you start trying to record data that is not strictly hierarchical. This is where a zettelkasten system is different; it allows you to make any link between 2 notes, or "zettels".

Why I implemented my own system

A while back I made a system that somewhat resembles a zettelkasten system. At the time I did not know the word or have a way of finding similar systems to this. At the time I simply called it "mindmap".

A month or 2 ago some of my friends started talking about zettelkasten. One of them uses an emacs implementation, and was very happy with it. I tried one of the alternatives (more on that later) but did not really like that I couldn't self-host it.

Modularity

When discussing with my friends how to best implement this, we quickly noticed we wanted completely different things. I wanted a web interface with a postgres database. Others wanted a terminal application and did not want the hassle of setting up a database.

For this reason the entire repo is very modular. It has 3 different groups of features:

  • runtime- features. This will determine what async runtime to use. Currently this supports async-std but it might support tokio in the future.
  • data- features. This determines what database to use. Currently this supports data-sqlite, but data-postgres will follow soon.
  • front- features. This determines what front-end to use. Currently this supports front-terminal but front-web is in the works.
    • The system should be able to run multiple frontends, e.g. front-terminal and front-web, in parallel

Alternatives

Some alternatives I've found (there might be more) and the reason I don't like using them.

  • obsidian.md is by far the most popular. It is closed source and has a free tier, but I do not like that I can't self-host it and that I might lock my thoughts in someone else's system.
  • logseq.com is another implementation. It is currently free (but their business model seems unclear), and claims to be open source. In reality their client is open source and their server isn't. Additionally all of their documentation is written in their own system, which means it's written in a way their brain works.
  • The Archive (zettelkasten.de) is paid, closed-source, and macOS only.
  • emacs-zettelkasten is emacs-only (I'm a vim person), and written in elisp (meaning I can't maintain it if I want to)

Getting started with my zettelkasten

You can start with my zettelkasten implementation by downloading the binaries from https://github.com/Trangar/zettelkasten/releases, or by compiling it yourself.

The current implementation runs in a terminal with an sqlite backend.

When you open this binary it will ask for a login. There isn't one yet, so hit <tab> and enter a username and password (note that you need to <enter> to switch between input fields).

After you've registered an account, I'd recommend you change the settings. If you hit C it will open the config menu. In my system I have:

  • User mode = single user with auto login
  • Terminal editor (path) = C:\Users\micro\scoop\shims\notepad++.exe
    • On Linux I use /usr/bin/vim

Make sure to hit <Enter> to save, hitting <Esc> will cancel your changes.

To edit your home zettel, hit E. This will open your editor with the current zettel. Closing your editor will make zettelkasten save the zettel.

Links between zettels are created with markdown links. Try adding a [go to another zettel](other_zettel) to your home zettel. Then hit F to follow a link, and hit the key that pops up on top of the link. This will put you in an empty zettel (because you haven't filled in anything yet).

note: I've been told that the link highlight is not very readable on some terminals. A character will show in the highlight, that you need to hit when you actually want to follow a link.

Some other useful keys are:

  • All zettels: shows all zettels by the path they're stored at
  • Search: allows you to search in all zettels. This supports regular expressions.

Conclusion

I'm very happy with this system and I've already started using it for keeping notes, and links I might want to look up in the future. I hope you will give it a try too!


You must log in to comment.

in reply to @trangar's post: