Personal time tracking system
Timav ("chronology" in Volapük) is a tool for analysing time tracking data collected in Google Calendar. It evolved organically to fit the work I do, and how I do it, and should probably be used as a reference to build your own system.
I've built my first time-tracking system when I finished college and jumped into freelance work. I had two main reasons to build it:
I wasn't sure how much things should cost, and I hoped that over time, by analysing which projects I felt satisfied with, and knowing how much time I've spent on them, I would know how much a day of work is worth. After over four years of doing this, I know that this is not as simple as it seems, but it was a start.
I wasn't sure how much time things can take, and I knew that potential clients would be asking about timelines. I figured that the more projects I make, and the more data I have, the better I can approximate things better. Again, I know it's not that easy, but it was something to start with.
I was also curious how much time I would spend working daily, and how it changes over time.
Since then I've been rebuilding this system yearly, as I've realised how much impact on me it has — "We shape our tools and then our tools shape us.". My ideas about what I want to track keep changing as well.
Timav is actually a fourth version in this process, and I'm pretty sure it's not the last one.
I'll start with some history of previous versions, and then get into more details on how I approach time tracking now.
Because my first time tracking system has been built before I've started tracking time, I have no idea how long it took to build it. The idea was pretty simple though, I wanted to store all the logs in a database, and be able to query and analyse them. The log consisted of starting and ending times, project's name that it belonged to and type — either personal or work, later another type, research was added, but I didn't use it much. I also tracked payments with date, amount and project name. Everything was held together by project name, so my tracking was only concerned about how I work on very specific things.
During the day, I would jot down when I started and finished some task. I've tried to be as honest with myself as possible, so whenever I've started browsing Hacker News or Reddit, I would have noted down that time as end of log. Usually after a day of work I've had something like this:
Project work 10:15-10:45
Project work 11:00-11:30
Project work 12:00-13:15
I would then go to the browser, and input one-by-one all this data:
I've had similar UI for inputing payments, and boring but informative table with info about all my projects:
I've also tried to get simple stats out of the data, but haven't used it much:
This doesn't look terribly exciting, but had worked well for me for over two years. There was one big problem in how this system was built, mainly this table of projects. At some point I changed it to be sorted by how much I made per hour, so all my personal projects, which earn me nothing, would be at the bottom of the list.
After two years of using it, I stopped working on any of my own things, and for a while couldn't figure out why. I got a bit depressed, and I couldn't force myself to do anything other than work. It turns out that working on personal projects is very important for me, and seems to be connected to the quality of my life.
The "eureka" moment came after watching Devine Lu Linvega's talk Frameworks for Mystics, and hearing how he uses his time tracking to split time between working with audio, visuals and programming. It was one of strangest mixes of emotions I had, understanding that the tool I made for myself, that should help me, ended up impacting my life in such a big and unpredicted way.
My solution to this problem was simple — to build a new tool, one that would show me things from different perspective.
Unfortunately, timeline on this is very messy, second version of this tool was developed somewhere during second year of using the first version. I planned on re-writing it in React (old version was in Backbone), playing with how data is displayed and adding more charts. I was also thinking of some kind of external API so I could add logs from command line. I only spent around 20 hours on this, and it died together with few other projects during that no-personal-projects time.
So, back to the main story.
Third attempt started just after understanding what the old version was doing to me. Distinction between personal projects and work was an important thing to tackle, I also wanted to have more open-ended system, allowing me to track more things, and adapt to what I'm doing at the moment.
The friction of noting down and inputing events into web-based UI was also getting in my way, so I decided to use calendar for logging — idea stolen from Marcin Ignac:
The system for describing logs looks like this:
[Project] @tag1 @tag2(subtag)
Projectis optional, and allows me to group logs for given project, it's usually a client project I work on, or well-defined personal project
@tagis additional metadata that I can use to analyse the logs, I can add how many tags I want to a given event, but it's usually just a few; at the moment most often used ones are:
@language()(I track what programming languages I use)
@tag(subtag)is a shorthand for having more data about a given tag, but allows me to still nest them under one bigger thing, this might be overly complex, but works for me — I use
@health(gym)for when I'm training and
In Timav I also added full-day logs that describe events. Event can be a big milestone or deadline (I'm adding event notes to describe what it was about) or a payment (I use special tag
@cash(1000) would mean I earned 1000PLN on a given day).
Third version was also a big technology change, I used Clojure and Clojurescript together with Neo4j, just because I wanted to learn them. It took around 80 hours to build, and was used for over a year. The biggest problem was performance — it was my first big thing built with Clojurescript, and I didn't pay much attention to how well it worked. Turns out that if I have to wait for a minute for the app to load, I'm not going to use it that much.
But it a had few interesting ideas, first of all I had a chart that would show me how I've spent my time between most important tags for me at the moment (here
I've also built this chain view which showed me each day of the year, with red representing
@work and blue
You can clearly see the 2015 when I wasn't doing any personal projects, and how building third version at beginning of 2016 pushed me to work for at least few minutes on some personal project every day.
The idea has worked — by changing the tool, I changed what I do.
The performance was still a problem, and since I started doing one-project-a-month this year I wanted to finally improve, and open source it. That's how Timav was born.
Timav is built around ideas that have been collected for last four years, it's still work in progress, and I plan on getting back to it later this year. For now it provides two views:
- Projects — with info about logs connected to the projects, featuring a simple chart of time spent, and cash calculations if there are any
- Chains — which allows me to track last couple of days with given tag, this lets me build up momentum and create new habits
All logs still come from Google Calendar, so on the first run you'll have to authorise application access in Settings, and choose calendar where tracking data is stored.
Timav took 29 hours to build, but is far from complete. I'm not sure about the Chains UI, I would love more detailed info about the tags in Projects view, and I've been thinking of explorable Gantt Chart for all the projects, so I can see when I'm overworked. I'm also missing the big-picture view from version three, where I could see the progress since the beginning.
If you want to hack on Timav, it's open sourced and available on my Github: szymonkaliski/Timav, but honestly, it's probably better if you build your own, I wouldn't want my ideas to limit yours.