Logging a CLI into OAuth with nobody at the keyboard
A CLI's OAuth refresh token expired on a headless box. Getting it signed in again meant expect, a Playwright browser, and reading the magic-link email out of my own mail pipeline.
Read →Chester Frazier · Gulfport, MS · b. 1988
Debugging stories, architecture notes, and the occasional thing I built because nobody else had. New posts when I have something worth writing down.
A CLI's OAuth refresh token expired on a headless box. Getting it signed in again meant expect, a Playwright browser, and reading the magic-link email out of my own mail pipeline.
Read →Adding public share links to a Postgres row-level-security app means resolving a stranger to a tenant before any tenant is bound — plus a SwiftUI nested-ScrollView trap that dragged a whole screen off its left edge.
Read →A UITextView with scrolling disabled reports its intrinsic width as the full unwrapped line, and SwiftUI believes it. Why my chat composer ran off the screen edge instead of wrapping, and the four-part fix.
Read →I built a status panel for six nightly sync jobs and every one of them read 'clean · —'. systemd discards a template instance's ExecMain timestamps the moment the unit goes inactive.
Read →My garden app's packet scanner stripped every non-digit from whatever the camera read. That works for a UPC and quietly destroys a QR code — which is what small seed houses actually print.
Read →A network install of Windows 11 failed with permission denied. It turned out to be seven unrelated faults stacked on top of each other, and only one was actually a permission.
Read →A CASE expression with a guarded date cast threw an invalid-date error from the arm that could never run. Constant folding happens before the guard does.
Read →My contact form's blocklist caught crypto scams for months, then a polite Wikipedia sales pitch walked through scoring zero. Adding an LLM stage fixed it — and introduced a prompt-injection hole.
Read →Wiring a self-hosted assistant into Alexa and replacing a dumb alarm turned up three constraints worth writing down: an eight-second wall, an ISO-week trap, and a phrase Siri refuses to learn.
Read →accept=image/* greys out every video in the iOS photo picker — and fixing that exposes two more bugs: an in-memory multipart parse and a file server that ignores Range.
Read →Replacing 'water everything every other day' with an ET0 x Kc water balance — pot volume, root depth, rain, plant age — and using the same model to catch the plants being drowned.
Read →A dependency-free Python wrapper around ffmpeg that chapters a flat audiobook using the publisher's real Audible markers and outputs open Opus-in-Matroska. Install, CLI and GUI instructions.
Read →SAM kept failing with AccessDenied on the Serverless transform even after I granted the deploy role every permission it asked for. The blocker wasn't IAM — it was an Organizations SCP, and no grant can override a Deny.
Read →App Store review rejected two builds for an 'unsupported Xcode version' I was already running. The real cause had nothing to do with Xcode or signing — the build machine was on a beta macOS.
Read →