Firefox is finally adding PWA support

Issue #380.March 31, 2025.2 Minute read.
Bytes

Today’s issue: JavaScript’s mark of the beast, diesel-powered linters, and React 19’s best Tim Robinson impersonation.

Welcome to #380.


Eyeballs logo

The Main Thing

Cartoon character lying awake in bed

Me thinking about that PWA caching bug that took out my site in 2016

Firefox is finally adding PWA support

If you’ve ever managed a successful software product, you know how important it is to get good at ignoring user feedback.

Firefox has long been the gold standard here, but they might need to give up their crown – because after years of ignoring requests to add support for Progressive Web Apps, it looks like they’re finally giving in.

They recently added an experimental flag for browser.taskbarTabs.enabled to Firefox Nightly. It doesn’t actually do anything yet, but Taskbar Tabs is Firefox’s fancy name for their PWA-like implementation – which means we should be getting that functionality soon.

But Firefox isn’t like other girls browsers. So it’s choosing to forego Chrome’s official PWA spec and support PWAs in its own cool-and-quirky way:

  • Unlike Chromium-based browsers, Firefox web apps will retain key browser UI elements, including the main toolbar and address bar.

  • Users can transition any tab into a web app mode temporarily, without needing to log in again.

  • Installed web apps get their own taskbar/dock icons – and opening a link to one (like Twitter) will launch it in the app, instead of hijacking your main browser window.

Why deviate from the PWA spec? It depends on who you ask. According to the Firefox team, it’s because they want to “offer features that help you get a more app-like experience for any website you choose,” while still maintaining that “web apps are still websites in a web browser.”

But critics have argued that Firefox’s proposed implementation looks like a half-hearted attempt to ship something, years after most developers have stopped caring about PWAs.

Bottom Line: Firefox and Mozilla might’ve finally changed their tune on PWAs, but at least we can rest easy knowing that they’ll never switch their stance on privacy. Wait.

        

QA Wolf logo

Our Friends
(With Benefits)

A dog sitting on a wall looking at the water

Watching my team wait on flaky tests instead of shipping features

Cut your team’s release time in half with QA Wolf

They helped Brilliant reduce their QA cycles from 24 hours to 5 minutes – while providing the equivalent testing capacity of 5 full-time QA engineers (see the case study).

And they’ve done the same for hundreds of other customers. Here’s how:

  • They create, maintain, and run Playwright tests to cover your entire application

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

  • Every failed test is reviewed by their team of human QA engineers, so you get zero flakes.

Their customers save 9 hours/week per engineer on average – and 90% of customers eliminate post-release hot fixes.

Get a personalized demo – and start speeding up your team’s releases.


Spot the Bug logo

Spot the Bug

Sponsored by query.gg

Does your team use React Query? If so, check out query.gg and see why managers at LinkedIn and Broadcom use it to train their engineers.

function eventuallyFail (time) {
  setTimeout(() => {
    throw Error("Oops!")
  }, time)
}

try {
  eventuallyFail(1000)
} catch (error) {
  console.error(error.message)
}

Cool Bits logo

Cool Bits

  1. React 19.1 just dropped, and it introduces “Owner Stacks” – a development-only stack trace that identifies which components are responsible for rendering a particular component that led to an error. “We’re all looking for the guy who did this.”

  2. Jacob Voytko wrote about the hardest bug he ever debugged while on the Google Docs team.

  3. Kyle Gill took a science-based approach to answer the question humans have been asking themselves ever since they first gazed up at the stars: Is Vite faster than Turbopack?

  4. Mahesh Murag from Anthropic gave this 2-hour workshop on building agents with MCP at the AI Engineer Summit.

  5. TypeScript maintainer, Josh Goldberg wrote about how Hybrid Linters are the best of both worlds. When will these tech hippies learn that some of us just prefer our diesel-powered linters?

  6. Rspack v1.3 comes with circular dependency detection, build HTTP imports, and lots of perf upgrades.

  7. The V8 team wrote about why they decided to move away from Sea of Nodes. I figured it was because of all the people who disappeared at that old lighthouse, but it turns out it was just the high HOA fees.

  8. Babylon.js just released v8.0 of their open web rendering engine, with Image-Based Lighting shadows and lots more.

  9. The Netlify team wrote a totally unbiased article called How we run Next.js today – and why Vercel’s triangle logo is the Mark of the Beast that John warned us about in Revelation.


Spot the Bug logo

Spot the Bug: Solution

Sponsored by query.gg

function eventuallyFail (time) {
  setTimeout(() => {
    throw Error("Oops!")
  }, time)
}

try {
  eventuallyFail(1000)
} catch (error) {
  console.error(error.message)
}

try/catch is synchronous. By the time our error is thrown, the try/catch block will be long gone - leaving us with Uncaught Error: Oops!. To fix this, we want to rely on promises which allow us more async control.

function eventuallyFail (time) {
  return new Promise((res, rej) => {
    setTimeout(() => {
      rej(Error("Oops!"))
    }, time)
  })
}

eventuallyFail(1000)
  .catch((reason) => console.error(reason.message))