This release is a pre-release and may not be stable for production use.
Workfold
Workfold folds local Git and filesystem timestamps onto one representative Monday-to-Sunday week. It highlights activity outside your intended working hours without pretending that timestamped events are hours worked.
Workfold is local, private by design, terminal-only, and currently alpha.
Install
pip install workfold
workfold --help
For an isolated installation, use uv tool install workfold or
pipx install workfold. Standalone binaries are available from
GitHub releases.
Quick start
Run workfold inside a Git repository for the current ISO week:
workfold
Common views:
workfold . -t 2026-W31 # one ISO week
workfold . -t 2026-W30 -t 2026-W31 # several weeks, folded together
workfold . -t 2026-07-01..2026-07-31 # inclusive date range
workfold . -t all -m fs # filesystem metadata
workfold . -t all -m git -p portable # portable Git-object timestamps
workfold . -t all -m all -p full # exhaustive local view
workfold . --git-identity jan@example.com # only that recorded Git identity
workfold . --timezone Europe/Berlin
workfold . --hours 'Mo-Thu 08:00-16:30; Fr 08:00-14:00'
workfold . --list-outside --limit 50
The three main selectors are independent:
| Selector | Purpose | Values |
|---|---|---|
-t, --time |
Date scope | this-week, YYYY-Www, DATE..DATE, all |
-m, --mode |
Evidence source | git, fs, all |
-p, --profile |
Collection depth | standard, portable, full |
standard— What does the ordinary activity pattern look like? Git uses commit author dates reachable from local branches (plus a detachedHEAD); filesystem mode uses birth/modified dates for regular files and respects Git ignore rules.portable— What dated evidence is stored inside Git objects? Includes commit author/committer and annotated-tag tagger dates, excluding local-only evidence.full— What dated evidence can this local machine still discover? Enables every supported kind inside the selected time and mode; it does not imply-t allor-m all.
Use --cluster-window 10m, --cluster-window 1h5m, or another duration to tune
row clustering. Use --no-color or the standard NO_COLOR environment
variable for colorless output.
Reading the chart
- Circles are Git events; squares are filesystem events.
- Green and blue are inside the configured schedule; red is outside.
- One symbol is one event. Busy cells use exact
×Ncounts. - Empty time is omitted. A
⋮row reports a compressed gap.
The summary independently splits all events by schedule and by calendar day. Weekend events can therefore also be outside working hours.
Accuracy and privacy
- Events are discrete timestamp observations, not work sessions or duration.
- Collection is local: Workfold does not contact a Git host or telemetry service.
- Git history can be rewritten; reflogs can expire; filesystem metadata is a mutable snapshot and birth time depends on platform and filesystem support.
- Coverage output accounts for unavailable, filtered, unsupported, and unreadable timestamps in the requested scope.
See the documentation for every CLI option, collector semantics, coverage guarantees, and platform notes.
Development
The Python package lives directly in workfold/; there is no src/ wrapper.
nix develop
uv sync --extra dev
uv run pytest
ruff check .
ruff format --check .
uv run pyright
Use nix run .#docs-dev for the documentation site and
nix run .#docs-check to validate it.
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 workfold-0.1.0a2.tar.gz.
File metadata
- Download URL: workfold-0.1.0a2.tar.gz
- Upload date:
- Size: 167.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5c0cd62127a84c9292a989f526714bdc116fed01434eefd2891360a9f7372b83
|
|
| MD5 |
d3b287828ddb73d09b0962a04ce6e804
|
|
| BLAKE2b-256 |
56cb6252cadacf448cab41fa5d22eac6003aaf00f2880edd6c44340bce4cfba4
|
Provenance
The following attestation bundles were made for workfold-0.1.0a2.tar.gz:
Publisher:
release.yml on janthmueller/workfold
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
workfold-0.1.0a2.tar.gz -
Subject digest:
5c0cd62127a84c9292a989f526714bdc116fed01434eefd2891360a9f7372b83 - Sigstore transparency entry: 2413202112
- Sigstore integration time:
-
Permalink:
janthmueller/workfold@2e4fdcce0ae5029dcadb0577c2d2ad91057a369f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/janthmueller
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@2e4fdcce0ae5029dcadb0577c2d2ad91057a369f -
Trigger Event:
workflow_run
-
Statement type:
File details
Details for the file workfold-0.1.0a2-py3-none-any.whl.
File metadata
- Download URL: workfold-0.1.0a2-py3-none-any.whl
- Upload date:
- Size: 143.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
551fad265636625f92c7a47ca4cc468618714e0f75fcb6d06560097f28e636e5
|
|
| MD5 |
f3dd090d9aed68a111927aebd72db85c
|
|
| BLAKE2b-256 |
4b8d22bd143254b203c69f06b96a2259ac1fbc8d10680e2c14c076debba6a1c9
|
Provenance
The following attestation bundles were made for workfold-0.1.0a2-py3-none-any.whl:
Publisher:
release.yml on janthmueller/workfold
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
workfold-0.1.0a2-py3-none-any.whl -
Subject digest:
551fad265636625f92c7a47ca4cc468618714e0f75fcb6d06560097f28e636e5 - Sigstore transparency entry: 2413202141
- Sigstore integration time:
-
Permalink:
janthmueller/workfold@2e4fdcce0ae5029dcadb0577c2d2ad91057a369f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/janthmueller
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@2e4fdcce0ae5029dcadb0577c2d2ad91057a369f -
Trigger Event:
workflow_run
-
Statement type: