The htmx loophole

Issue #439.November 7, 2025.2 Minute read.
Bytes

Today’s issue: Cloudflare durable hernias, Node.js hair care, and Anders Hejlsberg’s new MCP course.

Welcome to #439.


Eyeballs logo

The Main Thing

Spiderman with a disappointed look

When the laser horse betrays your trust (again)

The htmx loophole

When Carson Gross promised that he would never release a v3 of htmx, I enthusiastically marked myself as Safe on Facebook from ever having to write about HTML libraries again.

But it turns out the HTML chaos monkeys found a loophole on Monday, when they skipped right over v3 and released htmx v4 (alpha) to the world. We never saw it coming.

They’re calling this update The fetch()ening, because after five years of riding the XMLHttpRequest horse, htmx is finally switching to the native fetch() API for all AJAX requests. This is a welcome sight to everyone but the biggest IE stans, since it dramatically simplifies htmx’s internals while also enabling built-in streaming response support.

And since this required quite a few breaking changes, the htmx team decided to sneak in a few more updates to this release while they were at it:

Explicit inheritance – Attribute inheritance is now explicit, using the :inherited modifier. This improves locality of behavior and provides a lot more clarity than the previous implicit approach.

History storage upgrades – It no longer uses localStorage snapshots for history, and will now issue a full page refresh request on navigation. This provides “much, much more reliable history restoration,” while simplifying the entire htmx codebase.

View transitions & streaming – Smooth animated transitions between DOM states and built-in streaming/SSE support mean your hypermedia apps can finally feel a little more SPA-ish (without actually being one).

Bottom Line: Props to Carson and the htmx team for both putting in a ton of work (and mental gymnastics) to make htmx 4 happen. Long live the laser horse.


QA Wolf logo

Our Friends
(With Benefits)

Emily Blunt in Devil Wears Prada saying, I love my job

When my team has to wait two hours before they can deploy anything

Speed up your team’s release cycles – before 2025 ends

If you want to get one big productivity win for your team before the end of Q4, you need to check out QA Wolf.

Their AI-native testing service saved Meow Wolf $300k per year in engineering costs, while also saving them 40+ hours of testing time per release cycle.

Here’s how:

  • Their engineers build out a full outline of your app, with test cases prioritized by need and value
  • They write out tests in plain English for you to review and approve
  • They run all your tests in 100% parallel, and they maintain all tests as your product changes

Get a personalized demo to see how they can cut your team’s QA cycles down to 15 minutes or less.


Pop Quiz logo

Pop Quiz

Sponsored by Sentry

They wrote about how their new AI Code Review tool has already caught more than 30,000 bugs, and how they’ve improved its latency by 50% since launch.

What gets logged?

let i = 0

function x() {
  i++
  return 10
}

i += x()

console.log(i) // ?

Cool Bits logo

Cool Bits

  1. Thomas Ptacek made the case for why you should write an agent. But as my mom will tell you, telling me I “should” do something is a good way to make sure I don’t take a shower for 13 months.

  2. The TanStack Start Hackathon just kicked off, and you can compete to win $140k in cash, prizes, and credits by building the smoothest, butteriest, most interactive full-stack app with TanStack Start. Godspeed. [sponsored]

  3. Yakko Majuri explained why his team migrated from Python to Node.js one week after launching their app. But hey, I’d do it too if Matteo Collina personally offered me $250k worth of equity in his new hair care brand.

  4. The Safari 26.2 beta comes with improved blur filter rendering, support for the cursor CSS property, and a ton more.

  5. Nathan Leung wrote about using atomic state to improve React performance in deeply nested component trees.

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

  7. Someone keeps flagging Ripple’s website as being a phishing/malicious domain. And I’ve got to say, even I’m surprised that all twelve Web Components users would stoop this low.

  8. Vadim Kotov and Travis Turner wrote about when you shouldn’t choose React. What did I literally just say about telling me things I should/shouldn’t do, guys?

  9. Rocket is pioneering Vibe Solutioning, turning prompts or Figma designs into production-ready web and mobile apps. Use / and @ commands to execute tasks with precision and context, making repetitive workflows fast, accurate, and effortless. [sponsored]

  10. Anders Hejlsberg spoke about TypeScript rise in the AI era. It was really interesting, but I found it a little off-putting when he begged the interviewer to buy his MCP course.

  11. Ollie Williams wrote about setHTML(), Trusted Types and the Sanitizer API.

  12. What even are Cloudflare Durable Objects? Boris Tane wrote a very deep dive to try and find out. Now he just needs to write about “what causes ingunial hernia pain right after eating Del Taco” – and he will have answered the other I’ve always been afraid to ask.


Pop Quiz logo

Pop Quiz: Answer

Sponsored by Sentry

let i = 0

function x() {
  i++
  return 10
}

i += x()

console.log(i) // ?

The answer is 10. Here’s how it works.

For clarity, we can refactor i += x() to be i = i + x(). From there, the interpreter begins evaluating our code. Before it evaluates the function invocation, it seems that i evaluates to 0, so now our code is i = 0 + x(). The invocation of x returns 10, so now it’s i = 0 + 10, which gives us i = 10.

Note that if you swap the order of i and x() like i = x() + i you get a different value - 🫂.