This tutorial assumes you have installed Timewarrior. If not, follow these download and build instructions. This is a lengthy and detailed tutorial. If you wish to learn about Timewarrior in depth, this is the place. If you prefer your information in smaller pieces, use the online docs.
Setup
As a new Timewarrior user, there is no configuration needed. Once you have installed the software, the first time you run it, a data/configuration directory is created for you if necessary, and if you allow this action.
$ timew
Create new database in ~/.timewarrior? (yes/no) yes
There is no active time tracking
$ ▒
You are told that there is no active time tracking, and that’s right, because we’ve done nothing yet.
$ ls -l .timewarrior
data
extensions
timewarrior.cfg
$ ▒
By default a .timewarrior
directory is created in your home directory, and contains a sub-directory for data, and another for extensions.
There is also an empty configuration file created.
Just like Taskwarrior, an empty configuration file means we are using all the default settings.
If you want to use an alternate location, you can either symlink it to ~/.timewarrior
, or use the TIMEWARRIORDB
environment variable to specify any location.
Stopwatch
The most basic tracking can be done by using the stopwatch features. Just like a stopwatch, you start and stop a clock, and you can see the elapsed time. Start the clock when you begin work, and stop it when you are done. First let’s see if the clock is running:
$ timew
There is no active timew tracking.
$ ▒
No it’s not. You can always run timewarrior with no arguments to see if the clock is running, and no data is modified. Let’s start the clock.
$ timew start
Tracking
Started 2016-08-07T20:19:42
Current 42
Total 0:00:00
$ ▒
The clock is now running. In reality there is no clock and all that happened was that the start time was recorded, so don’t be concerned about using system resources, as none are being used. Now when we check, we see a summary of the time recorded so far:
$ timew start
Tracking
Started 2016-08-07T20:19:42
Current 20:34
Total 0:00:52
$ ▒
Once our work is complete, we stop the clock, and look at the summary.
$ timew stop
Recorded
Started 2016-08-07T20:19:42
Current 21:12
Total 0:01:30
$
$ timew summary
Wk Date Day Tags Start End Time Total
--- ---------- --- ---- -------- -------- ------- -------
W31 2016-08-07 Sun 20:19:42 20:21:12 0:01:30 0:01:30
-------
0:01:30
$ ▒
The summary report shows time that was tracked today by default.
There is a continue
command that re-starts the previous tracking, and is useful if you stopped the clock during lunch, or overnight.
$ timew continue
Tracking
Started 2016-08-07T20:22:06
Current 06
Total 0:01:30
$
$ timew stop
Recorded
Started 2016-08-07T20:22:06
Current 18
Total 0:01:42
$
$ timew summary
Wk Date Day Tags Start End Time Total
--- ---------- --- ---- -------- -------- ------- -------
W31 2016-08-07 Sun 20:19:42 20:21:12 0:01:30
20:22:06 20:22:18 0:00:12 0:01:42
-------
0:01:42
$ ▒
See how every time the clock is started, there is a new line in the summary
report?
It is important to note that it is possible, and quite likely, that you will start the clock and leave it running by mistake. This is in fact one of the most annoying problems with any time tracking solution that relies on human interaction. While some tools will detect inactivity and stop the clock for you, Timewarrior does not. Instead it deals with this problem in two ways, first by making it easy to correct tracked time, and second by way of exclusions, which we will cover later.
Tags
The examples so far did not use tags. Tags are optional, but when you do make use of tags, you start tracking time spent on different activities.
$ timew start 'Using Tags' Software
Tracking 'Using Tags' Software
Started 2016-08-07T20:23:08
Current 08
Total 0:00:00
$ ▒
This example is tracking time using two different tags.
The first is Using Tags
, the second is Software
.
The first tag is two words, and because of the space between them, the quotes are needed to keep those two words together in one tag.
The second tag is a single word and needs no quotes.
$ timew stop
Recorded 'Using Tags' Software
Started 2016-08-07T20:23:08
Current 48
Total 0:00:40
$
$ timew summary
Wk Date Day Tags Start End Time Total
--- ---------- --- -------------------- -------- -------- ------- -------
W31 2016-08-07 Sun 20:19:42 20:21:12 0:01:30
20:22:06 20:22:18 0:00:12
Software, Using Tags 20:23:08 20:23:48 0:00:40 0:02:22
-------
0:02:22
$ ▒
You can see that using tags is useful, but optional.
Once you are using tags, you can use them to filter reports, such as the summary
report.
$ timew summary Software
Wk Date Day Tags Start End Time Total
--- ---------- --- -------------------- -------- -------- ------- -------
W31 2016-08-07 Sun Software, Using Tags 20:23:08 20:23:48 0:00:40 0:00:40
-------
0:00:40
$ ▒
There is a tags
command, which will show you all the tags you have used.
$ timew tags
Tag Description
---------- -----------
Software -
Using Tags -
$ ▒
You may wonder how is that ‘Description’ column in the report used? It is the first example of tag metadata, which you can configure.
$ timew config tags.Software.description 'Learning about new software'
Are you sure you want to add 'tags.Software.description' with a value of 'Learning about new software'? (yes/no) yes
Config file ~/.timewarrior/timewarrior.cfg modified
$ ▒
This is not currently used, but does represent how Timewarrior will be extended to include tag metadata in future releases.
Help
Although we have just begun, it is important to mention the built-in help system.
Let’s look at the help for the continue
command.
$ timew help continue
Syntax: timew continue
Resumes tracking the most recently closed interval. For example:
$ timew track 09am - 10am tag1 tag2
$ timew continue
The 'continue' command creates a new interval, starting now, and using the tags
'tag1' and 'tag2'
This command is a convenient way to resume work without re-entering the tags.
See also 'start', 'stop'
$ ▒
You can see that the help system contains examples, and introduces new commands and other help topics.
From the help text, we learn that the continue
command will not only resume tracking but use the same set of tags.
In addition to the built-in help, there is a man page which contains the same information plus a lot more.
$ man timew
timew(1) User Manuals timew(1)
NAME
timew - A command line time tracker.
SYNOPSIS
timew <command> [<arg> ...]
Historical
We have seen how to use the stopwatch feature, and combine it with tags.
Additionally we can record time ex post facto.
So to track time I spent earlier in the day (but forgot to record), I use the track
command.
$ timew track 9:00 - 11:00 'Outline the tutorial topics'
Recorded
Started 2016-08-07T09:00:00
Current 11:00:00
Total 2:00:00
$ ▒
When Timewarrior sees a time like 9:00
it always assumes it is in the past, because Timewarrior is a tool for recording what you have done or are doing, and is not a forward-looking planning tool.
This is the opposite of Taskwarrior, which always looks forward, because tasks are generally going to be completed in the future.
There are other ways to specify time in the past, for example:
$ timew track 9am for 2h 'Outline the tutorial topics'
$ timew track 9am to 11am 'Outline the tutorial topics'
$ timew track 2h before 11am 'Outline the tutorial topics'
$ ▒
And there are many more, which can be seen in the help system.
$ timew help ranges
timew-ranges(7) User Manuals timew-ranges(7)
NAME
timew-ranges - date and time ranges supported by Timewarrior
SYNOPSIS
DESCRIPTION
An interval defines a block of time that is tracked.
The syntax for specifying an interval is flexible, and may be one of:
[from] <date>
[from] <date> to/- <date>
[from] <date> for <duration>
<duration> before/after <date>
<duration> ago
[for] <duration>
Examples are:
from 9:00
from 9am - 11am
from 9:00:00 to 11:00
from 9:00 for 2h
2h after 9am
2h before 11:00
2h ago
for 2h
An interval is said to be 'closed' if there is both a start and end,
and 'open' if there is no end date.
timew 1.4.2 2020-09-23 timew-ranges(7)
In addition to time, you can specify date and time, so one equivalent command would use an ISO datetime.
$ timew track 2016-07-30T09:00:00 - 2016-07-30T11:00:00 'Outline the tutorial topics'
Again, you can see all the date formats listed using the help system.
$ timew help dates
Using date synonyms you can track time for a whole month.
$ timew track june - july Training
But that command will track all 30 days, all 24 hours each in June, including weekends, holidays and lunch breaks. Or does it? This is discussed later.
Hints
Many commands support hints, which are words that start with a :
and are convenient representations to save time.
Here is the :quiet
hint, being used to suppress all feedback:
$ timew track 9am - 10am 'Walk the dog' :quiet
$ ▒
The :quiet
hint is the same as disabling verbosity, but is easier to specify, and temporary.
Another hint is :yes
, which is used to override confirmation, by automatically answering ‘yes’ to the question.
Some hints are shortcuts specifiers for date ranges.
For example, the :yesterday
hint is a date range representing all day yesterday.
Similarly, :lastweek
is also a date range.
That makes the following two commands identical (assuming that today is the 6th):
$ timew track :yesterday Hiking
$ timew track 5th - 6th Hiking
The help system lists all the supported hints.
$ timew help hints
timew-hints(7) User Manuals timew-hints(7)
NAME
timew-hints - Timewarrior hints
SYNOPSIS
DESCRIPTION
Timewarrior supports hints, which are single-word command line features that start
with a colon like this:
:week
Hints serve several purposes. This example is a shortcut for the date range that
defines the current week.
Other hints, such as:
:quiet
Are ways to control the behavior of Timewarrior, in this case eliminating all
forms of feedback, for purposes of automation.
The supported hints are:
:quiet Turns off all feedback. For automation
:debug Runs in debug mode, shows many runtime details
:yes Overrides confirmation by answering 'yes' to the questions
...
Charts
Timewarrior has a built-in chart that can show blocks of time by day. This is a text-based chart so it is not high resolution and has no drill-down capabilities. (Incidentally such a chart would be possible using the extension API, but by default, Timewarrior just has simple charting).
There are three charts, which are really just three variations of the same chart, all controlled by configuration. We’ll take a look at these charts, but first we need some sample data to look at. Let us first track a couple of days of data, to illustrate how the charts work.
$ timew track 2016-08-06T09:00 - 2016-08-06T12:00 'Staff meeting' :quiet
$ timew track 2016-08-06T12:45 - 2016-08-06T14:00 Training :quiet
$ timew track 2016-08-06T14:15 - 2016-08-06T16:00 'Project review' :quiet
$ timew track 2016-08-06T16:15 - 2016-08-06T17:20 Research :quiet
$ timew track 2016-08-07T08:45 - 2016-08-07T12:30 Research :quiet
$ timew track 2016-08-07T13:15 - 2016-08-07T17:30 Research :quiet
$
$ ▒
We have tracked six separate intervals, and the summary report shows just that.
$ timew summary yesterday - now
Wk Date Day Tags Start End Time Total
--- ---------- --- -------------- -------- -------- ------- --------
W31 2016-08-06 Sat Staff meeting 9:00:00 12:00:00 3:00:00
Training 12:45:00 14:00:00 1:15:00
Project review 14:15:00 16:00:00 1:45:00
Research 16:15:00 17:20:00 1:05:00 7:05:00
W31 2016-08-07 Sun Research 8:45:00 12:30:00 3:45:00
Research 13:15:00 17:30:00 4:15:00 8:00:00
--------
15:05:00
$ ▒
The summary report gives accurate time values, so this should be the preferred report for this reason.
Let’s look at the first chart, the day
report.
$ timew day
Sun 7 0 1 2 3 4 5 6 7 8 Research▒▒▒▒▒▒▒▒▒▒▒ 1Research▒▒▒▒▒▒▒▒▒▒▒▒▒▒ 18 19 20 21 22 23
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Tracked 8:00:00
Available 16:00:00
Total 24:00:00
$ ▒
Like the summary
report, the day
report shows data for today by default.
You can make it show multiple days like this:
$ timew day 4th - now
A better option is to use the week
report.
$ timew week
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Total
W31 Mon 1
Tue 2
Wed 3
Thu 4
Fri 5
Sat 6 Staff▒meeting▒▒ Trainin Project▒▒ Resea 7:05
Sun 7 Research▒▒▒▒▒▒▒▒▒▒▒ Research▒▒▒▒▒▒▒▒▒▒▒▒▒ 8:00
------
15:05
Tracked 15:05:00
Available 152:55:00
Total 168:00:00
$ ▒
There is also a month
report that looks the same, but is longer.
Again, the only difference between these reports is configuration, and you can override any of this to customize these charts.
See man timew
for full configuration details.
Reports
We have seen the summary
and tags
reports, but there is another useful report that shows the untracked time in the day.
$ timew summary
Wk Date Day Tags Start End Time Total
--- ---------- --- -------------- -------- -------- ------- -------
W31 2016-08-07 Sun Research 8:45:00 12:30:00 3:45:00
Research 13:15:00 17:30:00 4:15:00 8:00:00
-------
8:00:00
$
$ timew gaps
Wk Date Day Tags Start End Time Total
--- ---------- --- -------------- -------- -------- ------- --------
W31 2016-08-07 Sun Research 0:00:00 8:45:00 8:45:00
Research 12:30:00 13:15:00 0:45:00
Research 17:30:00 0:00:00 6:30:00 16:00:00
--------
16:00:00
$ ▒
The gaps
report is useful for finding time in the day where you were not tracking time.
In the example the gaps correspond well to time that was not spent working, so there is no need for adjustments.
All reports in Timewarrior can be filtered by time interval and tags, but all have a default time interval.
Themes
Timewarrior has color themes that are mostly used by the charts to color the different parts of the display.
To use a color theme, add this line to your ~/.timewarrior/timewarrior.cfg
file with a text editor:
import /path/to/themes/dark_green.theme
Note that the path /path/to/themes
is a placeholder.
Your installation will likely use a path more like this, but it should be noted that this path varies depending on platform and the wishes of the packager.
import /usr/local/share/doc/timew/doc/themes/dark_green.theme
There are a few simple themes available initially, but this collection will grow and improve. Timewarrior is also likely to make greater use of themes in future releases.
Holidays
Timewarrior can also make use of Holiday files. In the same way that a color theme was imported into the configuration file, a holiday file can also be used:
import /usr/local/share/doc/timew/doc/holidays/holidays.en-US
Again, that path is platform-dependent, so use the appropriate path for your system.
When a holiday file is used, Timewarrior knows that there are some days in the year that are not work days. While this changes nothing about your ability to track time, it does affect some automatic tracking features, which we will cover next.
There is a README
document and a refresh
script provided with the holiday file, which explains how to update the holiday data, and how to obtain holiday files for other locales.
Note that only the en-US
locale is included by default.
Exclusions
Exclusions are a very powerful Timewarrior feature, and make automatic time tracking possible. An exclusion - much like a holiday - represents a block of time where you do not expect to work.
The simplest exclusion is a day off work. Suppose you took a day off, on August 4th. You can define this day as an exclusion.
$ timew config exclusions.days.2016_08_04 off :yes
Config file ~/.timewarrior/timewarrior.cfg modified.
$ ▒
The date must be formatted in this precise way.
Note the use of the :yes
hint to override confirmation.
Now we see on the week
report that the day is marked as non-working.
$ timew week
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Total
W31 Mon 1
Tue 2
Wed 3
Thu 4 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Fri 5
Sat 6
Sun 7
------
0:00
Tracked 0:00:00
Available 156:00:00
Total 156:00:00
$ ▒
Similarly, if you worked on a holiday, you can define that day as a work day, and therefore available for automatic tracking.
$ timew config exclusions.days.2016_01_01 on :yes
Config file ~/.timewarrior/timewarrior.cfg modified.
$ ▒
Here we have (re)defined January 1st as a working day, which was previously defined as a holiday in the en-US
locale.
In addition to whole days working or not working, you can define exclusions for each day of the week to represent your work schedule. Suppose you work a regular weekly schedule, that starts at 8:30am, Monday to Friday, with weekends off. You take a 45-minute lunch break each day, and leave work at 5:30pm. On Fridays you leave early.
$ timew config exclusions.monday '<8:30 12:30-13:15' :yes
$ timew config exclusions.tuesday '<8:30 12:30-13:15' :yes
$ timew config exclusions.wednesday '<8:30 12:30-13:15' :yes
$ timew config exclusions.thursday '<8:30 12:30-13:15' :yes
$ timew config exclusions.friday '<8:30 12:30-13:15' :yes
$ timew config exclusions.saturday '>0:00' :yes
$ timew config exclusions.sunday '>0:00' :yes
$ ▒
You can view this in the week
report, and here we will use the :blank
hint to remove all the tracked data from the report, leaving only the exclusions.
$ timew week :blank
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Total
W31 Mon 1 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒ ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Tue 2 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒ ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Wed 3 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒ ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Thu 4 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Fri 5 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒ ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Sat 6 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Sun 7 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
------
0:00
Tracked 0:00:00
Available 32:00:00
Total 32:00:00
$ ▒
Your whole work week is defined. While you are not at all constrained by this defined schedule, it does control automatic time tracking.
Automatic Tracking
Once you have defined exclusions for your workweek, the tracked time will conform to the set boundaries. Suppose this is our work week:
$ timew week august
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Total
W31 Mon 1 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒ ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Tue 2 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒ ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Wed 3 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒ ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Thu 4 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Fri 5 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒ ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Sat 6 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Sun 7 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
------
0:00
Tracked 0:00:00
Available 32:00:00
Total 32:00:00
$ ▒
There is no tracked time, but there are 40:15:00 hours available to be tracked.
If we worked the whole week on our Research
project, we can track all that time with one command:
$ timew start monday Research
Tracking Research
Started 2016-08-01T00:00:00
Current 07T21:38:29
Total 165:38:29
$
$ timew week august
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Total
W31 Mon 1 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒Research ▒▒ ▒Research ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Tue 2 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒Research ▒▒ ▒Research ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Wed 3 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒Research ▒▒ ▒Research ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Thu 4 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Fri 5 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒Research ▒▒ ▒Research ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Sat 6 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
Sun 7 ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒
------
0:00
Tracked 0:00:00
Available 32:00:00
Total 32:00:00
$ ▒
We see that the exclusions are automatically subtracted from the time, and fill the whole week, leaving no available time.
Note that this example tracks up until ’now’, and as this tutorial is being written on a weekend, you can see that the tracking stops on Friday, and does not continue into the weekend.
If this was being done on the Friday, at 16:23, then the week
report would stop precisely at 16:23, because it is an open interval.
Corrections
With or without the use of exclusions, there is always the need to make corrections to the tracked time. As mentioned earlier, it is quite likely that the clock would be left running by mistake, or that the tracking was started or stopped at the wrong time. We will create some incorrect time tracking, and then correct it.
$ timew track 9am - 10am ProjectA
Recorded ProjectA
Started 2016-08-07T09:00:00
Ended 10:00:00
Total 1:00:00
$ timew track 10:12am - 10:30am projectB
Recorded projectB
Started 2016-08-07T10:12:00
Ended 30:00
Total 0:18:00
$ timew start 12pm projectC
Tracking projectC
Started 2016-08-07T12:00:00
Current 21:41:18
Total 9:41:18
$ timew summary
Wk Date Day Tags Start End Time Total
--- ---------- --- -------- -------- -------- ------- --------
W31 2016-08-07 Sun ProjectA 9:00:00 10:00:00 1:00:00
projectB 10:12:00 10:30:00 0:18:00
projectC 12:00:00 - 9:41:24 10:59:24
--------
10:59:24
$ ▒
I actually started work at 8:30am, but forgot to start the clock at the beginning.
I also did not take a break at 10am, I again forgot to start the clock.
Then I was working on projectC
since about 11am, but didn’t record it properly.
These are typical mistakes, and are easy to fix, as there are several commands for making adjustments like this.
To make an adjustment to an interval, we need first to identify that interval.
The summary
, day
, week
and month
reports all support the :ids
hint for this purpose.
If we take a look at the summary
report with the hint:
$ timew summary :ids
Wk Date Day ID Tags Start End Time Total
--- ---------- --- -- -------- -------- -------- ------- --------
W31 2016-08-07 Sun @3 ProjectA 9:00:00 10:00:00 1:00:00
@2 projectB 10:12:00 10:30:00 0:18:00
@1 projectC 12:00:00 - 9:41:24 10:59:24
--------
10:59:24
$ ▒
Notice how the intervals now have IDs: @3
for the oldest interval.
Let’s make some corrections:
$ timew move @3 8:30am
Moved @3 to 2016-08-07T08:30:00
$ timew lengthen @3 30mins
Lengthened @3 by 0:30:00
$ timew move @1 11:00
Moved @1 to 2016-08-07T11:30:00
$
$ timew summary :ids
Wk Date Day ID Tags Start End Time Total
--- ---------- --- -- -------- -------- -------- -------- --------
W31 2016-08-07 Sun @3 ProjectA 8:30:00 10:00:00 1:30:00
@2 projectB 10:12:00 10:30:00 0:18:00
@1 projectC 11:00:00 - 10:41:24 12:30:39
--------
12:30:39
$ ▒
There is still a problem, interval @2
needs to occupy the slot between 10am and 11am.
There is a :fill
hint that does this for us.
$ timew @2 move 10:02 :fill
Backfilled @2 to 2016-08-07T10:00:00
Filled @2 to 2016-08-07T11:00:00
Moved @2 to 2016-08-07T10:00:00
$
$ timew summary
Wk Date Day Tags Start End Time Total
--- ---------- --- -------- -------- -------- -------- --------
W31 2016-08-07 Sun ProjectA 8:30:00 10:00:00 1:30:00
projectB 10:00:00 11:00:00 1:00:00
projectC 11:00:00 - 10:43:15 13:13:15
--------
13:13:15
$ ▒
The @1
ID always represents the newest interval.
Note that if my corrections have changes the order, then the IDs would be different, and you would need to run timew summary :ids
again to see the new IDs.
Finally, I actually stopped for lunch at 12:30 for 45 minutes:
$ timew stop 12:30pm
Recorded projectC
Started 2016-08-07T11:00:00
Current 12:30:00
Total 1:30:00
$
$ timew continue
Tracking projectC
Started 2016-08-07T21:43:53
Current 53
Total 1:30:00
$
$ timew summary
Wk Date Day Tags Start End Time Total
--- ---------- --- -------- -------- -------- ------- -------
W31 2016-08-07 Sun ProjectA 8:30:00 10:00:00 1:30:00
projectB 10:00:00 11:00:00 1:00:00
projectC 11:00:00 12:30:00 1:30:00
projectC 21:43:53 - 0:00:07 4:00:07
-------
4:00:07
$
$ timew move @1 1:15pm
Moved @1 to 2016-08-07T13:15:00
$ ▒
Let’s keep going, even though this example has already exceeded credibility, to demonstrate more.
I need to change that projectB
interval to use projectB1
and projectB2
tags, and divide the time between the two.
We will split the interval, the re-tag it.
$ timew summary :ids
Wk Date Day ID Tags Start End Time Total
--- ---------- --- -- -------- -------- -------- ------- --------
W31 2016-08-07 Sun @4 ProjectA 8:30:00 10:00:00 1:30:00
@3 projectB 10:00:00 11:00:00 1:00:00
@2 projectC 11:00:00 12:30:00 1:30:00
@1 projectC 13:15:00 - 8:29:42 12:29:42
--------
12:29:42
$ timew @3 split
Split @3
$
$ timew summary :ids
Wk Date Day ID Tags Start End Time Total
--- ---------- --- -- -------- -------- -------- ------- --------
W31 2016-08-07 Sun @5 ProjectA 8:30:00 10:00:00 1:30:00
@4 projectB 10:00:00 10:30:00 0:30:00
@3 projectB 10:30:00 11:00:00 0:30:00
@2 projectC 11:00:00 12:30:00 1:30:00
@1 projectC 13:15:00 - 8:29:54 12:29:54
--------
12:29:54
$ timew untag @4 @3 projectB
Removed projectB from @4
Removed projectB from @3
$ timew tag @4 projectB1
Added projectB1 to @4
$ timew tag @3 projectB2
Added projectB2 to @3
$ timew summary :ids
Wk Date Day ID Tags Start End Time Total
--- ---------- --- -- --------- -------- -------- ------- --------
W31 2016-08-07 Sun @5 ProjectA 8:30:00 10:00:00 1:30:00
@4 projectB1 10:00:00 10:30:00 0:30:00
@3 projectB2 10:30:00 11:00:00 0:30:00
@2 projectC 11:00:00 12:30:00 1:30:00
@1 projectC 13:15:00 - 8:30:19 12:30:19
--------
12:30:19
$ ▒
Notice how the split
command just divided @3
into two even-sized intervals.
But we’re still not done - I brought lunch to work and ate at my desk while working so let’s eliminate that lunch break.
$ timew join @2 @1
Joined @2 and @1
$
$ timew summary
Wk Date Day Tags Start End Time Total
--- ---------- --- --------- -------- -------- -------- --------
W31 2016-08-07 Sun ProjectA 8:30:00 10:00:00 1:30:00
projectB1 10:00:00 11:30:00 0:30:00
projectB2 11:30:00 11:00:00 0:30:00
projectC 11:00:00 - 10:46:10 13:16:10
--------
13:16:10
$ ▒
Now whether this report now accurately represents your day, or whether it is a fiction you need to report (no judgement here), Timewarrior supports it, but let’s stop - the example can’t take much more.
We saw the stop
command with a specific end time, the move
, the lengthen
, split
, join
, tag
and untag
commands and the :fill
hint being used.
There are also the shorten
, cancel
, and delete
commands.
See man timew
for full details.
Extensions
Timewarrior reports are not sophisticated, they are minimally functional and focus on simply displaying the data. What if you need a report broken down by tags, with weekly subtotals?
Timewarrior supports extension reports, via the extension API. This is mechanism that allows you to write a report using any language you choose. Don’t like the way the summary report shows the data? Write your own. Better yet, share the result, and we’ll build a list of 3rd party reports.
We’ve included one extension report with Timewarrior, and will add more. The one provided is:
$ ls -l /usr/local/share/doc/timew/ext/totals.py
-rw-r--r-- 1 root admin 3606 Jul 30 15:34 /usr/local/share/doc/timew/ext/totals.py
$ ▒
Again, that path is platform-dependent, so use the appropriate path for your system. Note that this is a Python script, and to use this you’ll need to have Python installed.
To install and use this extension, or any other, simply copy it to your ~/.timewarrior/extensions
directory and make sure it is executable.
$ cp /usr/local/share/doc/timew/ext/totals.py ~/.timewarrior/extensions
$ chmod +x ~/.timewarrior/extensions/totals.py
$
Caution
Extensions are dangerous things. As with any downloaded program, be careful - you are giving execute permission to software that may harm you.
Fortunately this is the world of open source, and while that does not mean the software is safe, it does mean you have the necessary access to audit the code and prove it is safe. If you find the code safe, use it. If you are unsure, don’t.
Once the extension is in the extensions
directory, and executable, it should be visible to the extensions
command.
$ timew extensions
Extensions located in:
~/.timewarrior/extensions
Extention Status
--------- ------
totals.py Active
$ ▒
Additionally, the diagnostics
command will report the presence and status of this extension.
Once an extension is ready to use, it is used in the same way that the summary
report is used, with date range and/or tag filtering.
The command you use is compared to the name of the script, and if unique, is a match.
All of these commands are equivalent:
$ timew totals.py
$ timew totals.p
$ timew totals.
$ timew totals
$ timew total
Here is the report run with no filter, and therefore against all recorded data, which is not much in this example.
$ timew totals
Total by Tag, for 2016-08-07 12:30:00 - 2016-08-08 01:52:44
Tag Total
--------- --------
ProjectA 1:30:00
projectB1 0:30:00
projectB2 0:30:00
projectC 10:52:44
--------
Total 13:22:44
$ ▒
Extensions are not restricted to emitting text, they could for example output, DOT, PDF, PNG, JPEG ...
Integration
Timewarrior integrates with Taskwarrior by means of a Taskwarrior on-modify
hook script.
Once installed, this means that whenever a task is active, Timewarrior is used to track the time.
Find instructions on how to install & use it on its dedicated page.
End
You’ve made it to the end of the tutorial. You now know more about Timewarrior than most users. If you have feedback, we are interested in hearing it, because open source is a collaborative effort, and you are part of that.