Blog
Technical notes on web development, DevOps, and AI integration.
187 articles
- 20:46devops
Bind-Mounting the Projects Folder Into a Container
Two small compose decisions, identical paths on both sides and a matched UID, make the host Projects folder safe to use from a container without chmod 777.
#docker#devops - 20:28devops
An OAuth Callback Refused in a Host-Mode Container
My first guess was a ports block in compose. Host-mode already shares the host loopback, and ports actually breaks compose validation.
#docker#oauth#devops - 18:32frontend
MessageCircle Is Not WhatsApp, the Client Told Me So
A WhatsApp CTA with a generic lucide chat icon made visitors hesitate. The fix: an inline brand SVG, a real label, and better button contrast.
#react#frontend#seo - 18:18frontend
The Two-Column Mobile Grid I Took Back
Splitting a 4-column grid into 2 columns made cards cramped on phones. The fix: an embla carousel on mobile, a grid on desktop, a doubled DOM.
#nextjs#react#frontend - 16:29frontend
Switching to a Grid, a Show More Pattern, and One SEO Trade-off
Refactoring a long accordion column into a 3-column grid with Show More lists. The trade-off: sliced points never reach the initial DOM Google indexes.
#nextjs#react#frontend - 16:25frontend
A Certification Badge With No Image Took Down next/image
An optional image field met a runtime component that demands src. The About page went blank. Here is the ternary and fallback UI that fixed it.
#nextjs#typescript#frontend - 02:44frontend
TypeScript Types Never Reach Your JSON, So Write Contract Tests
One missing badge image broke typecheck. A story about type erasure, optional properties, and parametrized contract tests guarding per-locale JSON content.
#typescript#testing#frontend - 20:59devops
The Security Gate Caught Its Own Announcement
My content security gate auto-rolled back the very article announcing it. False positive, cheap fix, and the best proof the fail-closed design works.
#automation#security#devops - 20:47devops
Deleting the RAMP Table That Haunted Our Scheduler
We deleted the daily 6+6 article cap and went event-driven: per-entry cursor, cycle budgets, and a local bge-m3 embedding dedup.
#automation#seo#devops