This is a post about my most successful attempt at consistent personal journaling to date. And it’s about caplog, the little can-do utility I wrote to make it easier to journal brief thoughts and longer entries.

There exists a certain class of activities. For activities in this class, people often confuse liking doing the activity with liking the idea of doing the activity. Some of the most well known members of that class are include writing, learning/playing music, and exercise. A lot of people feel like they like writing, but they mostly like the idea of writing. They like to imagine writing.

For a long time I thought that my ideas about journaling were confused in that way. I liked the idea of journaling, but after I tried and failed to develop a frequent journaling habit, I started wondering whether I liked journaling itself.

My top two failed attempts at journaling were:

  • Pen and paper: A nice notebook and a nice pen1.
  • Apps: Momento and Day One.

Pen and paper


  • Handwriting. I am a pen nerd and I love writing on paper. There is a quality to pen and paper writing that can’t be matched by any text editor, not because text editors can’t be great, they’re just not the same kind of thing.
  • Security. No risk of accounts and cloud storage being hacked. Personal and private thoughts are more secure on paper than in any ““cloud””.
  • Durability. This is counter to intuition: a paper journal is vulnerable to water, fire, and other kinds of fatal damage. But software is still a bigger gamble. The expected lifetime of a paper journal is longer than any specific app (although maybe shorter than a more open and portable solution like a bunch of text files).


  • Search. Optical character recognition wasn’t as good back when I was trying pen and paper journaling as it is today, but even the best end-user OCR software today probably couldn’t read quick or suboptimal handwriting. Even if it could, that means I would have to OCR every page of my journal, an additional task requiring time and effort, and the more effort journaling needs, the less likely you’re doing to do it.
  • Availability. You have to carry the journal with you at all times. If you don’t have the journal, you can’t write your thoughts down. Typing them on your phone to transcribe later is a nice thought but won’t happen. And some thoughts need to be written down quickly, otherwise you lose the moment.

The last con was a fatal one. My pen and paper journaling lasted a long time, but happened very infrequently. My entries were very long and I never went back to read any of them.



  • Availability. Apps are on your phone, and you always have that with you.
  • Rich content. Most apps support more than plain text entries. During my Momento and Day One phases, I made a lot of photo entries, which was nice. Some memories are much better described by a photo than any number of words.


  • Durability and Portability. Apps don’t live very long. Personal journaling is supposed to be a long-term habit, and the mortality rate of mobile apps is too high for the reliability needs of this activity. I could be willing to pay $$ or even $$$, but if the developer doesn’t get enough people who are just as willing, there’s nothing I can do about it. Momento offered an export function that dumped your journal entries and photos into an archive, but then what? I have that archive now, but I don’t think I ever found a way to get it into Day One.
  • Security. If the app requires you to sync your entries to their cloud, well then… sigh.

I think I moved off of Momento when the app was buggy on a new iOS version and the developer(s) were late to update it. I say I think because I’m not sure if I’m remembering that correctly.2 When Day One’s developers released Day One 2 and made their sync service the only option for syncing, I quit the app.3


I got the idea for caplog from t, the task manager I’ve been using for years. t is a simple Python script that stores tasks in a plain text file. I added a couple of features in my fork, like the -t switch for tagging tasks with @today and parsing of @{date} syntax to tag the task with @today when the date matches the current day. But it works for me because 1) I can use it from the terminal, my natural habitat, and 2) storing tasks in a plain text file means I can add tasks to the file even if I don’t have access to my terminal.

caplog started as a simple exercise in learning how to store stuff in a SQLite database with Python. First I got it to work doing only the simplest task: put an entry with a timestamp into the table, then slowly added features.

Here’s where it is today:

$ caplog
No log file found. Creating file...
New log file created at /Users/sherif/caplog.db

$ caplog I\'m finally writing my personal journaling post. It only took me 4 months.
$ caplog
│ time             │ entry                                                    │
│ 2018-02-28 00:03 │ I'm finally writing my personal journaling post. It only │
│                  │ took me 4 months.                                        │
$ caplog -p 3 days ago
Logging an entry dated: February 25 2018 00:11
# in vim
Today I will at least start the draft of the personal journaling post.
# save and exit
$ caplog
│ time             │ entry                                                    │
│ 2018-02-25 00:11 │ Today I will at least start the draft of the personal    │
│                  │ journaling post.                                         │
│ 2018-02-28 00:03 │ I'm finally writing my personal journaling post. It only │
│                  │ took me 4 months.                                        │

caplog has a --random flag to show me a random entry from my journal. This is important because there is little point in writing personal notes if I’m never going to read them in the future. I run caplog -r more often than you’d think.

The --past flag in the demo above is how I write most of my entries. Sometimes when I’m thinking about my day I remember something that I want to write about, and I try to enter it with the closest timestamp to when I think it actually happened. Using neovim for text entry was something I only added recently, and it’s amazing!

Another favorite and recent feature: caplog has a --batch flag. You can pass caplog --batch a path and it will look in that folder for text files that have a date and time in the first line, and add the rest of the file as an entry for that date and time. The --batch flag is how I use the Drafts app to add caplog entries from my phone.

I write an entry,

run a “New caplog entry” action

which is defined like this:

And on my home computer I have a scheduled task that runs caplog --batch ~/Dropbox/caplog_inbox and adds all the entries there to my journal. It all seems like a big hack, but it works and it makes me smile and that’s all that matters!

Final notes

I am very happy with this setup! This is surprising to me because I had given up on finding a journaling solution that would work well enough on the long term.

Tools like t and caplog working so well for me demonstrate that I am picky and sometimes have preferences that can only be met if I write my own software. I’m fine with that. It’s why I love computers so much.

  1. I do love me a good pen↩︎

  2. I should have journaled that. ↩︎

  3. To this day I can’t think of a full good faith argument for why they wouldn’t let you use Dropbox instead. ↩︎