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 2w3d # rolling elapsed window
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 both -p full # exhaustive local view
workfold . --git-identity jan@example.com # only that recorded Git identity
workfold . --marker-style identity # identity codes instead of circles
workfold . --timezone Europe/Berlin
workfold . --hours 'Mo-Thu 08:00-16:30; Fr 08:00-14:00'
workfold . --hours all # classify every time as working time
workfold . --cluster-anchor midnight # fixed clock-aligned intervals
workfold . --cluster-anchor midnight --show-empty-bands # include empty fixed intervals
workfold . --band-label start # show one time per occupied row
workfold . -E all # keep only occupied day columns
workfold . -E weekend # remove empty weekend columns
workfold . -H weekend # always hide weekend columns
workfold . --grid vertical # add column separators
workfold . --list-outside --limit 50
The three main selectors control separate parts of the request:
| Selector | Purpose | Values |
|---|---|---|
-t, --time |
Date scope | this-week, 2w3d, YYYY-Www, DATE..DATE, all |
-m, --mode |
Evidence source | git, fs, both |
-p, --profile |
Evidence preset | standard, portable, full |
Time and mode independently choose when and where to collect. A profile chooses
which evidence kinds to use inside that request and never changes time or mode;
the portable preset is intentionally available only with Git mode.
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 both.
Use --cluster-window 10m, --cluster-window 1h5m, or another duration to tune
row clustering. The default --cluster-anchor event starts a band at each
earliest unassigned event; midnight uses fixed whole-minute intervals from
local 00:00 so their HH:MM boundaries remain exact. Second-based windows
remain available with event anchoring. Independently,
--band-label range|start selects an observed/fixed range label or only its
starting minute. --show-empty-bands with midnight anchoring renders every
fixed interval intersecting the display range; automatic ranges expand to full
fixed bands. An explicitly cropped partial edge always shows its exact range,
even with --band-label start. Without dense output, empty time stays compressed.
Color is automatic by default. Use --no-color or the standard NO_COLOR
environment variable for colorless output. --color restores automatic color
when a configuration file sets no-color = true.
Configuration
Put personal defaults in the platform configuration directory, or project
defaults in workfold.toml:
timezone = "Europe/Berlin"
hours = "Mo-Thu 08:00-16:30; Fr 08:00-14:00"
mode = "git"
profile = "portable"
cluster-anchor = "midnight"
band-label = "start"
show-empty-bands = true
grid = "vertical"
hide-empty-days = ["weekend"]
Python projects may use [tool.workfold] in pyproject.toml instead. Values
resolve as built-in → global → nearest project → CLI. Inspect the result and
each value's origin without collecting timestamps:
workfold . --show-config
Use --config FILE for one exact file or --no-config for built-ins plus CLI
only. The usage guide
documents locations, discovery, merging, and every supported key.
Reading the chart
- Circles are Git events; squares are filesystem events.
--marker-style identityreplaces Git circles with mapped codes such asJor the collision-safeJ1,J2, andJ3.- Green and blue are inside the configured schedule; red is outside.
- Filled/uppercase markers are inside; hollow/lowercase markers are outside.
- The key maps each visible identity/source once and adds an outside-hours cue only when needed.
- One symbol is one event. Busy cells use exact
×Ncounts. - Empty time is omitted. A
⋮row reports a compressed gap once it reaches the configured cluster window. - Event-anchored rows are compact around observations; midnight-anchored rows use predictable clock boundaries. Labels are independently configurable.
- Day-column hiding changes only the matrix; totals continue to cover every selected event.
--grid vertical|horizontal|bothadds optional internal chart lines; the uncluttered default isnone.
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 reports unavailable, unsupported, and unreadable evidence that can prevent a complete answer. Known timestamps outside the requested time or identity scope are not counted as coverage outcomes.
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. The
architecture guide
documents the package boundaries, dependency rules, data pipeline, and test
layout.
Metadata
Release files for workfold 0.1.0a4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| workfold-0.1.0a4.tar.gz | 273.0 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| workfold-0.1.0a4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 495.7 kB
Release files / workfold-0.1.0a4.tar.gz
| Download URL | workfold-0.1.0a4.tar.gz |
|---|---|
| Size | 273.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
923a922255248ed952c35616b6add0593e54df302897956f768555a6b95d59e8
|
|
BLAKE2b-256 checksum How to use checksums |
4d5eeb54e05f85344e4724d7c194f0a0e54383cf1fcc1047cb3a05cc1976aa92
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.
Transparency logRelease files / workfold-0.1.0a4-py3-none-any.whl
| Download URL | workfold-0.1.0a4-py3-none-any.whl |
|---|---|
| Size | 222.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2f33c63b57de72f2a173b97c12aa9f43171ea8c993e8fd59a235ae90496fb280
|
|
BLAKE2b-256 checksum How to use checksums |
f1fb7c5acc32dc1e97b8764b9d7b80513c007bae073285402a204bc213592e89
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.
Transparency logSecurity for workfold 0.1.0a4
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for workfold-0.1.0a4.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.
Transparency logA 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.