202614
Write logs for the person investigating a failure
Useful log events identify the operation, outcome and correlation context without copying the whole request.
Blog Python, Observability
What belongs in this notebook
Short engineering notes with enough context to be useful after the original problem has been forgotten.
Blog Notebook
Use :focus-visible without losing keyboard focus
Let the browser decide when a focus indicator is needed, and keep a visible fallback.
TIL CSS, Accessibility
Read one request through an unfamiliar codebase
A focused way to build a useful map of a repository without reading every file first.
Blog Engineering, Code reading
Names should carry the missing context
Units, state and domain meaning make names useful; extra syllables alone do not.
Blog Code quality, Python
Keep a static-site build easy to explain
The build contract behind this Hugo portfolio: pinned inputs, explicit environments and generated HTML.
Blog Hugo, Web, Builds
jq keys_unsorted is not an ordering contract
Use keys_unsorted for convenient inspection; use an array when the order is part of the data.
TIL jq, CLI
Git restore: choose the source and destination
Separate unstaging a file from discarding working-tree edits with git restore.
TIL Git
Debugging by narrowing the question
A practical approach to reproductions, hypotheses and boundary checks when stepping through the process is not available.
Blog Debugging, Python
Before caching a result, define when it is wrong
Cache keys, stale data and invalidation are part of the result contract, not just performance settings.
Blog Backend, Caching
A type annotation does not validate an API response
TypeScript can narrow checked values, but external JSON still needs runtime validation.
Blog TypeScript, APIs
A portfolio is a good fit for static HTML
Why this site uses generated pages, with small interactive features added where they help.
Blog Hugo, Web, Search
A dependency becomes part of the maintenance plan
Questions to ask before adding a package, beyond whether it saves a few lines today.
Blog Engineering, Dependencies
A database migration has to coexist with old code
An expand-and-contract example for schema changes that must work while application versions overlap.
Blog SQL, Backend

Search projects, articles and notes.