Critter Cam

Publishing it is shipping

Putting the backyard code on GitHub meant taking my own name out of it first, and my first attempt at that looked like it had worked and hadn't. Force-pushing a rewritten history does not clear the refs GitHub keeps from old pull requests.

The Backyard and Observatory's visit log: a grid of twelve cards from one night and morning, each with a blurry camera still, a species name, a time, and a count of observations. American crows, band-tailed pigeons, an eastern gray squirrel, Steller's jays, two raccoons and a Virginia opossum.

To me publishing is what shipping means, so I put the backyard code on GitHub at the end of July. I wanted the thing available to anybody who is interested in it, and this has been such an enriching project on so many levels that I had to share it.

The work of doing that was not writing a README. It was taking myself out of it.

The code assumed the yard was my yard and the machine was my machine. Hard-coded paths. My email in a config. My own name sitting in the data, because the classifier occasionally decides I am a species.

Learning through messing up

I rewrote the git history to pull the personal stuff out, force-pushed it, and it looked like it had worked. Narrator: “It didn’t.”

GitHub keeps the refs from old pull requests, and a force-push does not touch them. The scrubbed content was still sitting there, still being served to anyone who knew where to look. From the front the repository looked clean.

Fixing it took a second rewrite and a brand new repository. The old one is renamed and private and it is staying that way.

It’s not like there were API keys or anything with teeth on it - it was an email address and a couple of personal identifiers. But I thought I had cleaned it, and I had not - an important lesson.

The rest of the scrub

Every model file is pinned by its SHA-256 now, so somebody cloning it gets the same model I have rather than whatever is being served that week. Claude did most of that work and it is the kind of thing I would not have thought to do.

I also put together a making-of site - “Behind the Glass”. The goal is to be a walkthrough with demos running on a frozen slice of the real database: scrub a capture through the pipeline, look at a map of the actual embeddings, play a guess-the-raccoon game against the model. No camera, no GPU, nothing to install. It is what I send people who ask how it works.

Where it stands

Public, AGPL, 874 tests.

Zero stars. I have not told anybody about it, which I suppose I am doing now.

Read “Behind the Glass”, the full making-of ↗

The code is on GitHub ↗


all Critter Cam updates