Zeit, erfassen: A CLI Activity & Time Tracker
Zeit is a command line activity & time tracker written in Go, focused on simplicity and integrability. It is available on macOS, Linux, FreeBSD, NetBSD, OpenBSD & Plan9.
For the past couple of years I’ve been happily using Tyme as my main activity & time tracker. I jumped on the Tyme-train on the very first version of the app and following its development up to its current (third) major iteration.
While Tyme itself hasn’t changed much over the past years, its price model did. With the latest update, the developer(s?) changed from a one time payment per major version release to a subscription-based model. Even though I think there can be legitimate reasons for a software product to opt-in on a subscription model, for Tyme and many other apps I feel like the value doesn’t really show.
Don’t get me wrong, Tyme is a great tool. Even though advancements in features don’t really happen that often, one can see that the developer is dedicating significant effort on keeping Tyme up to date. Even left aside the questionable pricing model, it has become increasingly frustrating to work with Tyme in a broader, more sophisticated scope. For example, Tyme basically can’t generate invoices from tracked times by itself. However, there is a plugin for a software called Grand Total, which costs additional money and seemingly integrates with Tyme. After testing that software for a while it turned out to be a huge PITA to use for me and definitely nothing that integrates well into any serious accounting infrastructure.
Besides, there seems to be no way at all to integrate into Tyme, since it does not have any publicly available and documented API/RPC interface to query the the data one feeds into it.
With an increasing frustration over my data being locked-in to a proprietary app that only allows dumb manual exports and additionally costs money on a monthly basis, I decided to try building a replacement for Tyme. In the end, maybe I’d find out that rolling my own tracker is rather too much effort and that it’s worth paying $5 a month in order to not have to do that.
There are only a handful of things that I need in a time tracker:
- An open database that can be read/written programmatically from other tools, either through a dedicated interface (e.g. API) or simply by accessing it directly
- An absurdly simple interface without too much left-and-right, so that I can start and stop tracking with as few clicks/key presses as possible
- The ability to adjust tracked entries in order to correct notes/times
- Reliable recording of activities with crash tolerance (e.g. not losing data from the program or my whole machine dying in the middle of tracking)
- Some integrability into the my other tools ecosystem
- A way to backup the database
Everything else is really just a cherry on top:
- A nice UI? Well, I prefer the CLI/TUI anyway.
- An iOS app? It can be useful, when on the run and not able to access the computer but still needing to track things. However, not having an iOS app is not a deal-breaker either.
- Rates and travel expenses? Thanks, but no. While Tyme does that, I never found it to be even close to a good accounting tool. Besides, my accounting pipeline is a set of CLI tools that allow me to export a Tyme JSON file and generate invoices based on purely the hours tracked in Tyme, with rates and other numbers coming from data sources that I’m in full control of.
<insert name here>?
Coming from an existing tool it’s a hard to make the switch to a completely different one – especially when there are other tools involved that rely on specific data formats. Unfortunately, neither Timewarrior nor Watson or any other tool I’ve found did allow for a way to import my Tyme entries. Also, since the rest of my infrastructure is currently still based on Tyme’s JSON format, an export of data in that format is also a requirement in order to not have to rebuild every other internal tool that processes this data. At least not right now.
Another reason is the technology. Most tools I found are built in Ruby, Python or Node.js. While I don’t have any strong preference in terms of programming languages, I wanted a single binary that doesn’t come with plenty of NPM or pip luggage.
zeit is a command line activity & time tracker written in Go, focused on
simplicity and integrability. I chose Go because it’s the most portable,
single-binary stack with an immensely powerful standard library and – unlike Rust
– allows me to actually get stuff done.
zeit uses BuntDB as a storage engine,
which is somewhat abstracted by its own
Database struct. It wouldn’t be much
effort to replace BuntDB with something else in case it’ll become a liability
For time management
zeit makes use of Go’s
time package as well as of the
now toolkit. Hours are handled as
Decimal type and
cobra is being used as CLI framework.
zeit can display some nice statistics using the
color package; All of the TUI output was
manually implemented, without the use of
tview or anything like that.
All stats are based on the tracked data, which in turn are stored as simple
in an easy to process structure. The
zeit database can be access by other
applications directly, as it is only being locked during write actions (e.g.
starting a new activity, finishing a running one, …) and
zeit also offers an
export command that allows filtering and exporting data in different formats.
There are a few nice tricks
zeit can already do and a few more to come. One of
these is the automatic
git log import.
Using the command
zeit task --git <path-to-repo> <task-name> a Git repository
can be attached to a task. When tracking time on the task,
automatically imports the Git commit messages that were submitted during that
period and adds them to the activity notes. This way, tracked times
automatically include commit hashes and messages from Git.
I’m looking forward to extend
zeit to feature a few more tricks like this, as
well as further formats for import and export of data. However, the basic
tracking functionality is already in place.
zeit on GitHub
zeit is available as pre-built binaries for macOS, Linux, FreeBSD, NetBSD,
OpenBSD and Plan9 and the latest builds can be downloaded
published [ ] · updated [ ]