A Daily Journal in Org Mode

writing code emacs .....

Next: Common Lisp How-Tos
Prev: Implementing Scheme in Python

In a comment on yesterday's Hacker News thread about journaling, I sketched out my daily journaling practice of late. This post contains the full details on this procedure for those who are interested in using Org Mode for daily journaling.

The Basics

Every day gets its own Org Mode file. What goes in is not specified, but things I've included so far include:

  • To do lists
  • Things I probably won't do but would like to
  • Previous night's dreams
  • Free-form journaling
  • Notes on projects in progress
  • Small snippets of beautiful code I've written or seen that day
  • Summary of the day's events
  • Quotes or poems

The main thing is to write something every day and keep some kind of record about what's happening in my life.

So far I've kept each day to a single page. At the end of the day, this page gets exported as a two-column PDF (via Org's LaTeX export), printed out and kept in a binder on my desk. I review the binder occasionally to get a feel for how the days have been going.

If I continue on this path for a few more months, I'll have a hundred or so entries; after a year, of course, hundreds. At that point I'll probably concatentate the PDFs into a single PDF and turn it into a bound book, perhaps via Lulu.


Org Mode

For programming and writing, I use a 40+ year old text editor called Emacs, which is matchless in its programmability. If you're a programmer (or want to be one) and you want complete control over your editing experience, Emacs might be for you. Org Mode is a set of functionality that has been added to Emacs which allows for easy outlining, table creation and editing, export into a variety of formats (e.g. HTML and PDF), and a variety of other features for making pretty documents that are also readable as plain text. If you're familiar with the Markdown text format, Org Mode is like Markdown, but on steroids. (Every post on this site is generated from an Org Mode file.)

Org Mode files can have header information at the top of the file to define how the file looks when it's exported. Since I'm picky about how the printout looks, I've tweaked this to my liking as follows:

#+TITLE: [...today's date...]
#+OPTIONS: toc:nil num:nil author:nil date:nil
#+STARTUP: align
#+HTML_HEAD: <link rel="stylesheet" type="text/css href="styles.css" />
#+LaTeX_CLASS: article
#+LaTeX_CLASS_OPTIONS: [9pt,twocolumn,portrait]
#+LATEX_HEADER: \usepackage[margin=0.5in]{geometry}
#+LATEX_HEADER: \usepackage{enumitem}

styles.css is a style sheet I have which overrides the default styles for Org Mode-generated HTML, in case I want to view the file in a Web browser, which runs faster than the LaTeX/PDF export. The LaTeX-related items specify the multi-column layout, along with smaller text and narrower margins than the default.

Automating It

At first, I created and edited the files manually, copying and pasting the above snippet into a new file each morning, and setting the title in the header using org-time-stamp-inactive (C-c !). Eventually I automated all that using the following Emacs Lisp (added to $HOME/.emacs.d/init.el):

(defun open-journal-file ()
  (let* ((today (format-time-string "%Y-%m-%d"))
         (path (concat (getenv "HOME") "/path/to/my/journal/" today ".org"))
         (hdr-list (list (concat "#+TITLE: [" today "]")
                         "#+OPTIONS: toc:nil num:nil author:nil date:nil"
                         "#+STARTUP: align"
                         "#+HTML_HEAD: <link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\" />"
                         "#+LaTeX_CLASS: article"
                         "#+LaTeX_CLASS_OPTIONS: [9pt,twocolumn,portrait]"
                         "#+LATEX_HEADER: \\usepackage[margin=0.5in]{geometry}"
                         "#+LATEX_HEADER: \\usepackage{enumitem}"))
         (hdr (apply 'concat
                     (mapcar (lambda (s) (concat s "\n"))
         (has-hdr (lambda ()
                      (goto-char (point-min))
                      (search-forward "#+TITLE" nil t)))))
    (message (concat "opening " path " ..."))
    (find-file path)
    (unless (funcall has-hdr)
        (goto-char (point-min))
        (insert hdr)))
    (message "Enjoy your journaling!")))

Then, to bind it to the key combination Control-o 1:

(global-set-key "\C-o1"
                (lambda ()

Now that this is set up, with just a keystroke or two I have the day's journal entry formatted exactly the way I want (because of the HTML_HEAD and LATEX_* options). If the file was already created, the shortcut puts me back in the file to make updates.

To Do Lists

The way I organize my tasks for the day ("organize" is too heavyweight a word - it's a very light touch) goes something like this:

| pt exercises          |
| coffee                |
| work on =smallscheme= |
| breakfast             | <-- stuff I did
|                       |
| train to work         | <-- stuff I'm doing now
| work on blog post     |
|                       |
| demo prep             | <-- stuff I think I'll do
| pairing               |
| meeting about xyz     |
| demo/standup/retro    |
| bike home             |
| dinner                |
| dishes                |
| meditate              |
| bed                   |

The Org Mode table editing shortcuts let me reorder, add or eliminate items quickly. Anything I don't get to by the end of the day either gets a strikethrough so I can remember that I didn't get to it, or just removed. The point of the todo table is not simply to make sure I do certain things, but to record the trajectory of the day.

Why This Approach?

For many years I've been keeping to-do lists and writing journals using various strategies, including:

  • the Things app on laptop and phone;
  • a single, massive Org Mode file; and
  • a pen and a bound paper journal.

I love the physicality of a paper journal, but I find handwritten journals harder to read than a typed manuscript. (The handwritten journals also have a way of turning into sketchbooks.) The printed journal gives me a bit more physicality and much better readability.

I like many things about Org Mode, but find the TODO states too ugly and heavyweight for a day's tasks. Generally, if I can't finish something in a single day, I don't want to be pestered about it (and I know what I care about longer-term). I really do need to be reminded of it I'll set a reminder in my calendar or my phone. (Most of the things I have to worry about at my day job are in our JIRA ticketing system or explicitly on my calendar.) Finally, something about the single, massive Org file gets to be a little oppressive. A separate file for every day has a certain cleanness to it.

I've enjoyed going back and rereading the entries. Whereas meditation builds awareness of the present moment, journaling and reading the journals gives a sense of the wider arc of time, inviting contemplation about how I'm spending my days, and shedding light on themes and feelings that persist over time.

The other comments in the Hacker News thread are worth a read if you're into this sort of thing.