Tags, Not Taxonomies

Monday, September 8, 2025

Table of Contents

As someone who loves collecting notes, ideas, bookmarks, etc, and someone heavily reliant on to-do lists, the revelation that I can organize everything on my computer using tags has been a game changer. When it comes to organizing anything on a computer, I think you should almost always favor tags over categorization.

  1. A hierarchy of categories—such as folders and sub-folders, or headings and subheadings within a document—only affords one way to find things, but tags allow you to query for information in a variety of different ways. A single photo in your photo album may be at the intersection of a variety of different topics of interest for you—travel, nature, a calendar year, a certain loved-one. And any of those topics should allow you to query and retrieve the photo, along with whatever else might also be relevant at the time.
  2. Forcing your files/media/text into a preconceived taxonomy creates a lot of friction whenever something doesn't neatly fit. You end up re-categorizing, which, apart from being time consuming, doesn't address the root cause—there is a many-to-many relationship between information and the topics by which you may one day wish to query it.

costa-rica.jpg

File Management

Files can be tagged in a robust and portable way by using a naming convention which embeds tags in the file names. I use these tags to filter long lists of files down to the intersection of some topics.

This is how I organize my notes, links, and even my Emacs configuration. Manually naming all files in this manner would be tedious, but software can expedite the process. In my case, I use the Denote Emacs package, which is where I got the idea.

Filtering directories in Emacs

To filter the directories, I use the dired-narrow emacs package.

(use-package dired-narrow
  :ensure t
  :bind ((:map dired-mode-map
               ("C-s" . dired-narrow))))

Project Management

I use org-mode in Emacs for project management. Most of my to-do items are fairly concrete, but some are high-level goals. Often times these high-level goals have some overlapping sub-tasks, so nesting tasks would be a poor-fit. Thankfully, org-mode supports tagging to-do items, and querying by tags. And I think it's quite nice if those high-level to-do's act as links to all the associated sub-tasks, so I built a command to create those links.

Details

You can filter org headings by tags using the org-sparse-tree command.

(defun my/org-tags-link (tags-string link-text todo-only)
  "Insert org-mode link text in buffer at point matching tags
defined in TAGS-STRING. Link, when visited, will produce a sparse
tree of org headings matching TAGS-STRING.

When called interactively, prompt the user for tags."
  (interactive
   (let* ((buffer-tags (mapcan #'identity (org-get-buffer-tags)))
          (tags-list-included
           (completing-read-multiple "With tag(s): " buffer-tags nil t nil))
          (tags-list-excluded
           (completing-read-multiple "Excluding tag(s): " buffer-tags nil t nil)))
     (list
      ;; tags-string
      (concat (apply #'concat
                     (mapcar (lambda (tag)
                               (concat "+" tag))
                             tags-list-included))
              (apply #'concat
                     (mapcar (lambda (tag)
                               (concat "-" tag))
                             tags-list-excluded)))
      ;; link-text
      (read-string "Description: ")
      ;; todo only?
      (intern (completing-read "Todo only? " '(t nil))))))
  (insert (format "[[elisp:(org-match-sparse-tree %s \"%s\")][%s]]" todo-only tags-string link-text)))

Link Management

When I find something cool on the web that I want to save for a rainy day, I don't like to use my browser's bookmark system because a) there's no support for tags and b) I don't want my collection of links to be tied to a particular browser or computer. And most times, when I'm searching the information I have stored, I care little whether a file happens to be on my computer or someone else's. So I figured, why not treat my collected web-links as first-class citizens among the rest of my note files? In practice, this means I have a file for each link I want to save, and I configured my file browser in Emacs to treat files with the weblink tag in a special way—opening the embedded URL in my browser when I would otherwise be visiting the file. When I want to save a new link to my notes, I have a keybinding which writes a file to my notes directory based on the URL in my clipboard.

Details

To replicate my link management workflow you can install my package for it.

(use-package denote-dired-weblinks
 :ensure (:host github :repo "Duncan-Britt/denote-dired-weblinks") 
 :hook (dired-mode . denote-dired-weblinks-mode)
 :bind (("s-b" . denote-dired-weblinks-create-bookmark)))

Date: 2025-09-08 Mon 00:00