Ever wanted / had to use gitlabs timetracking, but never quite managed to integrate it into you workflow? Then this is the repo for you! We have:
- A background daemon that handles auth and caching
- A cli to communicate with it and to remind you to track
- A ready-to-import Go binding for the daemon's varlink interface
Install the gitlab-trackr-utils package (deb, rpm and arch packages plus prebuilt
binaries are on the releases tab). It ships the gitlab-trackrd daemon, the tt
CLI, shell completions, and systemd user units.
The daemon is a systemd user unit — enable and start it:
systemctl enable --now --user gitlab-trackrd.servicett login --host gitlab.comThis walks you through creating a personal access token with the appropriate scopes. Paste it back to the prompt and you are logged in — the token is stored in your platform's keystore (Secret Service/keyring on Linux, Keychain on macOS), never in a file.
The daemon keeps working offline: reads serve the local cache, and time you log while GitLab is unreachable is queued and posted once it reconnects.
tt hook YOUR_SHELL >> YOUR_SHELL_RC # bash, zsh, fish or nuThe hook fires a prompt at regular intervals asking what you were working on, with a list of your assigned issues to pick from.
tt list # your assigned issues, straight from the cache
tt list --mrs # your open merge requests
tt log 42 1h30m # log time on issue #42
tt log '!42' 1h30m # log time on merge request !42 (or: tt log 42 1h30m --mr)
tt history # what you tracked recently (including queued entries)
tt queue # writes that failed permanently, with retry/dismissIssue-acting commands (log, close, assign, unassign) take GitLab-style
references: #42 or bare 42 is an issue, !42 a merge request. Quote the
sigil forms in bash/zsh (history expansion / comments); 42 --mr avoids
quoting entirely.
The CLI config lives at the path shown by tt config path; get an annotated default
with tt config template. The daemon reads its own config — see
gitlab-trackrd/README.md.
Script tt itself, or talk to the daemon's varlink socket directly — the interface
is documented in the interface docs and
available as the gitlab-trackr-api Rust crate or the
Go binding.