timetrace: New features of the time tracking CLI
Tags: showdev, productivity, go, cli
Published: 2021-06-17 09:45:52

Since its initial release in May, a lot of powerful features have been added to [timetrace](https://github.com/dominikbraun/timetrace), a simple time tracking CLI. I'm going to introduce some of the features present in timetrace v0.10.0 in this article.

## Installing timetrace

If you're on macOS, you can simply use Homebrew:

```
brew tap dominikbraun/timetrace
brew install timetrace
```

timetrace is available for all major platforms. Check out the [installation instructions](https://github.com/dominikbraun/timetrace#installation) and pick yours.

> **Basic usage:** If you're new to timetrace, [Tracking my working time using timetrace](https://dev.to/dominikbraun/tracking-my-working-time-using-timetrace-4hj4) might be a good read. There also are [detailed examples and the CLI reference](https://github.com/dominikbraun/timetrace#readme).

## :fire: Project modules

With version 0.7.0, support for _project modules_ has been added to timetrace. Project modules are sub-projects of an existing project.

For example, we could create a project called `make-coffee`:

```
timetrace create project make-coffee
```

Project modules are the exact same thing as projects, expect that they can be associated with a parent project. This association is marked by an `@`. For example, `grind-beans@make-coffee` is a module of the project `make-coffee`. Therefore, creating this project is fairly simple:

```
timetrace create project grind-beans@make-coffee
```

timetrace recognizes those modules. For example, when listing all records for a given project, its modules will be included:


```
timetrace list records today -p make-coffee
+-----+-------------------------+---------+-------+------------+
|  #  |   PROJECT               |  START  |  END  |  BILLABLE  |
+-----+-------------------------+---------+-------+------------+
|   1 | make-coffee             | 08:28   | 08:35 | no         |
|   2 | grind-beans@make-coffee | 08:25   | 08:27 | no         |
+-----+-------------------------+---------+-------+------------+
```

To view all projects along with their modules, just run `timetrace list projects`.

## :fire: Revert changes to projects and records

timetrace v0.8.0 introduced the `--revert` flag for the `edit project`, `delete project`, `edit record` and `delete record` commands. It allows to restore the resource prior to its modification.

For example, let's delete the `make-coffee` project:

```
timetrace delete project make-coffee
```

Oops! That shouldn't have happened. Let's restore the state of the project prior to the `delete` command:

```
timetrace delete project make-coffee --revert
```

The `--revert` flag reverts the change introduced by the previous command, thus our project exists again.

Edited or deleted records can be restored the exact same way. The following command will edit the newest record and lengthen it by 1 hour:

```
timetrace edit record latest --plus 1h
```

This will increase the end time of the records by 1 hour.

> **Hint:** To get a list of the available records of today and the record key for editing them, use `timetrace list records today`.

If this was a mistake, reverting the previous command is very simple:

```
timetrace edit record latest --revert
```

The end time of the record will now be the same as before.

## :fire: An enhanced tracking status

The `timetrace status` command got some love with timetrace v0.9.0 and v0.10.0, addressing some requested features.

First of all, `status` now not only calculates the overall work time of the current day but also the overall _break time_. How long have you been taking breaks today? Take a look at the right column!

![The current tracking status](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/07r5abkba1scqk64jjif.png)

### Print your custom status

It is also possible to print the tracking status in your custom format using the `--format` flag. There is a [pre-defined set of variables](https://github.com/dominikbraun/timetrace#print-the-tracking-status). For example, `{project}` will be replaced with the name of the current project.

To print an output like `Currently working on make-coffee - Worked today: 2h`, issue the following command:

```
timetrace status --format "Currently working on {project} - Worked today: {trackedTimeToday}"
```

Another new option is `--output`. It allows the users to specify an output format. The default is the table shown above, but it is also possible to output the same data as JSON:

```
timetrace status --output json
```

This will produce the following output:

```json
{
        "project": "web-store",
        "trackedTimeCurrent": "1h 45min",
        "trackedTimeToday": "7h 30min",
        "breakTimeToday": "0h 30min"
}
```

Note that the JSON keys are the same as the formatting variables used by `--format`.

This also enables a simple [Starship integration](https://github.com/dominikbraun/timetrace#starship-integration).

---

Now you're good to give those features a try, bookmark the project or provide some feedback!

:star: **[dominikbraun/timetrace](https://github.com/dominikbraun/timetrace)** :star: