All of this started with a book. Martin Kleppmann's Designing Data-Intensive Applications is what sent me down the collaborative-editing rabbit hole in the first place, and the last thing I wrote here, a rich-text CRDT, came straight out of that. While I was buried in it, Kleppmann's name kept surfacing, and so did his projects. One of them was Automerge, a serious CRDT library, "PostgreSQL for your local-first app," with a Rust core wrapped for JavaScript and C and maintained out of Ink & Switch.

After spending weeks taking so much from this corner of computing, I wanted to put a little something back. So I read the contributing notes and the open issues, looking for the future-work list. Most of it was deep core work, no place for a newcomer's first move. But tucked away was a friendlier item: a list of command-line tools the project knows it's missing, sitting in an IDEAS.md file for years. I picked the one that mapped most cleanly onto machinery that already existed: fork.

It's a small contribution and I'd rather say that plainly than dress it up. fork takes a document and a change hash and gives you a new document as it existed at that point in history. The core library already does the hard part, the CLI just didn't expose it, so the work was careful plumbing: read from a file or standard input, write to a file or standard output, fail with a clear message on a hash that doesn't exist. While I was in there I deleted a piece of dead code that referenced an internal API removed long ago, which let me drop two unused dependencies too. The patch adds a feature and removes more lines than it adds, which is my favourite shape for a change.

I held it to the same discipline as the last project even though it's a fraction of the size, because that's the whole point of building this way: clean baseline first, integration tests that drive the real binary, the formatter and linter the project's own CI runs, three commits each explaining why rather than what. The pull request is open, and now I wait, since a first-time contributor's PR sits behind a manual approval before the tests even run.

There's a neat symmetry to it. A database textbook sent me down a rabbit hole that ended with me reinventing one of its author's algorithms by accident, and the same rabbit hole has now ended with me opening a pull request against another of his projects, on purpose this time.

And on the off chance the man himself ever wanders onto this little corner of the internet and reads this: Martin, your book is genuinely the reason any of this happened, your algorithm beat me to the punch by a year, and the very least you can do to make it up to me is go click "approve" on PR #1405 so I can officially put "contributed to Automerge" on the internet and stop refreshing the page. It removes more lines than it adds. It's basically a gift.