April 25th, 2008

The iCal Sync Interface or How to Implement a New Feature

We have just finished the user interface of our new iCal sync feature (or more precisely, support for Leopard’s system wide to-dos) and would like to share some screenshots. The screenshots are taken from a private development version. But before moving to the screenshots let us give you an idea of what it is like to implement a new feature.

Here is a list of steps we usually take when tackling a major new feature. We …

  1. Evaluate all related feature requests.
  2. Decide what will actually go into the new feature. This is a quite complicated step. We try to look at common usage scenarios. We also try to guess what the majority of users would need. Sometimes we postpone features because their implementation would take too long. An example is providing foldable pocket layouts for printing. We’d love to have it, but it didn’t feel right to make everyone wait longer than necessary before a fundamental feature like printing even shows up.
  3. Try to find a unified point of view if the results of step 2 are too varying or divergent.
  4. Try to think of ways how we could clearly communicate the ideas of 3.
  5. Create Photoshop mock-ups of the user interface.
  6. Start with the actual implementation of the interface and test it. If necessary, go back any number of steps and start all over again.
  7. Create the engine or logic that makes the feature work.
  8. Test-drive a functional implementation of the new feature for the first time. Go back any number of steps if necessary and start all over again.
  9. Extensive bug testing and fixing.
  10. Seed the new version and watch for related emails and forum posts. Fix bugs and make notes for future improvements.

With iCal sync we are now ready to move to step 7.

We had two requirements for iCal sync. On one hand, turning it on should be as simple as turning a switch. On the other hand, we wanted to take advantage of the existence of multiple calendars and make it flexible enough for usage with mobile devices and apps like Anxiety or Apple Mail. This requires that users are able to restrict syncing to different parts of Things like Focus lists, to-dos that have certain tags, Areas of Responsibility, or even projects. Obviously having both simplicity and flexibility seems contradictory. Here is how we are doing it.

When you select iCal in Things’ preferences for the first time you will see the simple variant of the dialog.

icalsyncdialog1.jpg

There you have it: the On/Off switch. Well, it is actually a menu and looks like this:

icalsyncdialog2.jpg

The most common requirement is to be able to export either all active to-dos (Next) or the currently pending items for today (Today), and to be able to import new to-dos created in other applications. When selecting either “Today” or “Next” from the sync menu this is exactly what you get.

icalsyncdialog3.jpg

If you need the full power of the underlying engine then choose “Custom” to transform the simple variant of the dialog into the advanced one:

icalsyncdialog4.jpg

The text fields offer auto completion and only accept valid input. It is possible to drag tags, projects, or areas to these fields.

We believe that the advanced variant of the dialog puts an amount of flexibility at your fingertips that compares rather favorably with the competition. However, there are still more feature requests related to iCal which didn’t make it into this version. But never worry, Things will continue to be improved at full speed well beyond the 1.0 release.

If you would like to comment, instead of sending us email, consider to use the comments section of this article or even better the forums. Your feedback will be much more valuable if your fellow users are able to read it too and respond to it.

Posted by Chris, Jürgen, and Werner

April 2nd, 2008

Things 0.9.1

The biggest new feature of Things 0.9.1 is native printing. Until now we only had Mac OS X’s built-in printing support. But since Things’ to-do lists are optimized for the screen rather than paper, the results were less than desirable.

When choosing Print from the File menu, Things 0.9.1 will construct a dedicated print document which is displayed in an extra window. Before continuing with Mac OS X’s standard print dialog users get a chance to customize the document in the following ways:

  • Decide whether to print the entire list or just selected items.
  • Change the font size. Note that since the print document on the left does not (yet) represent the actual width of the paper, the text may appear to be larger than the actual result on paper.
  • Decide about the visibility of notes. If your list contains long notes that you do not want to print entirely, you can also choose to limit them to 8 lines of text.

Clicking the Print button will then invoke Mac OS X’s standard print dialog. Particularly interesting is the Layout pane. Using the Layout pane you can arrange multiple pages on one sheet of paper.

As an improvement we plan to combine our dialog with some options from the standard print dialog to create what Apple calls the Simplified Print Dialog. The idea is to have one single simple and uncluttered dialog that suffices in most situations.

Things 0.9.1 also contains the following fixes and improvements (from the Release Notes):

  • Repeating items. Fixed a bug that resulted in “after completion” option not working properly.
  • Repeating items. Resuming a previously paused item no longer crashes Things.
  • Quitting Things before closing an edited item no longer results in loosing the most recent changes.
  • The Things library is writen to disk more often now (after each edit).

Posted by Chris

March 18th, 2008

Things 0.9.0.1

The new release contains 12 bug fixes and improvements related to features we introduced in version 0.9.

A notable feature of Things 0.9, that didn’t get enough attention last time, is the new bug reporting dialog. Things 0.9 is very eager when it comes to reporting errors. In fact, a little too much so. Every little error message was promoted to a crash. This is great for developers because we get a lot of error reports and have the chance to improve the reliability of Things quickly. On the other hand, some users who never saw Things crash now did so for the first time.

We remedied the situation in the following way. Things will still offer to send an error report even when uncritical errors are encountered. But the error report dialog no longer forces the user to quit the application.

We want to apologize for the inconvenience and thank everyone who sent error reports.

Posted by Jürgen

March 15th, 2008

Things 0.9

The most substantial improvement in version 0.9 is, of course, recurring to-dos and projects. See below for an entire post describing this new feature.

Here is a list of some of the other improvements:

Choose Things Library

This is clearly an advanced feature that should be used with care. When holding down the option/alt key while opening Things, a dialog will be displayed that lets you either create a new Things library or choose an existing one. This feature is practically identical to a similar one in iTunes.

You can now store your library in a place that might be more convenient for your backup routine. Choosing a web-based location is not possible.

This feature is probably most interesting for people who would like to carry their Things library with them. Plug in a portable or USB flash drive and move your Things library from its default location Home/Library/Application Support/Cultured Code/ to that drive. Move the entire Things folder and don’t forget to quit Things first! The next time you open Things, it will ask you for the new location.

Better error handling

Things will now catch more unexpected errors and also offers a convenient way to send reports via email. Due to some limitations in Tiger this feature works best on Leopard.

Duplicate

There is a new Duplicate menu command in the Edit menu.

Scheduled

The Postponed list is now called “Scheduled”. There are a couple of improvements here. Since the Scheduled list will be the home of our recurring item templates, “Postponed” no longer seemed appropriate. But more about this in the post below. Scheduled now uses relative dates and groups items under headings like “Next week”, “April”, etc.

Move to Today

When an item is postponed, there is an option to automatically move it to the Today list on the specified date.

There are also many bug fixes, some of them quite substantial. More details can be found in the Release Notes.

Posted by Jürgen

March 15th, 2008

Recurring Tasks XXL

Early on many users told us how important an implementation of recurring tasks would be for them. Having always (mis)used iCal events for recurring tasks myself, I hadn’t seen the need for a corresponding feature in Things. So much for what difference user requests can make :). And I finally noticed that hacking recurring tasks via iCal events isn’t that great after all. For some weeks now I have been looking forward to manage my recurring activities properly. And now I can.

When implementing recurring tasks one basically has the choice of either doing a primitive version like “every x days/weeks/months” or doing it in a really flexible and powerful way: enter Things 0.9.

Let’s look at an example: mortgage payments. Things allows rules like “Mortgage payment is due on the last day every month. Remind me 3 days in advance.” For the most part of the month you really don’t need to think about the payment. In that respect recurring tasks are no different than other postponed items except that they automatically repeat. It is thus natural to let the Postponed list handle recurrence. And since the term “Postponed” didn’t seem appropriate anymore we renamed it to “Scheduled”. This is how it works:

The Scheduled list

The Scheduled list does not contain the actual to-dos you are eventually going to check off, but it contains templates instead that are used to create those to-dos. This approach has a number of advantages:

example.jpg

  • The Scheduled list gives you a great overview of all your recurring activities. They are nicely organized by interval and provided with descriptive labels. Together with single postponed items, the Scheduled list contains everything you needn’t be concerned with just now, but will be brought to your attention on the specified dates in the future.
  • Since recurring items live in Scheduled, they don’t clutter up the lists you are working from. Instead, on the dates you specified, copies of the relevant templates are made and put into the Today list. Once completed those tasks will be logged getting out of your way until new copies are created.
  • Since the actual to-dos are completely independent from their templates, you can edit them as you wish. For example, let’s assume you want to do monthly reports that always have a certain structure. You can put an outline of that structure into the template’s note section. Every month a copy of the template is made. Consequently, each copy will already contain your outline. Each month you can then fill in different details. All monthly reports will eventually go to the Logbook where they can be review as needed.

Creating new recurring tasks

newrepeating.jpg

You can create a new template in Scheduled by clicking the toolbar button “New Repeating”.

actiongear.jpg

Or you can turn an existing task or project into a repeating one by editing it and using the action gear button at the bottom right of the item.

Recurrence patterns

There are many options for creating recurrence patterns. For example, use “After Completion” for tasks like “tidy up desk” that don’t depend so much on the calendar, but on the last time you’ve completed them. And on Leopard you can even use iCal events as a pattern (think “Birthday calendars”). Projects can be made repeating too (check lists).

Implementing recurring tasks like we did was significantly more complex than we anticipated. But I believe it was worth the wait. If I am not overlooking something here, then we now have the most powerful recurring tasks implementation available. And I hope you like it.

We’ve gone to great length to ensure that most bugs are fixed already. But with a complex feature like this one, it is quite likely we didn’t catch everything. Please keep a close eye on it and make sure it is working as you expect. And when it doesn’t, choose Things > Provide Things Feedback… from Things’ main menu and tell us what happened.

Posted by Jürgen

March 7th, 2008

This is not about the iPhone SDK…

… it is about whether listening to users makes sense. Steve Jobs in a Fortune interview recently said: “So you can’t go out and ask people, you know, what the next big [thing.] There’s a great quote by Henry Ford, right? He said, ‘If I’d have asked my customers what they wanted, they would have told me “A faster horse.” ‘ ”

On the iPhone special event, however, Phil Schiller said something different. “… there are a lot of things, these and others, that enterprise customers have told us… So we have been hard at work listening to them, compiling lists, trying to understand, what do they really want…”

Of course both Jobs and Schiller know that there are times when you listen to users and times you better not. And the interesting thing is, even when developers don’t listen, they might do it for the best of their users. But how is that?

By all means developers need to follow their vision without asking anybody. They need to think out of the box and innovate. How else could they surprise and ultimately delight?

One of the main responsibilities of a developer is to keep guard over the gestalt of a program. It is all too easy to let your application burst into a universe of hardly connected little features. We have all seen it happen. But it is equally easy to ignore your customers’ needs and to embark on a journey where nobody is following you.

It is not about listening or not, it is about what to do with all the things you have learned from listening. And that is integration. The best feature is worth nothing when not integrated properly. When we read a feature request, we don’t think about doing it or not doing it. After all, if software development is not about satisfying users, then what is it? We are thinking about how we could nicely integrate it with the rest of the application without diluting its identity.

So let us worry about the identity and gestalt of Things. Let us surprise you every once in while, but for everything else we are all ears.

And why didn’t we write about the iPhone SDK? Because it is covered quite well elsewhere.

Posted by Jürgen

February 22nd, 2008

Forum’s Ready

It was missing. Users wanted it. And the “Blog” and “Wiki” buttons really needed another companion: today we added a Forums section to our Things pages.

The user forums are based on the open source Phorum software. We took some time to create a suitable template however. Forums around the internet have a tendency to look cluttered, which is why we tried to cut down everything to the essentials. One of the key design features is that, even when only briefly glancing, the user always knows which level of the hierarchy he or she is looking at:

  • the list of all forums,
  • the topic list of a selected forum, or
  • the list of posts of a selected topic.

These three levels have a distinct look and feel without compromising the visual unity of the user forums as a whole. We also carefully made sure that the forums would fit in well with blog and wiki. We even redesigned the comments section of the blog to use the same visual approach as posts do in the forum.

Not every aspect is completely finished. In particular, users will need to create a new account for the forums even if they already have a Wiki account. The software for the Wiki (MediaWiki) and the Forums (Phorum) is completely different and it would have taken us much more time to write unified user management for both. We hope to be able to do it some time down the road. But the level of refinement should be more than sufficient for discussing everything Things.

Now who will be the one to create the first topic?

Posted by Jürgen

February 4th, 2008

Habemus Dialogum - We Have a Dialog

This article is about a single dialog. The dialog with which users will be able to specify the repeat settings of a recurring task.

When you set out to do something new, it is a good idea to have a look at what others in the field have done before. When we began to approach recurring tasks, we looked at iCal’s recurring events. We wanted Things to be as flexible and powerful as iCal. The corresponding interface in iCal also seemed well done. Naturally, we copied it. Here is an example:

blog_repeatingtasks_old.jpg

Not too shabby, is it? It seemed fine in theory. But after implementing and combining it with the underlying logic, it took us only minutes to discover that it didn’t work as expected. Not that anyone was able to tell exactly why. And that’s often the case when developing user interfaces. It just didn’t feel right. But how to improve it? We don’t remember how many mock-ups we passed to each other in the search for a solution. Here is a selection of them, together with the iCal inspired ones:

blog_repeatingtasks_dialogposter.jpg

In hindsight it is much easier to tell why we didn’t like the previous approach:

  • We made users think about whether recurring tasks have a due date even before they had a chance to enter the recurrence pattern.
  • Regardless of the chosen interval (daily, weekly, monthly, yearly), the last option was always “after completion”. Repetition in user interfaces is often a bad sign.
  • We wanted to have the option of generating tasks for iCal events (think birthday calendar). But the user had to select “yearly” first in order to even discover this option.
  • The iCal inspired controls itself weren’t optimal. They took up a lot of space. And we often accidentally selected multiple days when we just wanted to change the current setting.
  • We wanted to add support for start and end dates as well and felt that this would clutter up the dialog even more.

To cut a long story short, we are still friends :), but we fought uncompromisingly, and now each one of us is satisfied with the result:

blog_repeatingtasks_createfinal.jpg

Why we like this one:

  • The user gets to choose “daily”, “weekly”, “monthly”, “yearly”, “after completion”, “for iCal events” first. No more repetition of the “after completion” option. The “iCal events” option is easily discovered.
  • The box below the pop-up collects precisely those controls that depend on the chosen selection. (”Next” and “Ends” don’t apply for the “after completion” and “iCal events” selection and needn’t be shown in those cases.)
  • Simple recurrence rules can be specified using just one line of controls, e.g. “every 1 month on the 1st day”, or “every 1 month on the 2nd Sunday”. If the recurrence rule is more complex, additional lines can be added by clicking the + button. So, the complexity of the dialog scales with the complexity of the recurrence rule!
  • Unlike iCal we don’t have the luxury of a large calendar to show the result of specifying a recurrence rule. Yet, we still found a good place to show upcoming dates: right after “Next”.
  • Some repeating tasks have due dates, some don’t. Just before the user confirms the dialog, he or she is invited to clarify whether the specified dates were actually meant as due dates (e.g., “pay rent on the last day of every month”). In that case, the user might want to also specify how many days before the due date she would like to see the corresponding task in her Today list (for the better part of the month she probably doesn’t want to know about the payment).

blog_repeatingtasks_duefinal.jpg

Note how the dialog slightly changes to reflect that dates are now meant as due dates.

Posted by Chris, Jürgen, and Werner

January 25th, 2008

Don’t follow us on Twitter

It was German web designer extraordinaire Manuela Hoffmann who suggested we might publish status updates on Twitter. And a point she has.

Posting blog entries and following the comments always takes focus away from actually evolving Things itself. Often the question is: shall we continue implementing that user request or shall we rather explain what we are doing? Very simple you might say: do both!

Tweets to the rescue: Writing a line or two shouldn’t be that distracting or time consuming, should it? We decided to give it a try. All credits to Manuela if it works, we take the blame if it doesn’t :)

Oh yes, why shouldn’t you follow us on twitter? Well, why would you want to be frequently updated with boring details about writing code?

twitter.com/culturedcode

Tip: Tweets will be signed, so you can see who wrote them. Chris (ck), Jürgen (js), Oli (om), Werner (wj).

Posted by Jürgen

January 24th, 2008

The best recurring tasks we’ve ever made

22 days since the last blog post — how could that happen? Well, let’s face it, we got a bit carried away with working on Things. That both our coders got sick a week ago certainly didn’t help. Neither did those hard to track bugs in Tiger that required a workaround…

But we promise to be good boys now! Oh, and thanks for all the nice comments! Expect to find more specific replies here soon.

Right now we are working very hard to integrate recurring tasks into Things. And not just any recurring tasks…

Thank you all for your great support.

Posted by Werner