This release is a pre-release and may not be stable for production use.
Workfold
Workfold is a private, local CLI that folds timestamped activity from Git and filesystem metadata onto one representative Monday-to-Sunday week. It makes the shape of recorded activity easy to scan and marks events outside a configured working schedule without pretending to measure hours worked.
Time Mon Tue Wed Thu Fri Sat Sun
07:48–08:12 ○●■ ●
⋮ 1h 8m
09:20–09:29 ■●
Terminal output starts directly with this matrix, followed by a content-aware
symbol key and three direct statistic rows: total events, the inside/outside
schedule split, and the weekday/weekend calendar split. There is no summary
heading. The key has no heading and names only categories actually
visible in the matrix; its ×N explanation appears only when a cell uses exact
count notation. The configured working hours follow on their own left-aligned
line. Schedule and calendar percentages each use the total event count as their
denominator; weekend activity may also be outside the configured schedule. A
normal complete run stops there.
--verbose adds scope, period, the full successful coverage status, operational
metadata, and the detailed coverage ledger. Use --coverage when the ledger is
wanted without those verbose details. Partial collection, explicit narrowing,
unsupported capabilities, and nonzero display cropping remain visible by
default as exception notices; compact output never hides those limitations.
Each ordinary symbol is one activity marker. Circles are Git and squares are
filesystem evidence; filled shapes are inside working hours and hollow red
shapes are outside. Git-inside markers are green and filesystem-inside markers
are blue. Shapes preserve the same meaning with --no-color. Rows are greedy,
globally aligned time clusters (one hour by default), so empty time disappears
without losing the order expressed by the labels.
Status
Workfold is an alpha, terminal-only CLI with its sparse terminal renderer and
local collection pipeline implemented end to end. Git commits, per-file
changes, annotated tags, local
reflogs, filesystem metadata, combined-source views, the full profile, strict
coverage accounting, and outside-event listing share the same normalized
pipeline.
The documentation covers CLI usage,
accuracy, and development. The Astro site in docs/ documents the terminal
product; it is not an HTML reporting feature.
Install
Workfold requires Python 3.10 or newer. Git collection uses the installed
git executable and never contacts a remote.
Install Workfold from PyPI:
pip install workfold
workfold --help
For an isolated CLI environment, uv tool install workfold and
pipx install workfold are supported alternatives. Standalone archives for
supported platforms are attached to
GitHub releases.
Quick Git view
Run inside a repository to fold the current ISO week's author timestamps from commits reachable through all local refs:
workfold
This uses the default selectors -t this-week -m git -p standard.
-t/--time also accepts an ISO week, repeated ISO weeks, an inclusive
DATE..DATE range with either endpoint open, or all. -m/--mode accepts
git, fs, or all; changing time never changes mode and vice versa.
Common selections include:
workfold . -t 2026-W31
workfold . -t 2026-W30 -t 2026-W31
workfold . -t 2026-07-01..2026-07-31
workfold . -t 2026-01-01..
workfold . -t all -m git --git-commit-times author,committer --coverage
workfold . --hours 'Mo-Thu 08:00-16:30; Fr 08:00-14:00'
workfold . --cluster-window 30s
workfold . --cluster-window 10m
workfold . --cluster-window 1h5m
workfold . --cluster-window '1h 5m'
workfold . --timezone Europe/Berlin --list-outside --limit 50
Chart band labels always use HH:MM, even for second-level cluster windows and
events. Exact seconds and nanoseconds remain in normalized provenance and the
outside-hours event list.
For portable Git-object evidence across all available history, use:
workfold . -t all -m git -p portable
The portable profile includes commit author and committer timestamps plus annotated-tag tagger timestamps. It does not use filesystem metadata or local reflogs, contact a remote, or claim to show when an object was published remotely.
The exhaustive local command is:
workfold . -t all -m all -p full
-p/--profile defaults to standard. The full profile broadens timestamp
and record collection only inside the selected time and mode. It never changes
either selector. With -m all, it requests all
supported Git and filesystem evidence, ignored entries, and all local refs. It
changes collection scope only: detailed ledger output still requires
--coverage or --verbose. It does not parse date-like text inside files.
Accuracy and privacy
A Workfold event is a discrete timestamp observation, not a work session. Git
file changes are derived from first-parent tree differences, not stored human
actions. Commits can be rewritten; annotated tags have independent tagger dates
while lightweight tags do not; and reflogs can expire. Filesystem metadata is a
mutable current snapshot: Linux birth time is collected through statx when
the filesystem returns it, birth time remains platform-dependent elsewhere,
ctime is metadata-change time, and atime may be unreliable. Workfold cannot
recover unsaved edit sessions, deleted untracked files, or earlier metadata
values.
Collection remains local. No Git hosting API, telemetry service, web server, or network collector is part of the MVP. Coverage reports account for captured, filtered, unavailable, unsupported, and unreadable timestamps within the exact requested scope instead of claiming unqualified completeness.
Development
The project intentionally uses a flat Python package: the implementation is in
workfold/, with no src/ wrapper.
nix develop
uv sync --extra dev
uv run pytest
ruff check .
ruff format --check .
uv run pyright
uv run workfold --help
Build the Python distributions and validate the Astro documentation with:
uv build
nix run .#docs-check
nix run .#docs-build
Start the documentation site locally with nix run .#docs-dev.
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.0a1.tar.gz.
File metadata
- Download URL: workfold-0.1.0a1.tar.gz
- Upload date:
- Size: 137.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 |
6a6b4ca126195a0f9af5480974feee167fb65d27e44b9add82cbd66e9692086d
|
|
| MD5 |
06c838777fa9f022e64daf61d75581d8
|
|
| BLAKE2b-256 |
c6fb3f3df15262466fe90a4902af6775e4b2a78fe0d4911fbd3988b967c9995d
|
Provenance
The following attestation bundles were made for workfold-0.1.0a1.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.0a1.tar.gz -
Subject digest:
6a6b4ca126195a0f9af5480974feee167fb65d27e44b9add82cbd66e9692086d - Sigstore transparency entry: 2399007874
- Sigstore integration time:
-
Permalink:
janthmueller/workfold@7a5362edd7a49e369c7f899704a608e1b4137883 -
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@7a5362edd7a49e369c7f899704a608e1b4137883 -
Trigger Event:
workflow_run
-
Statement type:
File details
Details for the file workfold-0.1.0a1-py3-none-any.whl.
File metadata
- Download URL: workfold-0.1.0a1-py3-none-any.whl
- Upload date:
- Size: 100.5 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 |
3c387540775076c57c5451e449460429324a0952152196774b220e9f1f886fd0
|
|
| MD5 |
c85eac31d6e73e77e26f64471b99e0ea
|
|
| BLAKE2b-256 |
59c30781efbd61d02844e41a7637965c6dc27d45896f30ab69f936c74b139380
|
Provenance
The following attestation bundles were made for workfold-0.1.0a1-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.0a1-py3-none-any.whl -
Subject digest:
3c387540775076c57c5451e449460429324a0952152196774b220e9f1f886fd0 - Sigstore transparency entry: 2399007961
- Sigstore integration time:
-
Permalink:
janthmueller/workfold@7a5362edd7a49e369c7f899704a608e1b4137883 -
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@7a5362edd7a49e369c7f899704a608e1b4137883 -
Trigger Event:
workflow_run
-
Statement type: