Skip to main content

daily-worklog

A plain-markdown, git-backed engineering log. One note per day is the only thing you write; every cadence (standup, sprint review, retro, annual review, CV) is a read over that same stream. No app required - grep, git, and one small Python CLI (note).

Layout

This repo is the app; your notes live in a separate folder (the root, ~/worklog by default):

~/worklog/
├── daily/
│   └── YYYY-MM-DD.md     # your daily notes
├── weekly/
│   └── YYYY-Www.md       # auto-generated sprint/week rollups
├── retro/
│   └── YYYY-Www.md       # auto-generated standalone retro docs
└── highlights/
    └── YYYY[-Qn|-Hn].md  # auto-generated wins per period → feeds review + CV
daily-worklog/            # this repo
├── src/worklog/
│   ├── cli.py            # commands
│   ├── core.py           # logic
│   └── _TEMPLATE.md      # per-day template for new notes
└── tests/

The one rule

Capture at the daily grain, roll up. Don't keep separate notes per ceremony — you'll reconstruct from memory and lose to recency bias. Two habits make the whole thing pay off:

  • Separate facts from friction. ## Done/## Wins answer what shipped (standup, review, highlights). ## Friction answers how the work went (retro). Logging friction in the moment is what makes retros concrete instead of vibes.
  • Log impact, not activity. Not "refactored the scheduling API" but "collapsed the SSE ack/PATCH round-trip, removing a class of idempotency bugs." Capture the number/consequence and a PR/ticket link now — you won't recall it in eleven months.

How each section feeds each cadence

Section Standup Sprint review Retro Review / CV
## Done ● ●
## Blockers ● ●
## Wins ● ●
## Friction ●

## Wins lines carry [impact:: …] [proof:: …] #win. At review time you don't reconstruct the year from memory: note highlights collects every win of the period, grouped by month, and that file is your self-review draft. So write each win the way you'd want to read it then — outcome + number + scope, never "worked on X" — and when you learn the metric later (incident count avoided, latency delta, review-cycle time), add it to the original line in that day's note.

Install

Requires uv.

uv tool install daily-worklog # puts `note` on your PATH; -e picks up code edits live
note init                     # asks where to keep notes [~/worklog]
                              # (or: note init --worklog-path ~/somewhere/else)

note init creates daily/ (never touching existing files) and records the root in ~/.config/worklog/config.toml ($XDG_CONFIG_HOME is honoured):

root = "/home/you/worklog"

Root lookup: $WORKLOG_ROOT → root in the config file → ~/worklog. If that folder doesn't exist, note exits with an error asking you to run note init; it never writes anywhere else. python -m worklog works too.

New notes are created from the template bundled with the app (src/worklog/_TEMPLATE.md); it isn't customisable per root yet. Appending to a section today's note doesn't have (e.g. you deleted the heading) is an error.

Usage

note                  # create + open today's note ($EDITOR, default vi)
note done    "text"   # append under ## Done
note win     "text"   # append under ## Wins     (tags #win)
note improve "text"   # append under ## Friction (tags #friction); alias: friction
note well    "text"   # append under ## Retro    (tags #well)
note try     "text"   # append under ## Retro    (tags #try)
note blocker "text"   # append under ## Blockers
note plan    "text"   # append under ## Plan
note jot     "text"   # append under ## Notes
note week             # build this ISO week's rollup + retro agenda (weekly/)
note retro            # build this ISO week's standalone retro doc (retro/)
note highlights [P]   # collect wins for period P, by month (highlights/)
                      #   P = YYYY | YYYY-Qn | YYYY-Hn, default: this year
note init             # create a root and record it in the config file
                      #   (--worklog-path PATH skips the prompt)
note help             # list commands (same as --help)

Append commands never open an editor and add the tag for you — don't type it. Quotes are optional, and text may start with - (note win -50% p99 latency).

If the rollup already exists, note week / note retro / note highlights rebuild it in memory and compare: unchanged → it just opens; changed → it prints a diff and asks overwrite? [y/N] (any hand edits show up as removed lines). Answering no — or running without a terminal — keeps the existing file. --force / -f overwrites without asking.

Daily ritual: note, fill ## Done first thing (yesterday's, for standup), top up ## Wins/## Friction as the day goes. End of sprint: note week and skim. Review time: note highlights 2026 (or 2026-H2, …). Put the root under git and commit on whatever cadence suits you — it's just text, so git is your full history and backup.

Pure-grep alternatives (no script needed)

rg '#win'      daily/                # every win, ever
rg '#friction' daily/ -A0            # retro fuel
rg '\[impact::' daily/               # everything with a measured outcome

Development

Check Taskfile.yml for dev tasks.

TODO

Deferred ideas, not yet planned:

  • Custom daily template: let <root>/daily/_TEMPLATE.md override the bundled one (today the bundled template is always used).
  • Auto-format notes: tidy a note after each append / editor session: trailing whitespace, extra blank lines, */+ bullets → -. A full formatter (mdformat needs mdformat-frontmatter) is the heavier option. Editor sessions need a blocking $EDITOR (e.g. code --wait).

Metadata

Release files for daily-worklog 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for daily-worklog 0.1.0
File Size Uploaded Provenance
daily_worklog-0.1.0.tar.gz 9.7 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for daily-worklog 0.1.0
File Interpreter ABI Platform
daily_worklog-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 20.4 kB

Release files / daily_worklog-0.1.0.tar.gz

Download URL daily_worklog-0.1.0.tar.gz
Size 9.7 kB
Tags Source
SHA-256 checksum
How to use checksums
7f08c92eb225d3d580630c27d17c1f8a9fb0c353a2fbcf54946ab10e9d6f5ac8
BLAKE2b-256 checksum
How to use checksums
b8f8ac20b94c1497c6eec4f498cc0cd60f8b3604a41cbc9fac7605dd02272fae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / daily_worklog-0.1.0-py3-none-any.whl

Download URL daily_worklog-0.1.0-py3-none-any.whl
Size 10.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6aa6e69c276a8f1070853872ff23f9d2dc28037f5a6afe56290f1db5aa2845cd
BLAKE2b-256 checksum
How to use checksums
50e5c72da0c93b11a9ca91278d88a7a220e3eec11af1c37608d64700a9ee66ff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for daily-worklog 0.1.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.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

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