I shipped a small daemon this weekend, and the hardest part wasn't writing it. It was stopping. Go makes it almost too easy to keep going, because once you've got a clean little binary that does one job, every adjacent job starts whispering that it could live in there too.
The daemon's job is to poll an HTTP endpoint on a schedule, compare the response to the last one it saw, and fire a notification when it changes. That's it. Roughly seventy lines, one goroutine, a time.Ticker, and a tiny bit of state on disk so it survives restarts. It builds to a single static binary, runs under systemd, and uses about four megabytes of memory sitting idle.
While I was writing it I caught myself reaching for the obvious extensions. A config file format. Multiple endpoints. A small web UI to see the history. Pluggable notification backends. Each one was reasonable, and together they'd have turned a weekend job into a project I'd still be polishing at Christmas. So I wrote the URL as a command-line flag, the notification target as another flag, and called it done.
The test of a tool like this is whether you can forget about it. A fortnight from now I want to not remember it exists, until the one day it pings me because the thing it watches actually changed. A version with a config file and a UI would demand attention, want upgrades, accumulate edge cases. The seventy-line version just runs. Small and finished beats big and ongoing, at least for the boring infrastructure nobody's paying me to love.