Create Custom Org-Mode Links to Open My External Zettelkasten App

I’m a fan of linking into my Zettelkasten. I usually do this via a convention: when a 12-number digit is used to signify a timestamp with accuracy to the minute, like 202102101025 for 2021-02-10 10:25, then I expect this to be a note identifier in my note archive. When the timestamp is accurate to the second, I expect this to be something else outside my note archive, like invoices I filed away. To utilize this information, in the worst case, I have to copy the ID and paste it into Spotlight to get to the note.

For my own note-taking app, The Archive, there is a URL scheme to remote-control the app the exact same way that internal links between notes work: thearchive://match/IDENTIFIER.

That can be used for rich text editors to create hyperlinks.

That can also be used to create outgoing links from my Emacs org-mode files.

For example I picked up a fix to a problem on the web, created a note so I can later remember what and why and how, and then I want to attach this note to a task in my org-mode project files. I can register a new link type, zettel, to make this work. The types are prefixed like URL schemes in org links, so I’d use it like so:

See: how to fix XYZ.[[zettel:202102101033]]

I could also add an optional link anchor text, but I usually don’t like to have a very long clickable link. I prefer links to not take up a whole line, or most of it, because the stark blue color is rather distracting from the text around it.

This is the Emacs lisp code to register the link prefix:,

(org-link-set-parameters
  "zettel"

  :follow (lambda (searchterm)
                  (browse-url (concat "thearchive://match/" searchterm)))

  ;; Don't fold links but show ID and description:
  ;;   [[zettel:202102101021][Title or description here]]”
  :display 'full)

With that in place, zettel:-prefixed links in org files execute the URL scheme for The Archive. You can replace the URL scheme with something else, if you don’t use my app.

There’s a ton of customization I just skipped. I got the inspiration for this while reading How do I make a new link type? in Musa Al-hassy’s article on org-special-block-extras – it is packed with a ton of customizations to transform org-mode blocks into interactive HTML pieces, argument trees, and whatnot. It’s crazy and I don’t understand half of it. Go read it.