← All posts

Security

Aug 19, 2026
August 19 - making the clean version of a repository the only version that can be pushed
Six of my repositories had gone public straight from their working trees, carrying internal names, addresses, paths and real personal data in test fixtures. Rewriting files does not purge history, so every repo was deleted and recreated from a sanitized single-commit snapshot, and the publishing pipeline was folded into the nightly pusher with a fail-closed gate that is deliberately allowed to tolerate two things.
Aug 11, 2026
August 11 - the "are you sure" flag that turned out to be the only lock on the door
While reading my dashboard's code as a precedent for something else, a note that said 'stale comments' turned into a live path where anyone on my home network could launch an AI worker with tool auto-approval. Fixed at two layers, then the fix locked me out, which was its own lesson.
Aug 8, 2026
August 8 - deciding which of my own records the search index is allowed to believe
Two passes over the memory layer my AI tools search. First, an audit of how eight knowledge bases preserve working transcripts, which ended with part of the index quarantined and a refusal to backfill history. Then importing 708 conversations from a cloud account into that same layer without publishing things to myself that should stay private.
Aug 7, 2026
August 7 - the sync that would have copied a live login onto every machine I own
Porting a working file-sync pattern from one project to another would have replicated a 188 MB authenticated browser session and a secrets file across the whole machine mesh, because the sync tool does not read the ignore file that version control does. Three options, one structural fix, verified by hashes and an absence check.
Aug 6, 2026
August 6 - the migration that stopped being a migration and became a retirement
What started as moving two small apps to the control-plane machine became the complete retirement of a third machine as an application host. Dependency mapping first, an explicit 'park that one' that evidence later overturned, a symlink instead of rewriting a hundred thousand paths, 51 GB reclaimed, and two live credentials caught before they replicated.
Aug 3, 2026
August 3 - restoring a backup I had never actually restored
I had encrypted backups of my private records and had never once put one back. Proving it worked also revealed that the older archive contained nothing at all.
Jul 31, 2026
July 31 - the secret scrubber that scrubbed everything except the secrets
Three live API keys had made it into the searchable index of my own working history, straight through a redaction step that ran on every byte. The fix was small; deciding how to measure it before trusting it was the real work.
Jul 29, 2026
July 29 - a freshness guard proven against the real defect, and three ways in with everything else a 403
Two passes in a row had shipped the wrong artifact one layer apart: a service running a process older than the source, then a deployed bundle older than the feature commit. The fix was a guard validated by running it against the actual stale artifact, a release workflow with automatic rollback, and, the same day, an API that only three bounded classes of caller can reach.
Jun 22, 2026
June 22 - folding two repos into one, then scrubbing my git history clean before the first push
I merged Loupe's pipeline repo into the app repo as a folder with its history intact, untangled a code-vs-data path coupling that would have quietly broken everything, and then (right before the first push to a private GitHub repo) ran a full-history audit that came back dirty. It found a home address, GPS coordinates, and a dump of my home network's internal layout buried in old commits. The rest of the day was rewriting history to purge all of it, normalizing my commit identity, and collapsing everything to a single clean branch.