Notes on privacy engineering, infrastructure and audio production.
What natural language processing looks like in Node.js, with working examples of text classification and sentiment analysis.
Building a web crawler in Node.js that scrapes sites in parallel with worker threads and stores what it finds, then comparing it with open source crawlers.
How I designed pairwise subject IDs for OIDC at ConsentKeys: the constraints, why we used HKDF with per-app salts, and the rotation problem.
Using Lighthouse audits and the Performance tab in Chrome DevTools to measure a page and track down what is slowing it down.
How we run Petrichor Labs on bare metal: tenant isolation on a private mesh, failover drills, CVE triage, and alerts on what users actually see.
Setting up a Node.js project with TypeScript from scratch: compiler config, linting and a small Express server, so a growing codebase stays manageable.
How the US CLOUD Act shaped the design of Petrichor Labs, why we host in Canada, how we check vendors, and what we don't claim.
A tour of the browser Cache API: storing, matching and deleting responses, and where it fits when building progressive web apps.
How I program drums in Ableton for my drunkgiantbird records: self-sampled hits, effort-driven velocity, scripted timing drift and a moving tempo track.
What isomorphic apps are, built out as a pet adoption site in Nuxt that loads its data on the server before rendering the page.
Why this points somewhere unexpected inside JavaScript callbacks, and the ways to bind it to the object you actually meant.
Building a universal app with a Django REST API on the back end and Nuxt.js rendering the front end on the server.
Five ways to use Vue DevTools to inspect and change a running Vue app, so debugging takes less guesswork.
Comparing four routing libraries for Vue side by side, and why Vue Router is usually the one to pick.