Task List Tracker for the Mac (DIY Version)

As a Mac user, how do you keep track of the tasks you need to complete? I find myself swamped in things that need doing and every day more things get added to my list. The problem is, in the past I’ve relied too much on my memory to keep track of what I need to do, and I’m sadly aware that there are more things on my task list than I can keep track of, and all too frequently I get into work and think “What was I going to do this morning? I’m sure there was something high priority, but…”

It should be easy, you’d think, to maintain a list of tasks, assign some kind of priority, and have that list readily accessible while using my computer. I suspect there’s an app (indeed, that there are many apps) for that, but while I have tried a few, somehow I’ve not managed to integrate them into my daily workflow. I spoke to a colleague about this, and he said that he keeps a text file on his Desktop listing all his open tasks, and he updates it as needed. If it works for him, maybe it would work for me too, but in my usual fashion, I decided that listing things in a text file just wasn’t enough for me.

Task List Requirements Gathering

For my simple ToDo list, I’d like:

  • A file I can get to quickly and easily any time I need it
  • Some way to prioritize tasks so that the most important tasks show at the top
  • A way to mark a task as completed
  • An archive of completed tasks, ideally showing roughly when the task was taken off the list

Simple Solution

I created two files. The first, TODO.txt sits on my Desktop so it’s easy to find if I want it. The second, todone.txt (get it?) is the archive, and sits within my Documents folder. The rest is managed by some very simple scripts and shortcuts.

Opening TODO.txt

I’d like to be able to open the TODO list file anywhere, any time. I accomplish this using the world’s least complicated Automator script. I created a new file in Automator and chose to create a Service:

Automator Service Type

I then added a Run Shell Script command which opened TODO.txt list using the BBEdit text editor:

Automator: Open TODO list

The Service on its own does nothing, so within the Keyboard System Preferences I created a shortcut to launch it:

MacOS Keyboard System Preferences

So now, every time I hit (mash-some-keys-together)+T, my TODO list opens. If it’s already open in BBEdit, the existing file is brought to the front within BBEdit. Whatever I’m doing, my TODO list is now a keyboard-smash away.

Archiving Completed Tasks

In the screenshot of the Keyboard preferences above, my Clean-TODO-List service was also shown, mapped to (mash-keys)-U. This service is slightly more complex, but not much:

Automator: Clean TODO List

Note first that the service receives no input in BBEdit. What this means is that the service will only run if it is triggered from within BBEdit, and it needs nothing sent to it. The first step (AppleScript) checks if the active document in BBEdit is the TODO.txt file, and if so it saves it. In other words, I have to be in the TODO list in order for the archive process to trigger with the key combination.

Once saved, a shell script is run to update the files. The shell script looks like this:


# Set up variables

# Copy the todo list to a backup file in case I hose everything

# Add a 'dateline' to the archive file, effectively time-stamping the operation

# Grab any lines beginning with x and put them in the archive
egrep -i "^x" $TODO >> $ARCHIVE

# Copy all lines except those beginning with x and put them in a temp file
grep -v -i "^x" $TODO > $TODO.tmp

# Remove blank lines and put what's left in a temp file
grep -v -i "^\s*$" $TODO.tmp > $TODO.tmp2

# Sort the second temp file and overwrite the firsgt one with the result
sort -n $TODO.tmp2 > $TODO.tmp

# Move the temp file so it's now the active TODO.txt file
mv $TODO.tmp $TODO

# Clear out the remaining temp file
rm -f $TODO.tmp2

There are some unnecessary temp files in there but I did find that doing it this way avoided some odd timing issues that sometimes causes the process to fail. BBEdit is smart enough that when the TODO.txt file is changed, it automatically refreshes it, so the changes can be seen immediately in the task list.

How Does The List Work?

The list itself is really simple:

  • each task is written on a single line.
  • the first character of each line indicates its priority, or notes its completion.
  • tasks are ordered based on the ASCII sort order of the first character

For example:

! Send email to Bill asking to expedite delivery on hardware for project X
+ Slightly less urgent task
- Some other regular task
go Some task in a program I'm writing
x A task (of any type/priority) that I have completed
- Another boring old thing to do
! Urgent switchport change for project Y

Marking a task as complete just involves changing the first letter to x. Then when I press (mash-keys)-U, the file is saved and this line:

x A task (of any type/priority) that I have completed

…is moved to the archive file with a datestamp line, and the remaining open tasks are sorted into priority order:

! Send email to Bill asking to expedite delivery on hardware for project X
! Urgent switchport change for project Y
+ Slightly less urgent task
- Another boring old thing to do
- Some other regular task
go Some task in a program I'm writing

It’s harder to describe how to use this than it actually is to use.


The return on time investment (ROTI, an acronym I just made up and now I’m hungry) is pretty good here, as the level of coding required was minimal.

It works; I use it daily and while it’s not very clever–no reminders, no due dates, no flashing colors–it actually functions well as a dynamic task list. Having key combinations makes it very fast to open and update, and I can do so without having to find an app and open it. Because the list is re-sorted every time it’s updated, new items can be added anywhere in the list and priorities can be changed any time, and running an update will straighten everything out again.

It’s searchable! Every task I list will be indexed by Spotlight which means that I can find old tasks by searching. Because completed tasks are archived rather than deleted I can easily look back at a previous task and know from the datestamp roughly when I completed it.

So often, app-based solutions to simple problems can end up being so complex that I stop wanting to use them. I’m about a month in on this, and so far I’m using it to track tasks quite successfully. I hope that perhaps one of my readers will also benefit from this stupidly simple solution.

Be the first to comment

Leave a Reply

Your email address will not be published.


This site uses Akismet to reduce spam. Learn how your comment data is processed.