Skip to main content

timeman

npm PyPI License: MIT

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.

Stopwatch TUI Screenshot

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.

  1. make bump (or TYPE=minor make bump), commit.
  2. make package — builds all binaries, npm packages, wheels, and release tarballs.
  3. make publish — rehearsal: npm --dry-run + TestPyPI.
  4. PROD=TRUE make publish — the real thing: npm packages, PyPI wheels, and a GitHub release v<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

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)

Table of built distributions (wheels) for time-manager 0.6.0
File
time_manager-0.6.0-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
time_manager-0.6.0-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details
time_manager-0.6.0-py3-none-musllinux_1_2_aarch64.whl Python 3 none Linux musl 1.2+ ARM64 Details
time_manager-0.6.0-py3-none-manylinux_2_27_x86_64.whl Python 3 none Linux glibc 2.27+ x86-64 Details
time_manager-0.6.0-py3-none-manylinux_2_27_aarch64.whl Python 3 none Linux glibc 2.27+ ARM64 Details
time_manager-0.6.0-py3-none-macosx_12_0_x86_64.whl Python 3 none macOS 12.0+ x86-64 Details
time_manager-0.6.0-py3-none-macosx_12_0_arm64.whl Python 3 none macOS 12.0+ ARM64 Details

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

Release history Release notifications | RSS feed

This release

0.6.0 This release

7 release files

0.5.0

7 release files

0.4.1

7 release files

0.4.0

7 release files

0.3.1

2 release files

0.2.26

2 release files

0.2.25

2 release files

0.2.24

2 release files

0.2.23

2 release files

0.2.22

2 release files

0.2.21

2 release files

0.2.20

2 release files

0.2.19

2 release files

0.2.18

2 release files

0.2.15

2 release files

0.2.14

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page