0xLog: Terminal Time Tracker
0xLog is a lightweight, terminal-based time tracking tool designed to stay out of your way. It operates seamlessly alongside your development workflow, featuring an interactive TUI, Git branch awareness, and file-based syncing.
Installation
The package is published on PyPI as 0xlog-cli.
0xLog is a command-line application, so the recommended way to install it is with a tool that gives it an isolated environment and still puts 0xlog on your PATH:
pipx install 0xlog-cli
# Or, if you use uv:
uv tool install 0xlog-cli
This also avoids the externally-managed-environment error (PEP 668) that recent Debian, Ubuntu, and Fedora releases raise when you pip install into the system Python.
Inside a virtual environment, plain pip works as well:
python -m pip install 0xlog-cli
To upgrade later:
pipx upgrade 0xlog-cli
For local development, clone the repository and install it in editable mode:
python -m pip install -e .
Basic Usage
Starting a Task
You can start a task using the start command, or skip the command entirely for even faster logging.
0xlog start "Writing tests for xbut"
# Or the shorthand version:
0xlog "Writing tests for xbut"
Stopping a Task
Stop a specific task by name, or stop everything at once (useful before shutting down).
0xlog stop "Writing tests for xbut"
0xlog stopall
⚡ Git Workflow Integration
0xLog is context-aware. If you start a task while inside a Git repository, it automatically detects your current branch and appends it to your task name.
Example:
If you are inside the Narsil/backend directory on the feature/jwt-auth branch:
0xlog start "Updating middleware"
What gets logged: Updating middleware [feature/jwt-auth]
Smart Task Stopping
Because typing out the full branch name every time you stop a task is tedious, the stop command uses smart partial matching. You only need to type enough of the task name to uniquely identify it.
# This will successfully find and stop "Updating middleware [feature/jwt-auth]"
0xlog stop "Updating middleware"
(If multiple running tasks match your input, 0xLog will list them and ask you to be more specific.)
Task Aliases
If you find yourself typing the same long task names repeatedly, create an alias to speed things up.
# Create the alias
0xlog alias code-review "Reviewing pull requests"
# Use the alias
0xlog start code-review
List all configured aliases and the UUID of the task each one points to:
0xlog alias
Reusing an alias name reassigns it to the supplied task:
0xlog alias code-review "Review customer feedback"
Delete an alias when it is no longer useful:
0xlog alias --delete code-review
Aliases are references to tasks, not separate tasks. Starting or adding time with either a task name or one of its aliases keeps the same task UUID.
Adding retrospective tasks
Use start time and duration to add a task:
0xlog add "Reviewed PRs" --start "10 am" --duration "20m"
# Shorthand:
0xlog add "Reviewed PRs" -s "10 am" -d "20m"
Or use start time and end time:
0xlog add "Client Call" --start "10 am" --end "10:49"
# Shorthand:
0xlog add "Client Call" -s "10:00" -e "10:49"
The time parser is highly flexible and will accept formats like 10am, 10 am, 10:00, 14:30, 02:30 pm, etc. The duration parser understands strings like 20m, 20 minutes, 1h 30m, and 1.5h.
Monitoring & Reports
Keep track of your active time and daily productivity without leaving the terminal.
0xlog statusDisplays all currently running tasks and your total logged time for the current day.0xlog recentPrints a list of your 10 most recently tracked tasks so you can easily copy/paste them to resume work.0xlog reportGenerates a summarized daily timesheet, aggregating all the time spent on each task today.
Interactive TUI Mode
If you prefer a live dashboard that you can keep open in a dedicated terminal pane, simply run the command with no arguments:
0xlog
This launches a live-updating view of your ongoing tasks.
- The dashboard updates every second.
- You can type commands directly into the prompt at the bottom (e.g.,
start "Deploying xbut",stopall,report). - Type
quitorqto exit. - Graceful Shutdown: If you leave the TUI running and shut down your computer, the script intercepts the system termination signal and automatically runs
stopallto ensure your timers are accurately halted.
Data & Syncing
All your data is stored in a single, human-readable JSON file located at:
~/.0xlog.json
Each task has a stable UUID. 0xLog stores that ID with every historical and ongoing record, so repeated use of an existing task name or alias is always associated with the same task. Existing data files are migrated automatically the next time they are loaded.
To sync your timers across multiple machines: Simply place this file in a synced folder (like Dropbox, Google Drive, or a private Git repo) and create a symlink to your home directory on each machine:
Linux/macOS:
ln -s /path/to/synced/folder/.0xlog.json ~/.0xlog.json
Windows (Run as Administrator):
mklink %USERPROFILE%\.0xlog.json "C:\path\to\synced\folder\.0xlog.json"
Contributing
Contributions are welcome. Please read CONTRIBUTING.md and CONVENTIONS.md before opening a pull request.
Security
Please follow the private reporting process in SECURITY.md for suspected vulnerabilities.
Code of Conduct
Participation in this project is governed by the Code of Conduct.
License
0xLog is released under the MIT License.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file 0xlog_cli-0.1.0.tar.gz.
File metadata
- Download URL: 0xlog_cli-0.1.0.tar.gz
- Upload date:
- Size: 13.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f5a59893c2d1572cee2aad0d38bc1551dad8361c3cdce9b0305760d0016d9cd
|
|
| MD5 |
ba12f79ce27ee2051d2d5792319c5b73
|
|
| BLAKE2b-256 |
d69036eaa742dc3c915fdc1f989a55ec465bb89bff6684ea4908d0807e4c0afd
|
Provenance
The following attestation bundles were made for 0xlog_cli-0.1.0.tar.gz:
Publisher:
publish.yml on 0xSrsh/0xLog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
0xlog_cli-0.1.0.tar.gz -
Subject digest:
0f5a59893c2d1572cee2aad0d38bc1551dad8361c3cdce9b0305760d0016d9cd - Sigstore transparency entry: 2305347909
- Sigstore integration time:
-
Permalink:
0xSrsh/0xLog@885cba5d8269f3585fc5f71ea6d30ebdc5adf2d8 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/0xSrsh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@885cba5d8269f3585fc5f71ea6d30ebdc5adf2d8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file 0xlog_cli-0.1.0-py3-none-any.whl.
File metadata
- Download URL: 0xlog_cli-0.1.0-py3-none-any.whl
- Upload date:
- Size: 13.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1554d36cb91e19c990ca383513fd155b65d49497644a27917b30efcf22d45ec8
|
|
| MD5 |
a67e3132861e7f778121553943b8fb45
|
|
| BLAKE2b-256 |
195e9ca30b85c34aa335dcffd58ee96d3ed8ca255b5b16bbc7f3b28588594872
|
Provenance
The following attestation bundles were made for 0xlog_cli-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on 0xSrsh/0xLog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
0xlog_cli-0.1.0-py3-none-any.whl -
Subject digest:
1554d36cb91e19c990ca383513fd155b65d49497644a27917b30efcf22d45ec8 - Sigstore transparency entry: 2305347981
- Sigstore integration time:
-
Permalink:
0xSrsh/0xLog@885cba5d8269f3585fc5f71ea6d30ebdc5adf2d8 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/0xSrsh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@885cba5d8269f3585fc5f71ea6d30ebdc5adf2d8 -
Trigger Event:
push
-
Statement type: