This is a small set of elisp functions I use to implement my own version of a Zettelkasten, something that HN is currently infatuated with.
The org-kasten operates on a folder, with a “special” file named 0.org
. This
acts as the entry point and is hotkeyed to C-# C-#
. This is the root of the
document tree. From there on, the rest of the Kasten is available.
The root node, 0.org
, is special. It can’t have any ancestors, and will be the
entry point to the rest of your notes. I usually use this as an index, where I
link (org-mode links, to be clear) to entry points of ideas, subtrees, and
specific explanations. Everything that needs quick access usually is linked to
from here.
From the root node, you can descend by pressing C->
. This will either navigate
you to the children of the current node, or give you the option to create a new
child note.
As you descend, the children follow a specific format. The first level of
children of your root node, will simply be numbered. 1
, 2
, and so on. You
can arbitrarily nest children, so eventually your kasten will contain 1a28b2
,
for example. Each different segment (either numeric or alphabetical) represents
another level of nesting. The first child to 1.org
would be 1a.org
and its
first child would be 1a1.org
. There’s no limit to either levels of nesting or
amoun of children, so go nuts.
As you descend, pressing C-<
will take you up one level. A combination of
ascending and descending is how you will navigate your kasten with reasonable
speed.
The last piece of the puzzle are links. These break the strict hierarchy, and
allow you to cross-reference thoughts in different subtrees. Eventually these
will have a nicer UX, but for right now, you add a line at the top of the note:
#+LINKS: 1a
. Different IDs are separated by spaces, and they will all be
counted towards the children of the current note, allowing you to “descend” to
the links you describe.
This is irreplacable for linking together thoughts that came from different origins.
This was written because I find the common implementations actively harmful to the core idea of a Kasten.
- The notes need a hierarchy. This provides context to them, context you otherwise would have to re-establish in each node.
- Backlink overviews as popularised by Roam are bad because they posit that each link has to be bidirectional. This is not the case.
- They tend to encourage large nodes by having poor context facilities. Large nodes reduce traversal of your graph and thus also reduce the effectiveness of it. Large nodes with poor context also result in duplicating information, because you scarcely traverse enough to see the network.
- The idea of a kasten is to encourage competing and outright contrary ideas, resources, theories and resources, which is lost when your kasten becomes a bad wiki. A wiki asks you to author a version of “the truth”, as each page is its own context, not its position in the graph.
- The idea is to have a node per idea and to construct theories with subgraphs. This is lost in wikis, as inevitably they start accruing larger pages.
As such, org-kasten
aims to do the inverse of that:
- Traversal is made painless and quick, encouraging “one thought per node” and thus keeping nodes small.
- Hierarchic notation and navigation provides a sense of place, as often-traversed subtrees feel familiar.
- Links are unidirectional as they add the target to the nodes’ children, but the target has no notion of this.
It’s far from perfect, but it feels closer to a paper kasten than to a wiki, and I consider that a success.
My workflow with this works a little bit like this:
- Read something interesting in a paper/book/Twitter/Lobsters
- Associate it with something I’ve thought of previously, an idea or argument.
- Find it in the Kasten by means of the root node index or navigating to it.
- Add one or more new child notes to the nodes it relates to, adding links as I find them or they occur to me.
- Repeat.
- Eventually this condenses into a coherent argument, elaboration, essay, or causal chain that you can write about or use to illuminate other issues. The end product of this chain is writing of some form, usually nonfiction for others to read.
- I find an article by Drew DeVault on lobste.rs, about how the AGPL is unfairly maligned, and read it.
- This reminds me of a growing strand of ideas and discussion that I’ve recently read about, about the growing co-opting of FOSS by commercial interests.
- I go to my Kasten, and find my entry to the topic in my index. (in my case,
1a4.org
.) - I navigate to the children, and find the part where licenses are discussed. (
1a4b.org
) - I add a new child (
1a4b1.org
) about how there are certainly commercial interests in keeping the licensing discussion framed in a way favourable to the people co-opting community labour. - As a side effect, I also reviewed the entire discussion chain that I needed to see to add the note, connecting it to the previous thoughts and discussions.
- Then I add a link to a note about propaganda (
3a1.org
), as the ‘framing of the discussion’ part is very much reminiscent of propaganda, and this could yield further parallels in how the discussion was shifted towards being friendly for big tech companies using FOSS labour. - This prods me to see if there are further links in this space.
- I lose interest and read something else.
This is basically the loop of the Kasten. What you find most interesting will eventually accumulate a lot of notes, and will make writing about it very easy, as a plethora of connections, thoughts, ideas, arguments for and against are easily available to you. What you do with it afterwards is for you to decide.
- Place somewhere on your Emacs loadpath. I symlink the repo to
~/.emacs.d/init/org-kasten.el
. - Add to your
init.el
:
(use-package org-kasten
:config
(setq org-kasten-home "/path/to/kasten/")
(add-hook 'org-mode-hook 'org-kasten-mode))
This code is licensed under the GPLv3, and is not part of regular Emacs. See
LICENSE
for more information.
- A “writing desk” functionality. That meaning, copying the contents of nodes to a predestined file with a single command, to assemble notes for processing into more edited, continuous text.