The blog

Writing from the workshop

111 articles on the parts that actually hurt.

section
I Shipped 'Passwordless Login.' It Still Asked for a Username.
Security

I Shipped 'Passwordless Login.' It Still Asked for a Username.

WebAuthn's own demo code creates a credential the browser can't find on its own — so your passkey button quietly turns into a fancier security key instead of an actual passwordless sign-in. One option fixes it.

Sep 10, 2026 · 6 min
Those Share Buttons Are Guessing What's On My Phone
JavaScript

Those Share Buttons Are Guessing What's On My Phone

Every blog footer hardcodes the same row of share icons — X, Facebook, copy link — and none of them know what's actually installed on your phone. The Web Share API hands the job to the OS instead, and it can do something a custom row never could: share an actual file.

Sep 9, 2026 · 6 min
Next.js Server Actions: Mutations & Security (Cheat Sheet)
Nextjs

Next.js Server Actions: Mutations & Security (Cheat Sheet)

Next.js Server Actions look like plain functions but compile to public POST endpoints. Learn the mutation flow, built-in CSRF checks, and the auth you owe.

Sep 8, 2026 · 15 min
Your Required Field Turns Red Before You Type Anything
CSS

Your Required Field Turns Red Before You Type Anything

A signup form's email input shows a red border the instant the page loads — before the visitor has typed a single character. The obvious CSS causes it, and the obvious fix is a native pseudo-class nobody reaches for first.

Sep 8, 2026 · 5 min
Web Workers in JavaScript: The Complete Guide
JavaScript

Web Workers in JavaScript: The Complete Guide

Learn JavaScript Web Workers step by step: message passing, transferable objects, error handling, and a copy-paste cheat sheet for offloading work.

Sep 7, 2026 · 12 min
One CSS Property Replaces Your Checkbox Hack
CSS

One CSS Property Replaces Your Checkbox Hack

Recoloring a checkbox to match the brand usually means appearance: none, a hand-drawn checkmark, and a rebuilt focus ring. accent-color does the same job in one line — and knowing where it stops matters as much as knowing that it works.

Sep 7, 2026 · 4 min
Your Recipe App Is Hiding a Silent Video
JavaScript

Your Recipe App Is Hiding a Silent Video

Cooking sites, workout timers, and boarding-pass pages used to autoplay an invisible, muted, looping video for one job only: stopping your phone from locking its screen. The Screen Wake Lock API replaces that hack with three lines of JavaScript — and it comes with one gotcha the docs bury.

Sep 6, 2026 · 5 min
React Compiler 1.0: What useMemo You Can Delete
React

React Compiler 1.0: What useMemo You Can Delete

React Compiler 1.0 is stable. Here's the re-render model it automates, which useMemo/useCallback/memo calls you can delete, and what still needs you.

Sep 5, 2026 · 13 min
Your Timer Doesn't Know You Tabbed Away
JavaScript

Your Timer Doesn't Know You Tabbed Away

window blur feels like the obvious way to detect an idle tab, and it's wrong in ways that only show up in production. The Page Visibility API answers the actual question — can anyone see this? — so polling, timers, and video stop wasting work the moment nobody's looking.

Sep 5, 2026 · 4 min
The await That Silently Breaks navigator.clipboard.writeText()
JavaScript

The await That Silently Breaks navigator.clipboard.writeText()

navigator.clipboard.writeText() only works while the document is focused and the user gesture is still fresh. Any await before the call can let both expire, so a copy button fails with an uncaught NotAllowedError and nobody ever sees why.

Sep 3, 2026 · 5 min
You're not quiet in meetings, you're editing
Meetings and rooms

You're not quiet in meetings, you're editing

The reason you don't speak up isn't confidence. Everyone else is thinking out loud while you wait for your thought to be finished — and a good point at minute thirty is worth less than a rough one at minute twelve. Here's how to land it on time.

Sep 2, 2026 · 9 min
Shadow DOM Needed JavaScript to Exist. Now It Doesn't.
JavaScript

Shadow DOM Needed JavaScript to Exist. Now It Doesn't.

attachShadow() is a JavaScript-only API with no HTML serialization, so a server-rendered web component ships an empty host element until the client hydrates it. Declarative Shadow DOM attaches the real shadow root during HTML parsing — zero JS required.

Sep 2, 2026 · 5 min