
Uint8Array toBase64 and toHex: Stop Round-Tripping Bytes Through btoa
JavaScript can finally turn bytes into base64 and hex (and back) without the String.fromCharCode and btoa dance. Here's how Uint8Array's new...
Subscribe to Danny Holloran's Newsletter
Get new articles and engineering posts delivered to your inbox.

JavaScript can finally turn bytes into base64 and hex (and back) without the String.fromCharCode and btoa dance. Here's how Uint8Array's new...

ES2026's import defer evaluates a module the first time you touch its namespace, not at startup, so you can move heavy work off the cold pat...

Next.js 16.3 turned on Turbopack's persistent build cache by default and published numbers as high as 5.5x. Most CI pipelines will see exact...

Grid and flexbox let you rearrange a layout without touching the DOM, which quietly breaks keyboard navigation. The reading-flow and reading...

Almost every laptop shipped in the last two years has a neural processing unit sitting idle. WebNN is the only web standard that can actuall...

OneOf Input Objects landed in the September 2025 GraphQL spec, which means the exactly-one-of-these-arguments rule you've been enforcing in ...

Node's built-in test runner has been stable since v20 and now handles mocking, coverage, watch mode, and TypeScript files. Here's what it do...

Snippets let you define reusable chunks of markup inline and render them like functions. They replace slots, kill the let: directive, and me...

Sticky headers, snapped carousel slides, and scroll shadows have all been JavaScript jobs for a decade. Scroll-state container queries hand ...

Svelte 5.36 lets you use await at the top level of a component, inside $derived, and in your markup. Here is how synchronized updates, bound...

Your app already runs in five tabs at once, and they all think they are in charge. The Web Locks API gives the browser a real mutex so only ...

Custom elements can be real form controls. Here is how formAssociated, ElementInternals, and setValidity retire the hidden-input hack for go...

Next.js 16.3 stops firing a prefetch request for every link in the viewport and caches one reusable loading shell per route instead. Here's ...

Chrome 148 ships experimental support for filling HTML placeholders out of order and streaming markup into the DOM. Here's how the new templ...

React 19.2's Activity component hides a subtree instead of unmounting it, so state, scroll position, and DOM survive the round trip. Here's ...

Next.js 16 gave cache invalidation two different functions instead of one, and the split maps to a real distinction: content that can lag ve...

Buttons that look bottom-heavy at padding: 12px aren't your fault, they're half-leading. text-box-trim finally lets CSS cut that invisible s...

Firefox 148 shipped Trusted Types in February 2026, making it Baseline. Here's how to turn every dangerous innerHTML assignment in your app ...

Your field data says INP is 400ms. Your local profile says everything is fine. The Long Animation Frames API closes that gap by naming the s...