Watch My EmacsConf Talk: Zettelkasten for Regular Emacs Hackers

Last December, I gave a talk at EmacsConf 2025 called “Zettelkasten for Regular Emacs Hackers”. I announced it back then, but never pointed to the recording. Here it is.

Zettelkasten for Regular Emacs Hackers, EmacsConf 2025 (23 minutes)

The pitch: writing improves the quality and depth of thought, and a Zettelkasten is an environment for thinking through writing, not merely a place to store notes. Nobody can hand you a finished thinking environment the way they can hand you an email client. You have to build your own, and Emacs is the most moldable place to do it.

In 23 minutes, I walk through:

  • the three essential mechanics: write (with effort), connect (with links), and correct (improve notes as you learn more);
  • the habits that make it scale over decades: design for use, create structure, start in the Zettelkasten, and start with a link;
  • why “garbage in, garbage out” applies to notes, too;
  • a live demo with a minimal init.el and Denote to create, link, rename, and backlink notes. Try it yourself with the configuration and the notes from the demo below.

Try it yourself

This is the whole configuration I used in the demo. Save it as init.el in an empty folder and launch Emacs from there:

$ emacs -nw --init-directory . init.el
(load-theme 'modus-vivendi-tinted)  ;; Dark theme to match dark slides
(menu-bar-mode -1)                  ;; Disable topmost menu bar

(package-refresh-contents)

(use-package denote
  :ensure t
  :hook (dired-mode . denote-dired-mode)
  :bind
  (("C-c n n" . denote)
   ("C-c n r" . denote-rename-file)
   ("C-c n l" . denote-link)
   ("C-c n c" . denote-link-after-creating)
   ("C-c n b" . denote-backlinks)
   ("C-c n d" . denote-dired)
   ("C-c n g" . denote-grep))
  :config
  (setq denote-directory (expand-file-name "./notes/"))

  ;; Automatically rename Denote buffers when opening them so that
  ;; instead of their long file name they have, for example, a literal
  ;; "[D]" followed by the file's title.  Read the doc string of
  ;; `denote-rename-buffer-format' for how to modify this.
  (denote-rename-buffer-mode 1))

;; For the demo, I forced notes to show in full screen by default.
(setopt display-buffer-alist nil)
(add-to-list 'display-buffer-alist
	     '("^\\[D\\] " ;; Denote buffer name prefix
	       (display-buffer-reuse-mode-window display-buffer-full-frame)
	       ))

The notes from the demo

These are the notes I wrote during the recording. The video runs them at 3 to 4 times the speed, so they’re easier to read here.

Mechanics and habits to use a Zettelkasten

#+title:      Mechanics and habits to use a Zettelkasten
#+date:       [2025-11-21 Fri 20:48]
#+filetags:   :zettelkasten:
#+identifier: 20251121T204827

Essential:
- Write: put in effort; [[denote:20251121T205045][GIGO]]
- Connect: Link notes to create trails
- Correct: Improve as you go

Additional:
- Design for use: give things a purpose, e.g. blog about it
- Create structure. [[denote:20251121T205312][Types of structures in a Zettelkasten]]: design new entry points and trails
- Start in the Zettelkasten: use the system to learn, make it grow, get better
- Start with a link: keeps your notes connected. [[denote:20251121T210416][Create notes as link first to avoid orphans]]

Tool doesn't matter as much. Small files are good. [[denote:20251121T210107][Use Denote in Emacs]]

(Christian Tietze: Zettelkasten for Regular Emacs Hackers, EmacsConf 2025)

Garbage in, garbage out

#+title:      Garbage in, garbage out
#+date:       [2025-11-21 Fri 20:50]
#+filetags:   :programming:quality:
#+identifier: 20251121T205045

The principle known as "Garbage In, Garbage Out" (GIGO) in computer
programming states that for any system, the quality of output is
directly depending on the quality of input.

See: https://en.wikipedia.org/wiki/Garbage_in,_garbage_out

Types of structures in a Zettelkasten

#+title:      Types of structures in a Zettelkasten
#+date:       [2025-11-21 Fri 20:53]
#+filetags:   :structure:zettelkasten:
#+identifier: 20251121T205312

Non-comprehensive list of structures that could be used in a Zettelkasten:

- Opposition pair: 1 note for the pair, 1 note per position/opposition each; pro/contra
- Table of contents: list of topics/headings
  - an outline for a writing project
  - recreation of a book's contents (so I can write in detail about the book);
- Argument: recreation of a distilled form to get to a conclusion;
  list premises and evidence, and how these support the conclusion
  - Counter-argument: address parts of the original argument to support another
    view and test the argument's strength
- Table of things
- Graphics, like a concept map, Mind-Map, diagram: visually bring
  elements into a relation, then write about the relation and the elements

Metaphors:
- Iceberg: visibile tip with hidden depth; someting that appears small
  but is large; good metaphor for obstacles
- Black box: focus on inputs and outputs, and ignore the 'how' in the middle
  - e.g. most Emacs Lisp functions (hoping the documentation is good)
- [[denote:20251121T205739][Atom, molecule, organism]]: how small parts compose to larger parts,
  which compose to even larger pieces
  
  
(Christian Tietze: Zettelkasten for Regular Emacs Hackers, EmacsConf 2025)

Atom, molecule, organism metaphor

#+title:      Atom, molecule, organism metaphor
#+date:       [2025-11-21 Fri 20:57]
#+filetags:   :composition:recursion:
#+identifier: 20251121T205739

Atom: smallest part, indivisible elements
Molecule: comprised of atoms; structure added to combine elements
Organism: comprised of molecules; different level of analysis, irreducible to molecules/atoms

This can be used e.g. for programming: functions compose into larger
functions which compose into packages.

Actual biological organisms also work in such a way. Organs are part
of bodily functions (high abstraction), but from a chemical or
physical perspective, you can decompose them into atoms. That doesn't
tell you anything about the organ's function.

Denote.el for Zettelkasten in Emacs

#+title:      Denote.el for Zettelkasten in Emacs
#+date:       [2025-11-21 Fri 21:01]
#+filetags:   :denote:emacs:zettelkasten:
#+identifier: 20251121T210107

While not shipping with Emacs out of the box, Denote is easy to install and a great start to manage notes:

- it comes with unified way to create new notes, and hides time-stamped ID's with "[D]" in buffer lists
- it can manage links, and show incoming links to notes ("backlinks")
- it supports quickly adding links, and creating links _first_ out of
  the box -- it just creates the note immediately, so you don't notice
  - [[denote:20251121T210416][Create notes as link first to avoid orphans]]

* Example configuration

#+BEGIN_SRC elisp
(use-package denote
  :ensure t
  :hook (dired-mode . denote-dired-mode)
  :bind
  (("C-c n n" . denote)
   ("C-c n r" . denote-rename-file)
   ("C-c n l" . denote-link)
   ("C-c n c" . denote-link-after-creating)
   ("C-c n b" . denote-backlinks)
   ("C-c n d" . denote-dired)
   ("C-c n g" . denote-grep))
  :config
  (setq denote-directory (expand-file-name "./notes/"))

  ;; Automatically rename Denote buffers when opening them so that
  ;; instead of their long file name they have, for example, a literal
  ;; "[D]" followed by the file's title.  Read the doc string of
  ;; `denote-rename-buffer-format' for how to modify this.
  (denote-rename-buffer-mode 1))
#+END_SRC
#+title:      Create notes as link first to avoid orphans
#+date:       [2025-11-21 Fri 21:04]
#+filetags:   :linking:zettelkasten:
#+identifier: 20251121T210416

Recommended practice by Christian Tietze: start a new note with a link
first from some place, any place, then create the file to match that
link (which would initially lead nowhere).

- Reduces orphans in the Zettelkasten by guaranteeing every note to
  have at least one link.
- Supposedly teaches you to think about possible connections early,
  which makes the network better.

A very loosey-goosey approach, when taken literally and used
liberally: it doesn't matter where you are, just leave a forward link
to something you wish existed. Even if it doesn't fit the current
note. After all, you came up with the idea just now -- so maybe
there's a connection that you just can't spell out, yet?

Follow along

If you want the general introduction without Emacs, zettelkasten.de is the place to start.