We are happy to announce the release of Timing 2020.1!

This version includes the following new features:

  • Added support for re-applying rules to past activities. You can either re-apply
    all rules via the “Edit” menu or only a specific project’s rules by right-clicking that project in
    the project list. Note that rules will only be re-applied to all visible activities, so make sure
    to select the desired date range first. And if you would like to re-apply rules only for activities that
    have not been assigned a project yet, select “Unassigned” rather than “All Activities” before re-applying the rules.
  • Timing now shows an indicator for the current time on the timeline.
  • You can now view time spent per app and per unit of time (e.g. per hour/day/week/month) on the Overview screen’s large bar chart.
  • Added support for tracking the current URL and incognito mode for Microsoft Edge.
  • Wish you could re-use a previous task’s notes when using the “Task suggestions” auto-complete pop-up? You now can! Simply keep ⌥/Alt pressed while accepting the desired suggestion.

The update also includes a few quality of life improvements as well as a bunch of performance optimizations. You can read about those in the full release notes for Timing 2020.1.

The “re-applying rules” feature turned out to be more complicated than expected. If you are interested in the “origin story” of that feature and how we develop new features here at Timing, read on!

Update Availability

Since Timing 2.0, all purchases of Timing come with exactly 12 months of free updates, so if you purchased Timing on or after February 1st, 2019, Timing 2020.1 is a free update. Otherwise, you can purchase an extension to your update period by clicking “Extend Update Period…” in the “Timing” menu.

Anatomy of a Feature: Re-Applying Rules to Past Activities

What Is It About?

Project rules are a powerful feature that lets Timing automatically categorize your activities, saving you from having to perform this tedious task manually. If you would like to know more about how the rules system works, and how to make the most out of it for your use case, have a look at our extensive rules documentation.

But unfortunately, a rule can only apply to activities that Timing records after you have created the rule!

So, if you are reviewing yesterday’s data and notice that a couple of activities should always be assigned to the same project, you can create a rule. But then you notice that the same kind of activities have already been recorded last week and last month. Now, having to repeat that same assignment again for all your past activities would be no fun! That’s where our new feature comes in: it re-applies all your project rules to a set of existing activities, saving you the work of assigning all these activities yourself.

Here’s a video of the new feature in action:

How Was It Built?

As you can imagine, this feature has been requested on a regular basis for a while now. And it sounds easy enough to implement: just take the existing code for applying rules, run it on all past activities, done. So what took so long?

Well, not so fast! Before we even get started, there are a couple of fundamental questions we need to answer:

  • How should we surface the feature? Just stuffing a button somewhere would clutter up the UI.
  • What activities does it apply to? All activities ever recorded, or just the ones in the current date range, or just the visible ones? What would make the most sense and cause the least amount of confusion?
  • What if I have changed just one project and only want to re-apply that project’s rules? Also, when applying that one project’s rules, what should we do if there is another project whose rules would match the same activity?
  • What if there is no rule that matches a particular activity? Should we remove that activity’s current project assignment?

This is already turning out to be more complex than expected! Here are some of the conclusions we came to:

  • The feature will be available both from the “Edit” menu for re-applying all project rules, and from a project’s context menu for just that project’s rules.
  • The rules will only be re-applied to all visible activities. If you to re-apply want them to more activities, simply discard your current filter and/or select a larger date range.
  • Initially, we had also thought of giving you the option to re-apply your rules only to the activities you have selected right now. However, you could just as well drag the selected activities to the desired project then, which defeats the “automatic categorization” purpose of this feature. So we dropped that option.
  • When you apply a single project’s rules, Timing will still evaluate all project rules. But it only changes the activity’s project if there is no rule with a higher priority that also matches the same activity. This protects your existing assignments, preventing you from messing things up in unexpected ways. For example, re-applying the fairly generic “Web Browsing” rule won’t eliminate all your more specific assignments for individual websites.
  • In a similar fashion, this feature will simply skip activities that do not match any rule. That way, we won’t accidentally reset any project assignments you have made manually.

With these questions answered, we went to work. And eventually, we did end up with a feature that works reliably, is well-tested, and can be accessed from the user interface. And in case you are not satisfied with the new assignments, you can of course always revert them with Timing’s Undo feature!

But then we tried to re-apply all rules for a year’s worth of activities…

…which took more than 100 seconds! Ouch! Turns out our work was far from done…

This took us down the rabbit hole of optimizing how long it takes to apply rules. After a bunch of clever optimizations, we were able to speed this up by a factor of ~15. And luckily, many of these optimizations also apply to filters, so Timing Expert’s filter list should now load much faster, too.

That still left us with a process that could take several seconds to complete. At that point, we need to provide some indication of progress. So we went ahead and added a screen that reports progress and provides an option to cancel:

But how would you actually know what has changed? To illustrate that, we added a second screen, displaying the final results:

And then we had to find a way to animate replacing the progress bar with the results screen. This is the final result:

As you can see, there is more than meets the eye! In Basecamp’s “Shape Up” parlance, such a feature would be called an Iceberg. This feature is a nice example for a feature that appears simple on first glance can turn out to be surprisingly complex!