NoWaterProgramming

Blog(21)

Thoughts, tutorials, and insights about programming and technology.

(21)

Chrome 155 decodes JPEG XL, and the announcement says 30-50% better compression than JPEG. We ran the reference encoders: at matched quality JPEG XL came in 22 to 23 percent under JPEG, level with AVIF. The stronger result is lossless recompression: 30 real JPEGs shrank 20.8 percent and all 30 reconstructed byte for byte.

File Formats11 min readBy NoWaterProgramming Team

We ran the React Compiler rules in eslint-plugin-react-hooks 7.1.1 over six public React codebases and read a random sample of what they flagged. Over a thousand new errors, three real bugs in 53 sites, and a third of the refs errors never touch a ref. Here is which rules to fix, which to fix mechanically, and which one to keep strict.

React20 min readBy NoWaterProgramming Team

Flipping cacheComponents on turns silent build-time data freezes into build errors. We put 29 code patterns through 110 builds on Next.js 16.1.7 and 16.3.5, one pattern per build, and recorded every error verbatim. Twelve patterns fail. Two stop compiling. The pass/fail is identical across both versions - the amount of help you get is not.

Next.js28 min readBy NoWaterProgramming Team

Tailwind v4 stopped reading tailwind.config.js automatically, and the @config directive brings it back. We probed all 19 keys of a real v3 config against Tailwind 4.3.3, one key per build, and diffed the output CSS. Most keys work. Four are dropped in silence. And the documented list of what does not work is wrong about safelist.

CSS15 min readBy NoWaterProgramming Team

We measured client-side navigation on a deployed Next.js 16.1 site: a soft navigation transfers about half the bytes of a full page load, and a <Link> prefetch transfers the same payload as the navigation it prepares - the whole route, once per link in the viewport, in production. Then we read the useRouter return type out of the installed package: six methods, and no router.events, router.query, router.pathname, router.isReady, router.beforePopState or shallow routing.

Next.jsReact19 min readBy NoWaterProgramming Team

We seeded thirteen failure modes into Next.js 16.1 route handlers and recorded the status, headers and body the client got back, under next dev and under a production build. An uncaught throw is an empty 500 with no Content-Type. Throwing a Response does not set its status. A stream that fails after its first byte is a truncated 200. Dev and production returned the same thing every time.

Next.js15 min readBy NoWaterProgramming Team

We ran npx @tailwindcss/upgrade on a production Astro site, moving Tailwind 3.4.19 to 4.3.3. The tool rewrote the PostCSS config, translated and deleted tailwind.config.mjs, and renamed classes across 31 files, all correctly. It also left two build-breaking errors specific to Astro, and the main stylesheet came out 28% larger gzipped.

CSS13 min readBy NoWaterProgramming Team

A walkthrough of QR internals against the spec: the module grid and its reserved regions, encoding modes, Reed-Solomon over GF(256), interleaved blocks, mask selection, and what the standard deliberately does not protect.

File Formats9 min readBy NoWaterProgramming Team

One email when there is an article worth your time

No schedule, no roundups. At most one a week, and only when it knows something the documentation does not. One-click unsubscribe in every message.