Come on, guys, confession time: who else still gets a nervous twitch hearing the words “Manifest V3”? I remember the old days, spending three days just setting up Webpack and praying Google wouldn’t reject our manifest.
Thankfully, those days are largely behind us. Now, we have two serious contenders in the extension building space: Plasmo (the established React favorite) and WXT (the aggressive newcomer running on Vite).
I dove deep into their repos, re-read hundreds of commits from the last six months, and I’m ready to tell you what’s really going on. Spoiler: one framework is currently flying, and the other seems to be taking an extended vacation.
WXT: The v0.20 Revolution
If you missed it, WXT recently dropped version 0.20, and this wasn’t just a “bug fixes and chores” release. This feels like a fundamentally new direction for the framework.
Imagine this scenario: your extension is running fine, and then you decide to upgrade, and… everything breaks in a fiery blaze. Why? Because the WXT team decided to cut to the quick to make the tool genuinely better. And honestly? It was worth the pain.
1. The Great Weight Loss (Goodbye, Polyfill!)
Historically, almost all extension frameworks had to haul around a heavy library from Mozilla (webextension-polyfill) just to make sure chrome.runtime worked identically across Chrome, Firefox, and Edge. It was convenient, but it was bloat.
WXT’s Move: In v0.20, they said, “No more.” They ripped out that dependency and replaced it with their own, feather-light types and wrappers. Your Benefit: Imagine you’re building an extension as an indie hacker. Your “Hello World” used to weigh as much as a small boat anchor. Now, thanks to better Tree-shaking (when the bundler removes unused code) and dropping the polyfills, the final file size is dramatically smaller. The Chrome Web Store (and your users) will thank you.
2. Styles That Actually Stay Put (Shadow DOM Reset)
Oh, the notorious style battle! Have you ever injected your beautiful UI onto a random website, only for it to become hideously broken because the host site’s global CSS (like div { padding: 50px }) was bleeding into your components?
In WXT v0.20, they overhauled style isolation. When you embed your UI using Shadow DOM, the framework now forces a style reset on inherited styles. A Real-Life Example: You’re building a productivity widget for Gmail. Previously, you had to write a ton of defensive CSS (all: unset, tons of !important) just to keep Google’s styles from ruining your layout. Now, WXT handles that dirty work. Your CSS looks exactly the way you intended. Finally!
3. Imports for Grown-Ups
Remember how tools like Nuxt allow you to use utilities without explicitly importing them everywhere? WXT is heading there too. They’ve refined their module system (#imports), making the code cleaner and the structure stricter. If you value order and clarity in your project, you’ll appreciate this shift.
Plasmo: Crickets Since May?
The situation with Plasmo is intriguing. I opened their releases page and… heard crickets. The latest major release in the main branch is v0.90.5, dated May 17, 2025.
Does this mean the project is dead? No. Does this mean it has become stable to the point of stagnation? Quite possibly.
What’s Still Great About Plasmo?
React 19 Support. They were quick to add support for React 19 earlier this year. If you are a seasoned React developer building a huge, complex dashboard inside an extension, Plasmo is still a solid bet. The Use Case: You need to implement a complex modal with lots of state, forms, and validation. In Plasmo, this feels exactly like building a regular React application. Their core feature, CSUI (Content Script UI), is arguably still the most declarative and comfortable way to render React components directly onto host pages.
But the half-year pause in activity is worrying. While WXT is adding Vite 7 support and fixes, Plasmo is just… working. On the tried-and-true Parcel (which, let’s be honest, is slower than Vite).
The Bottom Line: Who Is This For?
Let’s cut through the noise and get practical. Here’s a simple checklist.
Choose WXT (v0.20+), if:
- You are starting a brand new project today.
- Build speed is critical (Vite is a rocket ship).
- You need the smallest final bundle size (essential for free tools or slow connections).
- You aren’t strictly tied to React (it supports Vue, Svelte, and vanilla JS just as well).
- You want to be on the bleeding edge and get bug fixes fast.
Stick with Plasmo (v0.90.x), if:
- You have a large existing Plasmo project, and migrating would be corporate suicide.
- You absolutely rely on their proprietary Messaging API (for frontend/background communication) and don’t want to build your own.
- You are building a heavy Enterprise-grade UI on React and prioritize Plasmo’s proven stability over WXT’s current rapid development pace.
My Personal Takeaway: I recently moved my latest side project to WXT. Yes, I had to grapple with the v0.20 migration, but when I saw my build time drop from 15 seconds to 2 seconds, I stopped regretting the effort.
Which team are you on? Fast & Furious (WXT) or Slow & Steady (Plasmo)?
