The Hit List 0.9.3 is out. A lot of work went into this release but the two main user visible changes are repeating tasks and AppleScript support. Of those two features, repeating tasks took a surprisingly long time to implement. The code itself wasn't too hard to write, but as usual, settling on a design was the hardest and the most hair-pulling part of the job.
The Cultured Code guys behind the excellent application Things have also written about this particular problem so I thought I'd add to the discussion and explain my design decisions on what ended up being a completely different implementation.
I started the design process by mocking up some UI to satisfy all the different ways of setting up repeating tasks.
Specifically, I wanted the application to be sophisticated enough to accommodate the following cases:
- Repeat every n days
- Repeat every n weeks, optionally on specific days of the week
- Repeat every n months, optionally on specific days of the month or on specific days of the nth week
- Repeat every n years, optionally on days of the month or days of the week on specific months
- Whenever possible, allow repeating after completing the task.
I spent quite a bit of time creating mockups. While they technically satisfied the requirements, none of them struck me as being elegant or easy to use. For one thing the designs always required the user to translate a simple thought into many small interface manipulations. Sure, this is true with any user interface, but it seemed especially true for this problem. From the very beginning, a goal for The Hit List has been to create an application that is as frictionless as possible. I wanted the application to make the most out of each user interaction.
Not being satisfied, and after throwing away all of my mockups and even code, I went back to the drawing board. I'm glad I did because here is the end result:
There is no myriad of buttons and fields to choose from. All the user has to do is directly type in what he wants.
After you type in a recurrence rule, the window resizes to reveal additional options relevant to the new rule.
For this to work without driving the user mad, the natural language parser has to be near perfect. The last thing I want is for this to come out smelling like AppleScript.
Take a look at what the application can understand.
Every day Every single day Daily Every 2 days Every two days 2d Every week on Mondays Every Monday Every mon Every other Monday On Mondays every other week Every third Saturday Every three weeks on Saturdays Every week on Monday and Tuesday Every mon & tue Mondays or Tuesdays Every Monday through Thursday Every Monday to Thursday mon to thu Every 2w on wed, thu, and fri Every other month 2m Every month on the 1st On each first of the month Monthly on the first Every month on the 1st of the month Every month on the 5th and the 20th day On the 5th and 20th of the month Every month on the 1st through the 6th Monthly on the first through the sixth On the 1st through the 6th of every month On every second Monday of the month Monthly on every 2nd Monday Every month on second Mondays Every year on January first On January 1st of every year Every last sun of October through April Every oct through apr on the last Sunday
Even with all this I missed the rules "on the last day of the month" and "on the last nth day of the month". A future update will remedy this shortcoming.
If you find any other text that isn't parsed correctly, please let me know.
This design isn't perfect as it has two glaring problems. One is that the user has no easy way of discovering how complex the recurrence rules can be. This isn't such a huge problem, but a way to solve this is to include a help button to show example rules or to include an accompanying iCal style UI to let the user setup the recurrence rule in a more typical fashion. I didn't include these in the initial implementation though because I wanted to see how users would react to this kind of UI.
Another problem is localization. Even if I write parsers for a few more popular languages, it won't accommodate the rest of the users in the world. Again, the solution is an accompanying traditional UI, but for now, I'm leaving it the way it is until I get some feedback.
The Hit List has been my playground for trying out different ideas. This repeating task UI is just another example of me having fun even at the cost of disregarding some users.
My hope is that the net result will be more happier users even when I don't satisfy everyone.
UPDATE: If you'd like see how this works out in real life, you can download the public preview of The Hit List. You'll need Mac OS X 10.5, Leopard.