Hello, world

I have spent the last two years training models on security data — network captures from medical devices, phishing URLs, documents fed into a retrieval system. Most of what I learned in that time never made it out of a notebook or a thesis draft. This site is where I fix that.

What goes here

Three kinds of posts, roughly:

  • Working notes. The thing I tried, the number it produced, and whether I believed the number. Failed experiments count — they are usually the more useful half.
  • Explanations. Methods I had to read three papers to understand, written the way I wish someone had written them for me.
  • Build logs. Shipping a RAG platform to production taught me more about retrieval than any benchmark did. That kind of thing.

What will not be here: tutorials rewritten from documentation, or benchmark numbers without the setup that produced them.

On numbers

Every accuracy figure I publish comes with the dataset, the split, and the class balance. This matters more in security than almost anywhere else, because the interesting class is always the rare one:

# An "accurate" model on a realistic intrusion dataset.
attacks = 1_000
benign  = 99_000

predict_benign_always = benign / (benign + attacks)
print(f"{predict_benign_always:.3f}")  # 0.990 — and it catches nothing

Ninety-nine percent accuracy, zero detections. So when I write down 0.97, I will also write down what it was measured against, and what it looked like on the minority class.

Elsewhere

The code behind most of what I write about is on GitHub. If something here is wrong or unclear, my inbox is open — the address is on the about page.