arbtt, the Automatic Rule-Based Time Tracker
© 2009 Joachim Breitner <mail@joachim-breitner.de>
The Automatic Rule-Based Time Tracker is a desktop daemon that runs in the
background and, every minute, records what windows are open on your
desktop, what their titles are, which one is active. The accompanied
statistics program lets you derive information from this log file, i.e.
what how much of your time have you been spending with e-Mail, or what
projects are your largest time wasters. The mapping from the raw window
titles to sensible „tags“ is done by a configuration file with an powerful
syntax.
Installation
============
You can build and install this program as any other Cabalized program:
$ runhaskell Setup.hs configure
$ runhaskell Setup.hs build
$ runhaskell Setup.hs install
You also need to make sure that arbtt-capture is started with your X
session. If you use GNOME or KDE, you can copy the file
"arbtt-capture.desktop" to ~/.config/autostart/. You might need to put the
full path to arbtt-capture in the Exec line there, if you did not do a
system wide installation.
If you want to record samples at a different rate than one per minute, you
will have to pass the "--sample-rate" parameter to arbtt-capture.
Configuration
=============
Once arbtt-capture is running, it will start recording, without further
configuration. The configuration is only needed to do an analysis of the
recorded data. Thus, if you improve your categorization later, it will
apply even to previous data samples!
The configuration file needs to be placed in ~/.arbtt/categorize.cfg. An
example file is included, which should be more enlighting than this rather
formal description.
Whitespace is non-significant and Haskell-style comments are allowed.
Here is grammar of the file:
Rules := [ "aliases" AliasSpec ] Rule ( ("," Rule)* | (";" Rule)* )
Rule := "{" Rules "}" | Cond "==>" Rule | "if" Cond "then" Rule "else" Rule
| "tag" Tag
Cond := "(" Cond ")" | "!" Cond | Cond "&&" Cond | Cond "||" Cond
| "$" SVar "==" String | "$" SVar "/=" String
| "$" SVar "=~" "/" Regex "/" |
| "$" NVar NOp Number
| "$" TVar NOp TSpec
| "$" BVar
| "current window" Cond
| "any window" Cond
NOp := "<=" | "<" | "==" | ">" | ">="
SVar := "title" | "program"
NVar := "idle"
BVar := "active"
TVar := "time" | "sampleage"
The variables $title, $program, $active refer to the "window in scope". At
first, no window is in scope. Only when evaluating the condition passed to
"current window" or "any window", this changes.
For "current window", the currently active window is in scopre. If there is
no such window, the condition is false.
For "any window", the condition is applied to each window, and if any
window matches the condition, the result is true. If it matches more than
one window, of which match the variables $1,.. (see below) will be taken.
Tags are not enclosed in quotation marks, and contain only letters, dashes
or underscores (e.g. work).
They may be prepended with a category,
separated by a colon (e.g. Project:arbtt). This category can later be used
for pie chart like statistics. For each category, no more than one tags can
be matched per sample. If multiple tags with the same category are
generated by the rules, only the first one will be taken.
A tag can also interpolate variables, including in the category part.
Available variables are:
$1, $2,.. Matches from the last successfully applied regular expression
in the enclosing condition
$current.title
$current.program
The title or the name of the currently active program. If no
program happens to be active, this tag will be ignored.
The variable $time refers to the time-of-day of the sample (i.e. the time
since 0:00 that day), while $sampleage refers to the timespan from when the
sample was created until now, the time of evaluating the statistics. They
can be compared with expressions of the type "hh:mm", for example:
$time >= 8:00 && $time < 12:00 ==> tag time-of-day:morning,
Statistics
==========
Run the statistics program arbtt-stats with the parameter --help to get an
overview of the options.
By default, any sample with the tag "inactive" are excluded from the
statistics, and tags with a percentage lower than one will not be shown.
The tags that affect the selection (-x, -o, --also-inactive) of samples can
be mixed with the report options (-m) and the reports (-i, -t, -c), but
will apply to all reports.
The flag --filter (-f) allows you to sepecify an arbitrary complex
condition using the same syntax for conditions that you can use in the
categorize.cfg file.
Some useful examples:
# Only consider the time when I was programming in Haskell
arbtt-stats -o Editing-Haskell
# Tell me what evolution folders I spend my time in when I actually do
# work with e-Mail
arbtt-stats -o Program:evolution -c Evo-Folder
# Generate statistics about the last hour
arbtt-stats -f '$sampleage < 1:00'
Development
===========
You are very welcome to help the developement of arbtt. You can find the
latest source at the darcs repository at
http://darcs.nomeata.de/arbtt
Some of my plans or ideas include:
* A graphical viewer that allows you to expore the tags in an appealing,
interactive way. Possibly based on the Charts haskell library.
* A better representation of the data in the log, to keep the size and
parsing speed down.
* Looking forward and backwards in time when writing rules. (Information
is already passed to the categorizing function, but not exposed to the
syntax).
* $total_idle time, which is the maximum idle time until it is reset. This
would allow the user to catch the idle times more exactly.
* Rules based on day of time, to create tags for worktime, weekend, late
at night.
* Statistics based on time, to visualize trends.
* Possibly more data sources?
Any help cleaning, documenting or testing the current code is appreciated
as well.