Breaking Babel

Issue #460.February 6, 2026.2 Minute read.
Bytes

Today’s issue: An npm registry for the space age, shocking revelations from the State of JS, and John Mayer’s hidden JavaScript b-sides.

Welcome to #460.


Eyeballs logo

The Main Thing

The leaning tower of cheese-a from Goofy Movie

Showing off your team's toolchain that no one's touched since Covid

Breaking Babel

The JavaScript transpiler of your youth just woke up and released Babel 7.29.0 and Babel 8.0.0 RC.

For those keeping score at home, this is the 29th minor release since Babel 7 launched back in August 2018, a simpler time when nobody had heard of React Hooks and everybody was convinced that Hillary Clinton had the most controversial email server in the country.

We were so innocent then 🥲.

Predictably, this v7.29 release is all about prepping for the big Babel 8 migration. @babel/standalone can now define explicit transpilation targets directly in <script> tags via a data-targets attribute, and it finally supports Babel’s async core API. Small changes, but helpful when upgrading a build tool you haven’t thought about for half a decade.

As for Babel 8, we can expect:

  • An ESM-only future. Babel 8 drops CommonJS entirely, and goes all in on Node 20’s require(esm) era.

  • More modern defaults. @babel/preset-env stops blindly transpiling everything to ES5 and instead follows Browserslist’s defaults.

  • Fewer surprise breaking changes. Most of the breaking behavior was already hiding behind flags in Babel 7, so upgrades should be boring.

  • A smaller, cleaner surface area. Less legacy code and a smaller toolchain that assumes you’re not targeting IE11 anymore.

Bottom Line: I definitely wasn’t planning on writing extensively about jQuery and Babel in the first six weeks of the year, but it feels right to honor the pioneers who helped us get to wherever the hell web dev is now in 2026.


Eyeballs logo

The Main Thing

Dinosaurs in a lightning storm

Teams still hand-rolling their test suite in 2026

Introducing the new AI platform that can 10x your QA team’s coverage

QA Wolf’s new AI assistant maps and automates even your most complex user flows.

It turns your prompts into Playwright and Appium code for consistent, repeatable test runs – not flaky, vision-first execution. With advanced flake detection and self-healing, one QA engineer using our AI can manage 600+ E2E tests.

Level up every stage:

  • Planning: 150+ test cases outlined in 15 minutes.
  • Automation: 5x faster than writing in VS Code.
  • Execution: Unlimited, 100% parallel runs—12x faster than computer-use agents.

Get Early Access.


Spot the Bug logo

Spot the Bug

Sponsored by Meticulous

Meticulous generates and maintains an exhaustive suite of e2e UI tests that covers every edge case of your web app. See why CTOs at Dropbox, Notion and LaunchDarkly rely on them.

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  set name (value) {
    this.name = value;
  }

  set age (value) {
    this.age = value;
  }

  printName() {
    console.log(this.name);
  }

  printAge() {
    console.log(this.age);
  }
}

Cool Bits logo

Cool Bits

  1. Ahmad Shadeed wrote a convincing case for why setting your breakpoint too early is bad responsive design. As someone who consumes the internet solely through my T-Mobile Sidekick from 2006, I wholeheartedly agree.

  2. Rebuilding Harvey’s design system from the ground up is a great deep dive into how Harvey’s team went from a “bag of components” to a real design system, without blowing up their whole platform. Which is rarer than it should be. [sponsored]

  3. State of JS 2025 just came out and it turns out everyone’s still using React, complaining about React, and pretending they have other options than React.

  4. Michael Bolin wrote on the OpenAI blog about unrolling the Codex agent loop.

  5. Allen Pike wrote an article that I’m 90% sure is the name of a John Mayer b-side, A Broken Heart: Or, getting a 100x speedup with one dumb line of code.

  6. Indragie Karunaratne wrote about how Sentry’s Seer now helps you debug during local dev and code review, so you can avoid shipping bugs to production in the first place. [sponsored]

  7. Lars Ingebrigtsen broke down why the Epstein files are full of equals signs. Still waiting for someone to unpack why they’re also full of Harvard faculty members.

  8. Jacob Heric explained how migrating from Next.js to TanStack Start reduced Inngest’s local dev time by 83%. Another feather in Lord Tanner’s cap.

  9. RSVP for GitLab Transcend, an exclusive virtual event where engineering leaders will share *real stories* of how their teams are using agentic AI for software delivery. [sponsored]

  10. npmx.dev is a new browser for the npm registry that wants to be faster, more developer friendly, and hopefully acquired by SpaceX sometime this year.

  11. Remy Porter wrote about the problems caused by a very “percise” parser.

  12. 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]

  13. Erik Johannes Husom wrote an interesting article about outsourcing thinking. At least it seemed interesting from the one-sentence summary I had Claude generate for me.

  14. The RepoFlow team benchmarked Node.js 16 through 25 to see what really changed.

  15. Martin Alderson wrote about the two kinds of AI users and what they mean for the future of enterprise software. My mom is the “send her son endless Instagram reels of fake toddlers riding on the backs of fake animals to deliver fake life-saving medicine to other fake toddlers who don’t have any fake adults to care for them” kind of AI user 🫠.


Spot the Bug logo

Spot the Bug: Solution

Sponsored by Meticulous

When the class assigns the name and age properties, it calls the setters, which in turn call themselves. This creates an infinite loop and will throw a “Maximum call stack size exceeded” error. To fix this, you should use different names for the properties and the setters.

class Person {
  constructor(name, age) {
    this._name = name;
    this._age = age;
  }

  set name (value) {
    this._name = value;
  }

  set age (value) {
    this._age = value;
  }

  get name() {
    return this._name;
  }

  get age() {
    return this._age;
  }

  printName() {
    console.log(this._name);
  }

  printAge() {
    console.log(this._age);
  }
}