Navigation: The ideal time management application



There are two reasons for tracking time, the first would be to become a better planner, the other is to try and change the way you distribute your time. Accurate statistics on how much time you spend on activities gives you the insight you need to change things for the better. It's what we call, "getting scientific". Are you spending too much time procrastinating? Feel like you aren't getting anywhere in life? Get the numbers and start doing something about it. Monkey can't help you fix your life, but we try to give you the tools needed to take action.

Backed up snippets

As for the actual implementation Monkey draws heavily from two existing task management applications: OmniFocus and Things.

Ethan Schoonover from the OmniGroup explains the concepts behind GTD and the way OmniFocus supports them in the OmniFocus Basics Video (23MB MOV):

  • Actions are the atomic unit in OmniFocus. Very simply an action is something you can physically do in a single step. If it's more than one step, then it's more than one physical action, and if it's more than one physical action... it's a project.

    Besides being a group of actions a project is really a goal you like to accomplish. Now it may be a relatively trivial goal such as "Cleaning up the garage" or a bigger goal like "Writing a novel". It doesn't matter if it's two steps to complete it or a hundred steps, if it's more than one step it is a project.

Use cases

Track time

The default time tracking mode is based on that from GTimeLog. Here's how it works:

  1. Let the application know you're going to start logging facts if you haven't done so already (special keyword: arrived)
  2. From that moment on the application will start a timer
  3. Type the action description in the entry field but don't submit it yet
  4. The application will start searching for actions (auto-complete)
    1. This will also auto-complete any terms associated with the action
  5. You have the option to enter a friendly note you can also add extra terms specific for this fact
  6. Start doing the action
  7. Once you determine you're done with the action bring up the time tracker and hit enter
  8. The application will log the duration (from the end of the last fact to the current time)

Everything will then start again from 2.

Fact entry syntax

  • NOTE: This section is somewhat outdated (the changes to the vision on how to track time mentioned before means this syntax has to be modified)

This is intended to be somewhat of a formal grammar but it's probably not entirely correct.

entry                ::= ( "arrived" | [ ( negative_time | full_time | start_time ) , " " ] , action_description , [ " " , fact_description term , " " , *term ] )

action_description   ::= anything excluding ( and #

fact_description     ::= "(" , anything excluding ) , ")"

term                 ::= "#" , anything excluding # and white space

negative_time        ::= "-" , minutes

full_time            ::= start_time , "-" , end_time

start_time, end_time ::= time

time                 ::= digit , digit , ":" , digit , digit

Some actual real-life examples would be:

Travel through time (Fixing the time machine) #timemachine
-10 Hijack some nuclear weapons (Just met Vladimir) #vladimir #armsdealer #twitchyeye
12:00-13:00 Lunch
10:10 Break
  • TODO:

    • Should "Fixing the time machine" not be a action itself?


We probably should not use the taxonomy stuff to define projects.

Taxonomy for menus

There's also a special menu vocabulary which is used to construct a large part of the left sidebar in the main window. Every direct child of the vocabulary becomes a heading and every leaf becomes a list. If there's a custom icon assigned to the term this will also be displayed.

  • Menu:
    • Collect: Inbox
    • Focus: Today, Next, Scheduled, Someday

Example of a SQL query for widget

This obviously isn't a real query (we don't have the datamodel ready yet) but gives a good indication of how a query would sorta look like:

SELECT, SUM(minutes) FROM facts f 
INNER JOIN facts_tags ft ON f.fact_id = ft.fact_id
INNER JOIN tags t ON ft.tag_id = t.tag_id


Considering the above mentioned the ideal tracking syntax would probably be something like:

Category: Sub-category: Sub-category: Activity (Description) #tag #another-tag #yet-another-tag

Some other features:

# Add an activity with the end time of the previous activity as the start time and an end time of now minus 30 minutes
-30 Category: Activity (Description)

# Add an earlier activity with a specific start and end time.
10:20-10:40 Category: Activity (Description)

By default an activity entered without a category will end up in the Unsorted category:

Activity (Description)

Project Hamster

Cool features

Hamster has a very cool time slider you can use to easily adjust the time you spent on an activity. Note how previously added activities are displayed in a light gray color.

Room for improvement

  • TODO:

    • Explain what's missing from Hamster that really should be there to be able to do proper time management.

Things that possibly could be improved (but may turn out to be silly ideas)

  • When the day switches (clock strikes 12) no activities will be listed under Today (for quite obvious reasons). At the moment I'm leaning towards saying it would be handier if Today was replaced with Recent activities.
  • Hamster only shows the start time under Today and in the overview it shows the start time and the duration. I'd think it makes sense to include the end time too so it's easier to add earlier activities (this duplicates GTimeLog's Chronological view mode). I'm thinking of something like:

    0 h 5 min



  • All Activity items in lists should have a context menu that allows you to select Edit, Delete. So this is both in the Overview and the Panel. You should also be able to edit properties of an activity (description, start time, end time etc. whatever is being shown) using inline mode as well (double click, or enter to start editing).
  • When you're already tracking an activity and bring up the panel then when you press enter in the activity entry field Hamster should stop tracking.

My work on Project Hamster

Submitted bugs


  • Added three GConf keys: show_icon, show_activity_description and show_duration to allow the user to configure what information the applet displays (e.g. just the Hamster logo). Still have to modify the button to be able to display an image or an image and a label, have to figure out how to properly do this (e.g. not hardcoding the path to hamster-applet.svg). Need to do some more testing to because duration isn't the same as it is in GTimeLog, in the case of Hamster a duration is only displayed when tracking where with GTimeLog you're always tracking.

Short ideas

  • An improved dashboard. Hamster currently implements an Overview window which displays several interesting graphs. Several improvements to this window can be made, among others more widgets (for example a generic graph widget that just renders a dataset which is constructed from a SQL query) and the functionality to disable and move individual widgets around. For an example see Piwik's dashboard (Piwik is Open Source Web Analytics Software).

  • Help with time distribution. It would be interesting to have a tool to help you in managing how you distribute your time over activities Life Balance is an application which has implemented some interesting ideas with regards to managing priorities and time distribution. At the very minimum you would just have targets and compare that to the actual time you spend on activities.

  • Communication with other processes. It would be interesting to communicate with other processes over DBus at the very least to be able to detect if there was a context switch or whether the user is slacking (e.g. reading Slashdot).

Extensive ideas






User stories




Experience system


Perhaps it would be interesting to implement some sort of an experience system which basically equates to tracking time, but instead of on categories and activities you'd do it on technologies (programming languages, software). You could use the tag syntax (see above) to add information as to what technologies are being used. E.g.

Hacking: GNOME: Hamster: Programming (Implementing XP system) #python
Sysadmin (Configuring OSSEC) #linux #ossec

So perhaps really tracking time on tags is just another way to report things.

Combined with a rules system you could automatically add tags so you don't have to do it manually. Rules could be written in Python and executed after an activity is entered. Example:

   1 def rule(fact):
   2     if ( == "Programming" and
   3    == "Hamster"):
   4         fact.tags.append(Tag("python"))



User stories




Project plan

  • Study Hamster source code
  • Improve this wiki page
  • Implement new data model (tree for categories)
  • Modify Time Tracker Preferences dialog to support new data model
  • Modify Overview dialog to support new data model
  • Implement parser support for multiple syntaxes
  • Implement support for new syntax (see above)
  • Implement support for multiple tracking modes (e.g. add a GTimeLog mode)
  • Decide what to do next

Projects/ProjectMonkey/Archive/Version 1/Braindump (last edited 2013-12-03 05:07:37 by WilliamJonMcCann)