timeman
A terminal based stopwatch and countdown timer, built with OpenTUI and shipped as standalone binaries — no runtime required.
- CLI interface (default): Lightweight inline mode that lives in your scrollback.
- TUI interface: Full-screen terminal UI via
-i/--interactive. - Notifications: Bell + toast when a countdown completes.
- Session timeline: Stopwatch summary with per-session start/end times in your local time zone.
- Session history: Every stopwatch session is saved. Review, delete and retitle them from the TUI with
h. - Drift-proof timing: Durations use a monotonic clock, so a system clock jump (DST, NTP sync) never corrupts them.
Installation
npm:
npm install -g timeman-cli
bun:
bun add -g timeman-cli
pip / uv (same binary, published as time-manager for continuity with the original Python package):
pip install time-manager
# or
uv tool install time-manager
curl (Linux, macOS — downloads the binary from the latest GitHub release):
curl -fsSL https://raw.githubusercontent.com/rehanhaider/time-manager/main/install.sh | bash
Every method installs the same two commands, tm and its long form timeman, pointing at one binary. Package names differ by registry for historical reasons: timeman-cli on npm, time-manager on PyPI.
Supported platforms: Linux x64/arm64 (glibc and musl), macOS x64/arm64, Windows x64 (via npm/bun).
Usage
tm sw # stopwatch (also: tm stopwatch)
tm cd 5 m # 5-minute countdown (also: tm countdown 5 m)
Stopwatch
tm sw
tm sw -p "Project Alpha" # name the session for the summary
tm sw -i # full-screen TUI
Keys: space start/stop · r reset · q quit · h history (TUI only).
On exit you get a session timeline — one bar per start/stop run, with total time:
╭──────────────── Project Alpha: 0 hrs 25 mins ────────────────╮
│ Session #1 13:53 ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ 14:03 IST (0 hrs 10 mins) │
│ │
│ Session #2 14:10 ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ 14:25 IST (0 hrs 15 mins) │
╰──────────────────────────────────────────────────────────────╯
Session history
Both modes save every session when you quit. Only the TUI reads them back, so press h from tm sw -i. There is no tm log command.
The first screen rolls your projects up over a billing period, largest first:
This Week This Month Last Month All Time
August 2026 · 11 hrs 52 mins logged
╭────────────────────────────────────────────────────────────────────────╮
│ PROJECT SHARE TOTAL LAST │
│ │
│ ▸Project Alpha ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ 4 hrs 10 mins Sun │
│ Client Review ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ 4 hrs 5 mins Mon │
│ Deep Work ▬▬▬▬▬▬▬▬▬▬▬▬▬ 2 hrs 47 mins Sat │
│ Untitled ▬▬▬▬ 0 hrs 50 mins Fri │
╰────────────────────────────────────────────────────────────────────────╯
Keys: ↑↓ project · ←→ period · enter line items · esc back · q quit.
enter breaks one project into invoice lines, one per day, with its sessions underneath:
Client Review · Last Month · 4 hrs 5 mins
╭────────────────────────────────────────────────────────────────────────╮
│ Mon 31 Aug ───────────────────────────────────────── 2 hrs 25 mins │
│ ▸ 13:15 → 15:40 2 hrs 25 mins │
│ │
│ Thu 27 Aug ───────────────────────────────────────── 1 hr 40 mins │
│ 10:00 → 11:40 1 hr 40 mins │
╰────────────────────────────────────────────────────────────────────────╯
Keys: ↑↓ session · d delete · r rename the project · esc back · q quit.
A row shows the wall-clock span alongside the time actually on the clock. Pause mid-session and the duration comes out shorter than the span. d asks for y/n on the row itself. r retitles every session filed under that project, which is how Untitled gets fixed after you forget -p.
Sessions live in a SQLite database at ~/.local/share/timeman/history.db, or ~/Library/Application Support/timeman on macOS and %LOCALAPPDATA%\timeman on Windows. TIMEMAN_HOME overrides that directory. The newest 5,000 sessions are kept.
Countdown
tm cd 90 s # units: s/sec/seconds, m/min/minutes, h/hr/hours
tm cd 5 # unit defaults to minutes
tm cd 1 h -i # full-screen TUI
Keys: space pause/resume · q quit. The display turns yellow under 30 seconds and red under 10; when time is up you get a terminal bell and a toast.
Development
Requires Bun >= 1.3.14.
bun install # install dependencies
bun run dev sw # run from source
bun test # tests
bunx tsc --noEmit # typecheck
Building distribution artifacts:
bun install --os="*" --cpu="*" # stage native packages for every platform (one-time)
make build # compile binaries for all 7 targets into dist/bin
make package # assemble npm packages (dist/npm) + release tarballs (dist/release)
Releasing
Everything publishes locally from this machine — no CI, no secrets on GitHub.
make bump(orTYPE=minor make bump), commit.make package— builds all binaries, npm packages, wheels, and release tarballs.make publish— rehearsal: npm--dry-run+ TestPyPI.PROD=TRUE make publish— the real thing: npm packages, PyPI wheels, and a GitHub releasev<version>with the binaries (which the curl installer downloads).
Credentials: npm token in ~/.npmrc, PyPI tokens in .env (PYPI_PUBLISH_TOKEN, TEST_PYPI_PUBLISH_TOKEN), and an authenticated gh CLI for the release upload.
History
This project was originally written in Python with Textual and published to PyPI as time-manager (last Python release: 0.3.1; the implementation is preserved in git history). From 0.4.0 on, the PyPI package ships the same compiled binary as the npm package — pip install time-manager keeps working with no Python runtime involved.
License
MIT
Metadata
Release files for time-manager 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 258.2 MB
Release files / time_manager-0.6.0-py3-none-win_amd64.whl
| Download URL | time_manager-0.6.0-py3-none-win_amd64.whl |
|---|---|
| Size | 39.9 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
3a6d3e44073fe02a90350d47c805c3fae5d300cde64af616d2b83011da1b415e
|
|
BLAKE2b-256 checksum How to use checksums |
1a5bd016fade2185e5723b82514363c73c7daa2e48a97eaea191b6d7445acc9c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.17
|
Release files / time_manager-0.6.0-py3-none-musllinux_1_2_x86_64.whl
| Download URL | time_manager-0.6.0-py3-none-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 42.6 MB |
| Tags | Linux musl 1.2+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
8efd63340c62f27840568c0214f1915c3581eb90d68e74e850ec8b666d5bc7a9
|
|
BLAKE2b-256 checksum How to use checksums |
e0a37063eeb9e98c9e119f34bc15947bdf6a3424802cdac50040d6edf91a8965
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.17
|
Release files / time_manager-0.6.0-py3-none-musllinux_1_2_aarch64.whl
| Download URL | time_manager-0.6.0-py3-none-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 42.1 MB |
| Tags | Linux musl 1.2+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
8e7cf1198e022d41099912cb75127bc7c50dae477fd8a345cfd3397ae93e8280
|
|
BLAKE2b-256 checksum How to use checksums |
26dcc3265a78156ce7bf34249de73dd913999ab3080011c3b0fee6daa521fb1b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.17
|
Release files / time_manager-0.6.0-py3-none-manylinux_2_27_x86_64.whl
| Download URL | time_manager-0.6.0-py3-none-manylinux_2_27_x86_64.whl |
|---|---|
| Size | 40.3 MB |
| Tags | Linux glibc 2.27+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
10050e83787f53184eab54007afdd9d9626e9259d8ecaa0df7ced5054ecfd66c
|
|
BLAKE2b-256 checksum How to use checksums |
c63ca2347cbac828e979ab557898a8c1b617adde213e81665e091197c44a048c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.17
|
Release files / time_manager-0.6.0-py3-none-manylinux_2_27_aarch64.whl
| Download URL | time_manager-0.6.0-py3-none-manylinux_2_27_aarch64.whl |
|---|---|
| Size | 39.9 MB |
| Tags | Linux glibc 2.27+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
37bdbb312f81db789999795107a82c489e15325b1f1a3d06c381b0f8631af622
|
|
BLAKE2b-256 checksum How to use checksums |
d90af8298d22946548bfe116d8c2c78e01b48e3b7685ead455835f3cd4c707dc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.17
|
Release files / time_manager-0.6.0-py3-none-macosx_12_0_x86_64.whl
| Download URL | time_manager-0.6.0-py3-none-macosx_12_0_x86_64.whl |
|---|---|
| Size | 28.0 MB |
| Tags | Python 3 macOS 12.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
0410c36914fe1788cde6189cf187bbc6002b1f2e19aae5aa68b3562eb7ad882a
|
|
BLAKE2b-256 checksum How to use checksums |
4cd7a300263df1bb5e1b81db92e666dfd09bc3dd1d0d2db1287c130702baf29f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.17
|
Release files / time_manager-0.6.0-py3-none-macosx_12_0_arm64.whl
| Download URL | time_manager-0.6.0-py3-none-macosx_12_0_arm64.whl |
|---|---|
| Size | 25.5 MB |
| Tags | Python 3 macOS 12.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7e8d729b7e8446bd4c515a2684278139917ff1445a6e67d74528df95188cc6f9
|
|
BLAKE2b-256 checksum How to use checksums |
887ea0b92cc08634ec90059bcd7f2f9fc2ae6a625767bc38fc9b872db6ca93cc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.17
|
Security for time-manager 0.6.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.