Today’s issue: JavaScript’s mark of the beast, diesel-powered linters, and React 19’s best Tim Robinson impersonation.
Welcome to #380.
Me thinking about that PWA caching bug that took out my site in 2016
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.
![]() ![]() ![]() ![]() |
Watching my team wait on flaky tests instead of shipping features
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.
function eventuallyFail (time) {
setTimeout(() => {
throw Error("Oops!")
}, time)
}
try {
eventuallyFail(1000)
} catch (error) {
console.error(error.message)
}
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.”
Jacob Voytko wrote about the hardest bug he ever debugged while on the Google Docs team.
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?
Mahesh Murag from Anthropic gave this 2-hour workshop on building agents with MCP at the AI Engineer Summit.
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?
Rspack v1.3 comes with circular dependency detection, build HTTP imports, and lots of perf upgrades.
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.
Babylon.js just released v8.0 of their open web rendering engine, with Image-Based Lighting shadows and lots more.
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.
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 throw
n, 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))