Nine Inch Node.js

Issue #391.May 9, 2025.2 Minute read.
Bytes

If you need a little convincing to try out react.gg during our launch sale, I’d recommend checking out our reviews page – which we designed to feel like playing a game of Uno by yourself. It’s more fun than it sounds.

Today’s issue: Amazingly clean syntax, emo songs about switching tech stacks, and AI slop for future billionaires.

Welcome to #391.


Eyeballs logo

The Main Thing

A nun taking a selfie holding a beer can at a baseball game

When you get an American pope and a major Node release in the same week

Nine Inch Node.js

Do you ever find yourself writing code inside your office on a hot summer day, blasting both the air conditioning and The Social Network soundtrack as high as they can go – then stop to think about how Trent Reznor is the great-grandson of the guy who founded the Reznor HVAC company in 1888?

You could argue that, across those four generations, the Reznor lineage has done more to increase developer productivity than anyone else in history – but the Node.js team is doing their best to close the gap.

They just launched Node.js 24, and they’ve promised that it’s “not just another update,” but a major step forward in performance, security, and developer experience.

Let’s take a closer look:

  • New JavaScript features – The upgraded V8 engine now supports RegExp.escape, Float16Array, Error.isError, and more features that push Node closer to modern browser JavaScript and save you from rolling your own janky utilities.

  • URLPattern goes global – You no longer have to import it manually, which is great for clean routing and regex-less URL matching.

  • Better built-in test runner – Subtests are now auto-awaited, so you won’t get mysterious errors because you forgot an await.

  • npm v11 – Comes with noticeably faster installs, better security checks, and improved compatibility with modern package ecosystems.

Bottom Line: After what felt like years of maintenance releases, these last few Node updates have packed some major heat. Much like our man Trent, it’s clear that they aren’t content to just coast on their legacy as a HVAC nepo baby JavaScript runtime pioneer – which is great news for all of us.

And yes, this might be one of the top-5 most convoluted metaphors I’ve ever used writing this newsletter.


QA Wolf logo

Our Friends
(With Benefits)

N64 Mario looking up in the dark

Watching my team suffer through another 2-hour QA cycle

Speed up your team’s release cycles, the easy way

Every dev team in the world has the same goal for 2025: release better software, faster.

Luckily, QA Wolf is already helping hundreds of teams do that. Here’s how:

  • Their multi-agent AI systems create, maintain, and run Playwright tests for you (see how it works).

  • They provide unlimited parallel test runs on their infrastructure, getting you pass/fail results within 3 min.

  • You get zero flakes, because every failed test is reviewed by one of their human QA engineers.

Get a personalized demo for your team – and see how they help 92% of their customers release faster, while saving 9 hours/week per engineer.


Spot the Bug logo

Spot the Bug

Presented by Sentry

This tutorial shows how to find and fix complex full-stack issues in your React app in less than 2 min with Sentry – and it feels like magic.

function deepClone(obj) {
  if (obj === null || typeof obj !== "object") {
    return obj;
  }

  const copy = Array.isArray(obj) ? [] : {};

  for (const key in obj) {
    copy[key] = deepClone(obj[key]);
  }

  return copy;
}

const objA = { value: 1 };
const objB = { a: objA };
objA.b = objB;

const clonedObj = deepClone(objA);

Cool Bits logo

Cool Bits

  1. Void is an open-source VS Code fork Cursor alternative that will probably get bought by Perplexity in T minus 3 months.

  2. Lambda offers the lowest cost AI inference – no rate limits, no pricing tiers. Run top models like DeepSeek V3 and R1 starting at $0.34/M input and $0.88/M output tokens. Clean JSON in, smart tokens out. [sponsored]

  3. Roman Liutikov just released part 1 of his series on bringing React Server Components to Clojure

  4. New AI grift just dropped: submitting AI-generated fake vulnerability reports to bug bounty programs. Will you make any money? Unlikely. But will you make the world a worse place? Definitely. Smash that like button for more millionaire money tips.

  5. How promises work in JavaScript is a good reminder that they work a lot differently than promises in real life.

  6. Tero Piirainen created Hyper – a simpler React alternative for generating complex UIs with “amazingly clean syntax.” But if I learned anything from my college roommates, it’s that two people can have a very different idea of what “amazingly clean” means.

  7. Clerk just launched Clerk Billing – an easy way to add subscription billing for B2C and B2B apps with no webhooks, no UI build, no payment integration code, and no DIY authorization engine. If you’ve ever tried to add subscription billing to your app, you know this is a big deal. They even give you pre-built billing components, like <PricingTable />. [sponsored]

  8. Clippy lets you run multiple LLMs locally on your computer with a fun ’90s UI that will make you want to play Sims.

  9. ty is a fast Python type checker and language server that’s written in Rust.

  10. Adam Fortuna wrote about falling out of love with Next.js and back in love with Ruby on Rails & Inertia.js. It’s a lot like the classic Bright Eyes song, Falling Out of Love at this Volume, but instead of being a catchy indie classic from the late ’90s written by a 15-year-old boy – it’s an article about why a dev team migrated their tech stack.


Spot the Bug logo

Spot the Bug: Solution

Presented by Sentry

The bug is that the deepClone function does not handle circular references. When objA is cloned, objB is cloned as well, which in turn clones objA again, and so on. This results in an infinite loop. To fix this, you can keep track of the objects that have already been cloned using a Map, and check if an object has already been cloned before cloning it again.

function deepClone(obj, map = new Map()) {
  if (obj === null || typeof obj !== "object") {
    return obj;
  }

  if (map.has(obj)) {
    return map.get(obj);
  }

  const copy = Array.isArray(obj) ? [] : {};

  map.set(obj, copy);

  for (const key in obj) {
    copy[key] = deepClone(obj[key], map);
  }

  return copy;
}

const objA = { value: 1 };
const objB = { a: objA };
objA.b = objB;

const clonedObj = deepClone(objA);