Nothing can kill jQuery

Issue #456.January 21, 2026.2 Minute read.
Bytes

Today’s issue: AI is basically just COBOL, bootstrapping Bun for fun, and I’m porting my library to Rust, btw.

Welcome to #456.


Eyeballs logo

The Main Thing

A conehead making the Wu-Tang sign

Write less, do more

Nothing can kill jQuery

It doesn’t matter how many fancy coding agents or next-gen frameworks you throw at it – the $ God remains eternal. And it just celebrated its 20th birthday in style last week by dropping jQuery 4.0 out of nowhere.

This is jQuery’s first major release in almost a decade, but thankfully the team didn’t slap on some MCP support and try to pitch us all on the next 20 years of AI-powered jQuery.

Instead, they shipped some helpful quality of life improvements for the many websites that still rely on it in The Year Of Our Spec 2026. Let’s take a closer look:

  • RIP legacy browsers – jQuery 4 drops support for IE 10 and older, along with Edge Legacy, and some ancient mobile browsers that only the trees remember the names of. This let the team delete a lot of compatibility hacks and deprecated APIs that shrink its overall size by ~3KB.

  • Trusted Types + CSP support – jQuery now cooperates nicely with strict Content Security Policies instead of fighting against them, thanks to support for Trusted Types and safer script loading.

  • Modern upgrades – They migrated the jQuery source to ES modules, switched to Rollup for more modern bundling, and made the library compatible with modern build tools and browsers through the use of <script type="module">.

Bottom Line: It’s nice to see jQuery aging so gracefully, unlike all the millennials who got a broccoli haircut and started wearing JNCO jeans in 2025.


QA Wolf logo

Our Friends
(With Benefits)

A lady vacuuming outside in the desert

Engineering leads choosing AI tools in 2026

How to choose AI testing tools for large teams - free webinar

If you’re a technical leader, you’re probably trying to figure out which AI tools are actually helpful and which ones are just bloated vaporware.

That’s why QA Wolf’s Staff Engineering Lead, Yurij Mikhalevich is hosting a live chat breaking down the full landscape of AI testing tools.

You’ll learn:

  • The 4 main categories of AI testing tools
  • The real tradeoffs around coverage, reliability, and maintenance
  • A practical framework for evaluating AI tools for your specific team

RSVP for the session here.


Spot the Bug logo

Spot the Bug

Sponsored by Clerk

This in-depth guide shows you how to add API Key support to your SaaS app in just a few minutes.

function reverseString(str) {
  return str.split("").reverse().join("");
}

let reversedString = reverseString("Hello, 👋!");
console.log(reversedString);

Cool Bits logo

Cool Bits

  1. Devon Govett wrote about how to compile JavaScript to C with Static Hermes, based on his work on porting Parcel to Rust. “I’m porting my OSS library to Rust, btw.”

  2. Expo just launched Claude Code Skills, a collection of AI agents for building and deploying Expo apps. It’s perfect if you already know React and want to ship your first mobile app. [sponsored]

  3. The HTTP Archive published their 2025 Web Almanac. It’s like getting the new Guinness Book of World Records at the book fair, but instead of immediately staring in awe at the fattest man in the world, you get to see real data about the state of the web.

  4. Alex Harri shared everything he learned from building an image-to-ASCII renderer.

  5. Speechmatics helps startups ship voice products that work in the real world – not just clean demos. Their speech-to-text and text-to-speech APIs are built for accents, background noise, and 55+ languages. Trusted in high-stakes production environments. [sponsored]

  6. Dan Abramov shared his vision for a social filesystem, which sounds a lot more “big brother-y” than it actually is, I think.

  7. LiveVue 1.0 puts Vue inside Phoenix LiveView to give you “seamless end-to-end reactivity” with Vue SSR and lazy-loading Vue components.

  8. Only idiots write manual tests – modern engineering teams like Notion, Dropbox and LaunchDarkly use Meticulous to maintain e2e UI tests that cover every edge case of your web app. [sponsored]

  9. Svelte released 5 patches for CVEs affecting the Svelte ecosystem.

  10. Bradley Walters wrote about bootstrapping Bun, which can mean something very different depending on who you’re talking to.

  11. Stephan Schwab wrote about why we’ve tried to replace developers every decade since 1969. I personally think the market feels a little different now than it did when they first invented COBOL, but I’ll defer to my elders.

  12. Temporal Playground is a fun place to bring your kids and the dog and let them experiment with the Temporal API until they’re all tuckered out for the day.


Spot the Bug logo

Spot the Bug: Solution

Sponsored by Clerk

This bug occurs because the split method treats the string as an array of 16-bit units, not as an array of characters, resulting the unexpected output: !�� ,olleH. By using Array.from(str) or [...str] the string is split into an array of actual characters, respecting the surrogate pairs.

Using Array.from:

function reverseString(str) {
  return Array.from(str).reverse().join("");
}

let reversedString = reverseString("Hello, 👋!");
console.log(reversedString);

Using the spread operator:

function reverseString(str) {
  return [...str].reverse().join("");
}

let reversedString = reverseString("Hello, 👋!");
console.log(reversedString);