Notes / 2026.05.04

I Wrote a Tool to Find My Own Drudgery

A local watchman that finds the chores hiding in your agent and shell history.

Watercolor of a person at a window with coffee, looking out at mountains at sunset

There’s a gap in what I optimize as a software engineer.

I pay attention to algorithms. I pay attention to implementation. I pay attention to design. All the things inside the software get scrutiny. What slips past me is the way I interact with software — the Claude sessions, the command-line tools I’m using over the course of a day.

Sometimes I catch it. “Okay, I’m re-running this sequence of commands over and over again. This should be automated and wrapped into a script.” Good. I write the script.

Sometimes I don’t notice. I’ll copy-paste prompts and blocks of text from one Claude session to another, day after day, and never stop to think that this could be automated too.

So I wrote undrudge: a small background watchman that reads my Claude session logs and my shell history (via atuin), looks for things that smell like muscle memory, and writes me recommendations to read at my leisure.

It’s not a daemon. It’s three cron jobs, one SQLite file, markdown out. Once an hour it ingests new activity. Once a day it asks claude -p “what did I do repeatedly that a script could have done?” and drops the answers as markdown files into ~/.local/share/undrudge/recommendations/. Once a week it goes meta and looks for patterns across the patterns.

A typical recommendation reads like this:

Wrap repeated find/xargs grep into a slash command You ran the same find . -name '*.py' | xargs grep ... skeleton 7 times across 3 sessions this week.

Some are obvious in hindsight, which is the point. The tool exists because I’m bad at noticing my own drudgery in real time, and a thing that surfaces it once a day with concrete evidence (“you did this 7 times in 3 sessions”) is roughly the right amount of nag.

Privacy was the part I had to take seriously. The watcher sees my real shell history and my real Claude conversations, including whatever tokens, keys, or secrets I’d been careless enough to paste. Sanitization runs at ingest, before anything reaches SQLite: pattern matching for the usual suspects, path exclusion for .env / .pem / id_rsa*, Shannon-entropy detection for random-looking strings the patterns miss, contextual suppression near phrases like “here’s the token.” There’s a parametrized test that plants every secret type into a fixture and asserts none of them survive. CI fails loud if anything leaks.

A small thing I enjoyed: the dev-helper scripts inside the repo (dev-test.sh, dev-fresh.sh) started life as recommendations undrudge made about its own development workflow on the first few dogfood runs. The loop closes.

Open source, MIT licensed, free to use. Python 3.12+, uv, atuin, and a Claude CLI on your PATH. macOS users: cron silently fails to read your atuin DB unless you grant /usr/sbin/cron Full Disk Access, so the repo ships launchd templates for the cleaner path.

The name says what it does. Drudgery is the stuff you do without thinking — small, repetitive, friction that adds up. Undrudging is the act of noticing it and getting rid of it. The hard part was never the getting rid of. The hard part is the noticing. Now I have something that does the noticing for me.

(Funny aside: when I was picking the name, I asked Claude what it thought, and Claude advised against Undrudge. Too Dickensian, apparently.)