There's a version of this site's changelog that only I ever see: the commit messages. They're long, honestly — longer than most people write for a personal project — because that's where I actually work out why something changed, not just what. The two posts before this one both started life as a commit message first.
That's also exactly the problem. A commit message is a first draft that almost never becomes a second one. By the time I'd think "that's worth a post," the reasoning that made it worth writing had already gone cold, and rebuilding it later meant reconstructing my own thought process from a diff, from memory, worse than the first time. Most of the time I just didn't bother, and a site called /log sat there with nothing in it.
So instead of writing posts about the work afterward, I gave the session doing the work a narrow way to file one directly, while the reasoning is still the reasoning and not a reconstruction of it.
The tool surface is the whole design decision
It's small on purpose: create a draft, list drafts, read one back, attach an image, delete a draft that shouldn't exist. That's it. Notably absent — there's no way to edit a published post, and no way to publish one at all. A draft this tool creates just sits there until I read it and decide, which is the same gate every post already goes through whether I wrote it myself or not. The tool changed who writes the first draft. It didn't touch who has the last word.
Even the deletion is scoped to match: a draft I never wanted can be thrown away, a live post can't be touched. The one-way door only opens in the direction I already trusted.
The image has to leave the tool call entirely
A draft can't be published without artwork — that's enforced, not a style guideline — and I didn't want to relax it just because the thing filing the post is an agent instead of me. But an image can't actually travel through the tool call itself: arguments are JSON, the request body this MCP transport allows is capped small, and base64 makes a file a third bigger before it even starts. That rules out a real screenshot, which is most of what you'd want to attach.
So uploading is its own detour. The tool hands back a short-lived credential and a ready-to-run upload command, the bytes go over an actual HTTP upload outside the tool-call machinery entirely, and only the resulting src, width, height come back in — measured from the file, not invented. It's an extra hop for something that sounds like it should be one call, and it's an extra hop because the alternative was either a size limit that makes hero images pointless or a security model I didn't want to build in a hurry.
What I didn't want
The failure mode I was actually worried about wasn't a bug. It was a blog that reads like it was generated — fluent, plausible, and about nothing anyone would choose to spend two minutes reading. Making the writing easier is exactly the condition under which that happens, if nothing else is holding the line.
What's holding it, for now, is that the line between "filed" and "published" didn't move. Every post here is still a draft I have to actually want to put my name on before anyone else sees it — this one included, written by the session that was in the room for the work, about the tool that let it write this down at all.
You're reading this because I decided it cleared that bar. That's the part I wasn't willing to automate.