The counting was never the slow part
Plating is patient work. You do the serial dilutions, you plate, you wait overnight, and the next morning you sit down with a marker and a plate and count. That part I don't mind — it's the closest thing microbiology has to meditation.
What I minded was the twenty minutes afterwards. Colonies times the dilution, divided by the volume plated, once per plate, for however many samples the experiment had. Then the same numbers again into a spreadsheet so they'd survive past the notebook page. It is arithmetic a calculator can do and a tired person can get wrong, and the failure mode is quiet: a number that is off by a factor of ten still looks like a perfectly reasonable bacterial density.
The specific thing I kept getting wrong was the volume. You pipette in microlitres and you report per millilitre, so every single row carries a divide-by-a-thousand that has nothing to do with the biology. Miss it once and the result is wrong by three orders of magnitude — and it will not look wrong.
An error of 10× in a CFU count doesn't look like an error. It looks like a result.
So this is a deliberately small tool. Type the counts, read the answer. The interesting decisions were all about refusing to produce a confident-looking number when the data doesn't support one: a plate with no colonies reports a detection limit rather than a zero; counts outside the countable window get flagged rather than quietly averaged; an uncountable plate can be marked as such and the summary then admits it counted two of three replicates instead of pretending n was two all along.
It deliberately stops there. It does not plot, and it does not do statistics beyond mean, SD and CV. That work already has a home in CFU Plot Studio, which takes replicate-level counts and produces publication-ready figures with log10 statistics and significance annotations. This tool is the step before: the bench arithmetic that turns a morning of counting into the tidy table those figures are built from. The Excel export is shaped to be that table.
I'll be straight about how it got built, as I have been about the others: the science and the design judgements are mine — what to compute, when to refuse to compute it, why a zero is a detection limit and not a data point. The engineering I did alongside Claude. I'm a scientist who has gotten good at building tools with AI, not a career software engineer, and I would rather say that plainly than imply a dependency-free spreadsheet writer materialised on its own. The next section is about a bug that came out of exactly that collaboration, and what it taught me.