macOS desktop widget
Everything you got done today: your AI coding sessions, the sites and docs you worked in, the commits you shipped. Grouped and copy-paste ready for a standup, timesheet, or task sheet. It rebuilds itself from files already on your Mac.
How it works
Nothing is uploaded and nothing is indexed in advance. On a timer, the parser re-reads files that already exist on your disk and rewrites the receipt.
Where it pulls from
Each line is the work done: the AI-generated session title from Claude Code or Codex, a clean one-liner. The receipt itself never prints your raw prompts.
Your coding sessions, grouped per project, read from their local JSONL transcripts.
Commits and PRs, read from repos in your work folders.
Decks, docs, sheets and PDFs you created or edited in your work folders.
The sites you spent time on, read from Chrome, Brave or Safari history.
Where the hours actually went, read from local app-usage.
Add a project name to exclude.txt and it never reaches the receipt.
Only the cream paper shows on your wallpaper. Drag it by the masthead; it floats over full-screen apps, prints down when opened and rolls up when closed.
Sample data. EOD builds these from your own activity, on your Mac.
Features
Rolls over at midnight and refreshes through the day, from your local activity.
Sessions, commits, documents, browsing and screen time on one receipt.
The recap is one keystroke away from the menu bar.
Straight to the clipboard, already formatted for a standup or a sheet.
Fix, add or delete a line before you copy. On the weekly recap your hand-edits survive a re-summarize unless you force one.
Step back through the week when you are back-filling a timesheet.
Privacy
EOD reads local files and writes a receipt to its own cache/ folder.
There are no API keys and no telemetry.
The one exception is the optional AI-polish step.
If your claude CLI is logged in, EOD asks it to rewrite the day into
crisper, manager-ready bullets. That goes through your existing CLI login, not an
API key. Missing CLI? It falls back to fully-offline cleanup. This is the one path
that crosses the boundary in the diagram above.
Worth being specific, because "local-first" is easy to claim and hard to check. Nothing else in EOD leaves your Mac.
exclude.txt. Personal browsing: job
boards, shopping, social. Mail, chat and calendar hosts. The names of people you
met or worked with. File contents. Screen-time data.
Other people never agreed to this, so their names stay on your machine.python3 extract.py --show-polish-payload prints the exact text and
sends nothing. touch polish.off disables the step permanently.
It is your own Claude account through your own CLI login, not a third party.Install
Install Hammerspoon, the free automation app that hosts the widget, and grant it Accessibility when it asks.
Don't already use Hammerspoon? Drop EOD straight into its config.
mkdir -p ~/.hammerspoon && cp -R ./* ~/.hammerspoon/
Open Hammerspoon, then Reload Config (⌥⌃⌘R).
The receipt prints down in the top-right.
Already have an init.lua? Don't overwrite it. See
INSTALL.md
for the two lines to add instead.
extract.py. Check with python3 --version.
Looked up in /opt/homebrew/bin, /usr/local/bin, /usr/bin.Controls