Firefox is cooking again

Issue #458.January 28, 2026.2 Minute read.
Bytes

Today’s issue: The Alexander Supertramp of git, the Baby Driver of accessibility, and the AI-induced psychosis of Rust.

Welcome to #458.


Eyeballs logo

The Main Thing

A girl hiding in the corner scanning an old lady's face

All those unused AI features getting ready to crash my browser again

Firefox is cooking again

Mozilla shipped Firefox 147 two weeks ago, and it’s easily one of their biggest web-platform releases in years.

It’s particularly refreshing after last month, when Mozilla’s CEO surprised everyone by announcing his threat vision for Firefox to evolve into “a modern AI browser that will support a portfolio of new and safe software additions.”

Turns out approximately zero Firefox users asked for this. But thankfully, old-fashioned cyberbullying still works in our modern times. So after taking a lot of flak from their most passionate users, Firefox backtracked and promised to build an “AI kill switch” that would let users disable all AI features entirely.

And one month later, they shipped Firefox 147 with a bunch of long-awaited platform features and zero mention of AI. Coincidence? You tell me. Here are the three biggest upgrades:

  • Navigation API – A modern successor to the history API that lets apps initiate, intercept, and manage navigations without relying on fragile popstate hacks. Great news for frameworks, routers, and SPAs.

  • CSS Anchor Positioning – This means all modern browsers now support tethering elements like tooltips, popovers, and menus to anchor elements, using only CSS.

  • View Transition upgrades – New selectors like :active-view-transition-type, better devtools visibility, and APIs to introspect active transitions. It’s another big step towards smooth, app-like UX on the web without relying on framework magic.

Bottom Line: I know that most of this work was underway long before the “AI browser” fallout, but it’s nice to at least pretend that a company listened to its users, slowed down the AI hype train, and shipped a bunch of features that developers actually want.

Hopefully other software companies follow Firefox’s lead.


QA Wolf logo

Our Friends
(With Benefits)

A guy looking tired while smoking a cigarette

Engineering leads evaluating another AI tool

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

If you’re a technical leader, how can you tell which AI tools are actually helpful and which ones are vaporware?

It’s not easy. That’s why QA Wolf’s Staff Engineering Lead, Yurij Mikhalevich is hosting this free workshop breaking down the full landscape of AI testing tools.

You’ll learn:

  • The 4 big categories of AI testing tools
  • The real tradeoffs for coverage, reliability, and maintenance
  • A practical framework you can use to evaluate AI tools for your team

RSVP here for the workshop.


Spot the Bug logo

Spot the Bug

Sponsored by Sentry Seer

It’s an AI debugger that uses all of Sentry’s context to identify root causes in production and fix what you missed.

function safeUpdate(obj, key, value) {
  if (!obj.hasOwnProperty(key)) {
    obj.key = value;
  }
}

const user = {
  name: "Alice",
  age: 30
};

safeUpdate(user, "country", "USA");

Cool Bits logo

Cool Bits

  1. Vercel just disclosed multiple high-severity vulnerabilities in RSC that require immediate upgrades. These should not be confused with the RSC CVEs from last month, or the RSC CVEs that will be discovered next month.

  2. Puter.js is a single JavaScript library that gives you serverless auth, cloud storage, LLM integration, and more – no backend, no config, and no stress required. [sponsored]

  3. Lead Yarn maintainer, Maël Nison shared this Yarn 6 Preview. Yes, they rewrote it in Rust, which means you need to either take a drink or put on your animal ears.

  4. The Turbopack team wrote about how they build faster by building less, thanks to their “very fine-grained caching architecture.”

  5. Expo SDK 55 beta just shipped without support for React Native’s legacy architecture for the first time 👏. It also adds opt-in Hermes v1 support and AI agent skills for building, deploying, and debugging complex Expo apps. [sponsored]

  6. Vjeux wrote about porting 100k lines from TypeScript to Rust in a month using Claude Code. Porting things to Rust is my favorite form of AI-induced psychosis.

  7. Node.js 25.5 blesses us all with a new --build-sea command line flag that simplifies the process of building Single Executable Apps (SEA) in Node.

  8. Our very own Lynn Fisher wrote this case study on the 2025 refresh of her personal site, just in case you need some proof that not every website on the internet has been turned into AI slop.

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

  10. Laura Kalbag just shared her book Accessibility for Everyone for free online. Like Baby Driver it first came out back in 2017, is highly underrated, and still holds up great.

  11. Nuxt 4.3 comes with perf upgrades and new features for layouts, caching, and DX.

  12. TonyStr made his own git and finally got to experience the bliss of living off the grid, wild and free from the shackles of modernity, like a modern day Alexander Supertramp. Just don’t go to Alaska.


Spot the Bug logo

Spot the Bug: Solution

Sponsored by Sentry Seer

This one was for the beginners.

function safeUpdate(obj, key, value) {
  if (!obj.hasOwnProperty(key)) {
    obj.key = value;
  }
}

Our bug is that we’re adding a literal key property to our object.

console.log(user.key) // "USA"

In JavaScript, if you want to use a variable as the key of an object, you need to use bracket notation instead of dot notation.

function safeUpdate(obj, key, value) {
  if (!obj.hasOwnProperty(key)) {
    obj[key] = value;
  }
}