How I Org mode (2022 edition)

2022-05-31 12:12:03 +0200 +0200

Following up from Being organized, here’s some explanation of what I am doing day-to-day to be organized at work. This what works for me; it very likely won’t work exactly for you. (Also, it’s built on Emacs1 which may make you want to stop reading now. 😅)

With that out of the way, let’s talk about Org mode!

Org mode

At the core of my process is Emacs Org mode. In a nutshell, Org mode is a combination of a file format (.org files) and software (Emacs + a special mode for interpreting these files). Like many things in Emacs, there is a wide variety of ways you can customize and set things up for yourself. Org mode is no exception, and there’s different advice on how you might want to organize your tasks, notes, tags, projects, etc.

For myself, I’ve settled on the following. and ~/org

I use a single file, for my TODO items. There’s another file called todo.org_archive where I archive old notes. (I have in the past tried per-project files, or per-context files, but that was too complicated.)

I have (setq org-directory "~/org"), so everything in a directory called ~/org in my home directory is where Org mode software knows to look for files. I placed this directory in version control.2 I use git-auto-commit-mode so that after every save to a file in ~/org, there is a new commit.3 One cool thing about this is that I can pretty easily travel back in time to see what my TODO list looked like in the past, which is useful when trying to piece together reports for quarterly reviews, for example.

Using headings

I organize headings in my file with the type of work that it is. And I have brackets [0/0] after each heading so that I can update the completion status with C-c C-c, although in truth I don’t use that so much:


Actually, I rarely look at the file directly. Instead, I spend most of my time using an amazing feature of Org mode called Agenda.


It took me a long time to realize that the main strength (for me, anyway) in Org mode was in relying on its agenda functionality. That software parses the items in my file and creates a list of 1) scheduled tasks, 2) tasks with deadlines, and 3) a global list of all TODO items.


And that’s the thing that I look at many, many times per day, and how I interact with my task list.

Writing my standup report

My team has a daily email thread where we’re supposed to write about what we did the previous day. Since I have a hard time remembering all of that, I rely on Org mode to tell me what I did:

Managing the firehose

On a typical day I have a few hundred emails, some dozens of Slack threads, plus things that come up during meetings. I try as quickly as possible to move things I see as “this needs some action from me” out of the app in question (my email client, Slack, etc) and into where I can process it later.

I make extensive use of org-capture templates for that:

(use-package! org-capture
  (add-to-list 'org-capture-templates
               '("w" "Writing" entry
                 (file+headline +org-capture-todo-file "Writing")
                 "* TODO [#C] %? \n%u\n" :prepend t))
  (add-to-list 'org-capture-templates
               '("c" "Comment" entry
                 (file+headline +org-capture-todo-file "Comment")
                 "* TODO [#C] %? \n%u\n" :prepend t))
  (add-to-list 'org-capture-templates
               '("r" "Read / Research" entry
                 (file+headline +org-capture-todo-file "Research")
                 "* TODO [#C] %? \n%u\n" :prepend t))
  (add-to-list 'org-capture-templates
               '("d" "TODO" entry
                 (file+headline +org-capture-todo-file "Inbox")
                 "* TODO [#C] %?\n%u\n" :prepend t)

Then, when I need to do something, I can run SPC X and select a capture template: capturetemplate.png

From there I can add some metadata, like the relevant URL, as well as a scheduled date to work on it. I almost always try to set a scheduled date, so I don’t forget about things, and I usually try to add a URL. But at the minimum, I need to add things to the file, so I can stop holding them in my head and not worry about forgetting that I was supposed to do something.

** TODO [#B] [WIP] Delete the custom phpunit.php entry point
SCHEDULED: <2022-05-31 Tue>
[2022-05-31 Tue]

I’ve also customized the capture templates to add a timestamp, so I can easily see when I added something to my backlog. When I finish capturing the task, it goes into a relevant heading, and each heading has a custom icon to make it easier to visualize what the task is about when looking at my agenda.

For emails, I use the subject line in the TODO heading, so I can find my way back to the message, and for Slack threads I can link directly to the thread.

I avoid setting deadlines unless there really is one, because once a deadline is added it tends to crowd out other items in the agenda view.

At the beginning of the day, I add meetings from my Google Calendar so I can see how those fit in with other work I’ve got scheduled for the day. Sometimes I try to schedule specific tasks for different parts fo the day, that definitely helps me be a bit more organized.

Finally, I try to set an estimate for tasks; I can then use the agenda’s filtering option to find tasks that are e.g. < 30 minutes when I know I have half an hour before a meeting, for example. Though I don’t make heavy use of that feature.

I have in the past tried solutions that would sync directly from e.g. Gerrit/GitLab/Phabricator to my file but have given up on automated solutions; I’d rather pick and choose what I put into the TODO file, that also lets me be more specific about what my specific role is on a given task (e.g. do I need to approve the patch, or should I comment on it, or just read it for awareness).

What else?

There’s plenty of rough edges in this workflow, but overall it works and beats (in 2022, for me) various other tools that I’ve tried. YMMV!

  1. Although arguably Emacs is worth the suffering if only for Magit and Org mode. ↩︎

  2. I’ve tried Dropbox in the past, with bad results - lost data, bad merges, etc. ↩︎

  3. 2570 commits since I enabled that! ↩︎