The 2025 State of Browser Extension Frameworks: A Comparative Analysis of Plasmo, WXT, and CRXJS

✍️ Author: Remy

The 2025 State of Browser Extension Frameworks: A Comparative Analysis of Plasmo, WXT, and CRXJS

Section 1: Executive Summary

1.1. The Current Market Leader

The browser extension development landscape of 2025 is characterized by increasing complexity, driven by the mandatory transition to Manifest V3 (MV3) and persistent cross-browser API inconsistencies. In this challenging environment, a clear market leader has emerged. Analysis of the available frameworks, their feature sets, developer experience, and ecosystem health indicates that WXT has established itself as the definitive leading framework for modern browser extension development. This leadership position is founded on its superior developer experience, a robust and flexible feature set, a framework-agnostic architecture that offers broad compatibility, and, most critically, a track record of active and reliable open-source maintenance.

1.2. The Contenders at a Glance

The market is primarily defined by three key players, each with a distinct philosophy and set of trade-offs:

  • WXT: This report recommends WXT for the vast majority of new browser extension projects. It provides the most effective balance of powerful features, architectural flexibility, and long-term project stability. Its active community and proven adoption in high-scale production extensions further solidify its position as the most prudent and productive choice.
  • Plasmo: A powerful, highly-opinionated framework that offers an excellent initial developer experience, particularly for teams specializing in React. Its “Next.js for extensions” philosophy provides a streamlined, declarative workflow.However, its long-term viability is severely undermined by significant and widespread community concerns regarding its maintenance status and its reliance on the comparatively slower Parcel bundler, which has fallen behind in the modern tooling ecosystem.
  • CRXJS: A lightweight and capable Vite plugin, rather than a full-fledged framework. It excels at providing a best-in-class build process with superior Hot Module Replacement (HMR) for content scripts.CRXJS is the ideal choice for highly experienced teams who require maximum control and wish to avoid the abstractions of a full framework. However, its value proposition is narrowing as comprehensive frameworks like WXT adopt the same underlying Vite technology while offering a more complete out-of-the-box solution.

1.3. Key Strategic Imperative

A central finding of this report is that the technical landscape for browser extensions has matured to a point where minor feature differences between leading frameworks are less critical than the health and activity of their respective open-source ecosystems. The ability of a framework to provide timely updates for new browser versions, patch security vulnerabilities, and keep pace with the evolution of the broader JavaScript toolchain is paramount. Consequently, the demonstrable health of a framework’s community and the activity of its maintainers have become the single most important factors in technology selection, directly impacting long-term project risk and total cost of ownership.

Section 2: The Modern Browser Extension Development Landscape

To fully appreciate the value proposition of modern extension frameworks, it is essential to understand the complex technical environment in which they operate. Three primary challenges define the current landscape: the architectural shift to Manifest V3, persistent cross-browser API fragmentation, and the inherently disconnected nature of an extension’s core components. These challenges have collectively raised the baseline complexity of development, making the adoption of a robust framework a near necessity for any project of significant scale.

2.1. The Unavoidable Shift: Manifest V3 (MV3)

The transition from Manifest V2 to Manifest V3, driven primarily by Google for the Chrome browser, represents the most significant paradigm shift in extension architecture in years. The core change is the replacement of persistent background pages with ephemeral service workers.Under MV2, a background script could run indefinitely, maintaining state in memory for the entire browser session. Under MV3, the service worker is event-driven and can be terminated by the browser at any time to conserve resources, with no guarantee of its persistence.

This architectural change fundamentally alters how extensions must be designed. It forces developers to adopt a stateless, event-driven model, where any critical information must be persisted to storage before the service worker is terminated. This introduces significant complexity in managing application state, handling asynchronous operations, and ensuring that event listeners are properly registered upon worker reactivation. The move to MV3 enhances browser security and performance but places a much greater architectural burden on the developer, making the abstractions provided by modern frameworks more valuable than ever.

2.2. The Cross-Browser Conundrum

While the WebExtensions API has created a degree of standardization, developing for multiple browsers remains a significant challenge due to subtle but critical implementation differences.These inconsistencies fall into several categories:

  • API Namespace: Firefox and Safari primarily use the browser.* namespace for APIs, which returns Promises for asynchronous operations. Chromium-based browsers (Chrome, Edge, Opera) have historically used the callback-based chrome.* namespace, though they have been progressively adding Promise support.
  • Feature Availability: Entire API modules or specific methods within an API may be available in one browser but not another. For example, Firefox supports container tabs through the contextualIdentities API, a feature not present in Chrome.
  • Behavioral Differences: Even when an API is supported, its behavior can vary. A notable example is how content scripts interact with the host page’s JavaScript environment. Chrome uses a concept called “isolated worlds” to prevent conflicts, while Firefox employs a different security model known as “Xray vision”.

Manually managing these differences requires extensive conditional code, polyfills, and browser-specific build configurations. A primary function of a modern extension framework is to abstract away this complexity, providing a single, unified API that allows developers to “write once, deploy everywhere”.

2.3. The Intricacies of the Extension Lifecycle

A browser extension is not a monolithic application but a collection of distinct, often isolated, components that must communicate to function correctly.These components typically include:

  • Background Service Worker: The central event handler and state manager for the extension.
  • Popup UI: A transient HTML page displayed when the user clicks the extension’s toolbar icon.
  • Content Scripts: JavaScript and CSS files injected directly into web pages to read or modify their content.
  • Options Page: A persistent HTML page for user configuration.

These components operate in different contexts and cannot directly call functions or share memory. All communication must occur through a message-passing system, typically using the runtime.sendMessage and runtime.onMessage APIs.Managing this asynchronous communication, especially for complex interactions involving multiple components, often leads to a significant amount of boilerplate code and can be a common source of bugs. Frameworks aim to simplify this process by providing higher-level messaging APIs or other state management solutions. The combined weight of MV3’s lifecycle management, cross-browser API fragmentation, and the inherent complexity of the message-passing architecture makes building a non-trivial extension from scratch an inefficient and error-prone endeavor. Frameworks are no longer a development luxury; they are a strategic necessity for building maintainable, scalable, and robust browser extensions.

Section 3: In-Depth Analysis: Plasmo Framework

The Plasmo Framework positions itself as a “battery-packed browser extension SDK made by hackers for hackers,” aiming to provide a development experience for extensions analogous to what Next.js provides for web applications.It is built on a highly opinionated, declarative philosophy designed to minimize configuration and accelerate development, particularly for teams within the React ecosystem.

3.1. Architectural Deep Dive: The “Next.js for Extensions”

Plasmo’s core architectural principle is the abstraction of the manifest.json file. Instead of requiring developers to manually configure entrypoints and permissions, the framework generates the manifest automatically based on the project’s file structure.Files placed in specific directories or named according to convention (e.g.,

popup.tsx, options.tsx, content.ts, background.ts) are automatically recognized and wired into the final extension bundle.This declarative, file-based routing system is intentionally similar to that of Next.js, providing a familiar pattern for web developers.

A critical and differentiating architectural decision is Plasmo’s use of the Parcel bundler.While Parcel is known for its zero-configuration approach, this choice contrasts with competitors WXT and CRXJS, which have standardized on the more modern and performant Vite toolchain. As will be discussed, this reliance on Parcel has become a significant source of technical debt and a point of concern within the developer community.

3.2. Developer Experience (DX): Opinionated and Streamlined

Plasmo is explicitly designed with the React and TypeScript developer in mind, offering first-class support for this stack out of the box.The development workflow is initiated with a simple scaffolding command,

pnpm create plasmo, which can be augmented with flags to include integrations like TailwindCSS or Supabase from the start.

The development server provides live-reloading to automatically refresh the extension upon code changes. However, a key limitation of its developer experience is that its more advanced Hot Module Replacement (HMR) capabilities, which allow for stateful updates without a full reload, are optimized almost exclusively for React.Teams using the framework’s optional support for Vue or Svelte will not experience the same level of development velocity, as changes will often trigger a full extension reload.

3.3. Core Features and Abstractions

Plasmo’s “battery-packed” nature is evident in its rich set of built-in features and high-level abstractions designed to simplify common extension development tasks.

  • API Wrappers: The framework includes its own high-level APIs for core extension functionalities. The Storage API provides a simplified interface for persisting data, and the Messaging API abstracts the complexity of the underlying chrome.runtime.sendMessage system, making communication between the background, popup, and content scripts more straightforward.
  • Content Scripts UI (CSUI): This is one of Plasmo’s most compelling features. It provides a streamlined way to render complex UI components, such as those built with React, directly onto a webpage via a content script. Crucially, Plasmo can automatically wrap these UIs in a Shadow DOM, which isolates the extension’s CSS from the host page’s styles, preventing conflicts—a common and difficult problem to solve manually.
  • Deployment and Publishing: The Plasmo ecosystem extends beyond the core framework to include tooling for the entire extension lifecycle. The open-source Browser Platform Publisher (BPP) is a GitHub Action that automates the process of deploying an extension to the Chrome, Firefox, and Edge web stores.Additionally, Plasmo offers a commercial Software-as-a-Service (SaaS) product called
    Itero TestBed, which provides a staging environment for testing extensions and pushing updates to beta testers without undergoing the official store review process.

3.4. Ecosystem and Viability: A Cautionary Tale

Despite its impressive feature set and a large number of stars on GitHub (12.3k) 4, the long-term viability of the Plasmo framework is a matter of significant concern. There is a growing body of evidence from the developer community suggesting that the project is not being actively maintained at a level required for a production-critical tool.

WXT’s official comparison documentation explicitly states that Plasmo “Appears to be in maintenance mode with little to no maintainers or feature development happening”.This assertion is supported by anecdotal reports from developers on platforms like Reddit. One user strongly advised against adopting the framework, stating, “Anyone thinking of picking up Plasmo please don’t. They are lagging major versions behind with parcel and looking at the state of the code it isn’t an easy migration as well”.This dependency lag has tangible consequences, such as preventing the use of modern tools like TailwindCSS v4.

The existence of paid commercial tiers for services like Itero TestBed 18 further complicates the picture, raising questions about the project’s allocation of resources between its open-source framework and its commercial offerings. While a high star count indicates past popularity, the qualitative feedback from the community points to a project that is struggling to keep pace with the rapidly evolving web ecosystem.

This situation presents a classic “great idea, risky execution” dilemma. The conceptual model of Plasmo, with its declarative architecture and powerful abstractions, is nearly ideal for modern extension development. However, a framework’s value is inextricably linked to its ongoing maintenance. Adopting Plasmo for a new project means accepting a substantial risk that the framework will not receive timely updates to support future browser API changes, address security vulnerabilities, or maintain compatibility with the broader JavaScript toolchain. For most professional and enterprise teams, this level of risk is likely to outweigh the benefits of its feature set.

Section 4: In-Depth Analysis: WXT Framework

WXT presents itself as a “Next-gen Web Extension Framework,” drawing heavy inspiration from the developer-centric philosophies of Nuxt.js.Its design is predicated on two primary goals: providing a best-in-class Developer Experience (DX) and offering first-class, unified support for all major browsers.It has rapidly gained traction and is now widely regarded as the leading choice for building robust, cross-browser extensions.

4.1. Architectural Deep Dive: Nuxt-Inspired and Framework-Agnostic

The most significant architectural advantage of WXT is its frontend framework agnosticism. Unlike the React-centric approach of Plasmo, WXT is designed to work with any modern UI framework that has a Vite plugin. It provides pre-configured, official modules for the most popular choices—React, Vue, Svelte, and SolidJS—but does not preclude the use of others.This flexibility makes WXT an exceptionally versatile and future-proof choice, as it does not lock development teams into a specific UI technology.

At its core, WXT is built on top of Vite, the modern frontend build tool.This foundational choice provides WXT with significant performance benefits, including an extremely fast development server leveraging native ES modules for Hot Module Replacement (HMR) and highly optimized production builds powered by Rollup. This alignment with the modern Vite ecosystem is a key factor in its superior performance and developer experience.

4.2. Developer Experience (DX): Best-in-Class Tooling

WXT has been meticulously engineered to minimize developer friction and reduce boilerplate code through a suite of powerful DX features.

  • File-Based Entrypoints: Similar to Plasmo, WXT employs a file-based system where the manifest.json is generated automatically from the files present in the entrypoints/ directory.However, WXT enhances this pattern by allowing for inline configuration options directly within the entrypoint files, offering a greater degree of granular control over the manifest generation.
  • Auto-Imports: A standout feature inspired by Nuxt, WXT provides automatic, on-demand importing of components, hooks, and utility functions.This eliminates the need for dozens of manual
    import statements, resulting in cleaner, more concise code and a significant boost to developer productivity.
  • Dev Mode: The framework’s development mode is widely praised for its speed, offering “lightning fast HMR for UI development and fast reloads for content/background scripts”.User testimonials confirm a generally positive experience, with the caveat that websocket connections for hot reloading can occasionally be unstable.
  • CLI: Project scaffolding is handled by an interactive Command Line Interface (CLI), invoked via npx wxt@latest init. This tool guides the developer through selecting a project name, a UI framework template (including vanilla TypeScript), and other initial setup options, enabling a new project to be bootstrapped in seconds.

4.3. Core Features and Abstractions

WXT provides a comprehensive set of features that address the primary pain points of cross-browser extension development.

  • Unified Browser API: WXT exposes a global browser object that serves as a consistent, promise-based wrapper around the underlying WebExtensions APIs. This abstraction layer automatically handles the differences between Chrome’s chrome.* namespace and Firefox’s browser.* namespace, allowing developers to write a single, clean codebase that functions correctly across all target browsers.
  • Comprehensive Build & Publishing: The framework offers robust, built-in tooling for the entire deployment pipeline. It includes commands to generate optimized ZIP packages tailored for different browser stores, including the creation of a separate source code ZIP file, which is a requirement for submission to the Mozilla Add-ons store.Furthermore, WXT provides utilities to automate the process of uploading and publishing the extension.
  • Module System: For organizations that maintain a suite of related extensions, WXT offers a powerful module system. This feature enables the creation of reusable modules that can share both build-time configuration and runtime code across multiple extension projects, promoting code reuse and simplifying maintenance.

4.4. Ecosystem and Viability: Active and Thriving

WXT’s viability is strongly supported by its widespread adoption and active community. The framework’s official website showcases a gallery of popular, production-ready extensions built with WXT, including several with massive user bases, such as “Eye Dropper” (1,000,000+ users) and “ChatGPT Writer” (600,000+ users).This serves as powerful social proof of its stability and scalability.

The project is actively maintained, with a healthy and responsive presence on GitHub (7.9k stars) and an active community on Discord for user support.The sentiment among developers is overwhelmingly positive, with numerous public accounts of teams successfully migrating from Plasmo to WXT and reporting “significant improvements” in both performance and developer experience.

The framework’s architectural decision to be UI framework-agnostic is a significant strategic advantage. It not only caters to a wider developer audience but also future-proofs the projects built with it. By decoupling the core extension logic from the UI rendering layer, WXT ensures that teams can adopt the best UI technology for their needs without being constrained by the framework itself. This flexibility makes WXT a more resilient and strategically sound choice for long-term projects, as it can easily adapt to future trends in the frontend ecosystem.

Section 5: In-Depth Analysis: CRXJS Vite Plugin

CRXJS occupies a unique position in the extension development ecosystem. It is crucial to understand that CRXJS is not a comprehensive, all-in-one framework in the same vein as Plasmo or WXT. Instead, it is a highly-focused Vite plugin designed to solve the specific and complex challenges of bundling a browser extension using the modern Vite toolchain.Its philosophy is one of minimalism and control, providing essential build-time capabilities while intentionally avoiding application-level abstractions.

5.1. Architectural Deep Dive: A Tool, Not a Framework

The core purpose of @crxjs/vite-plugin is to bridge the gap between Vite’s development server and the unique requirements of the browser extension environment. It provides a zero-configuration setup that allows developers to leverage the full power of Vite and its extensive plugin ecosystem for extension development.

Unlike the file-based routing conventions of WXT and Plasmo, CRXJS adheres to a more traditional approach where the manifest.json file serves as the single source of truth for defining the extension’s entrypoints (background scripts, content scripts, popups, etc.).The plugin parses this manifest and configures Vite’s build process accordingly. This model appeals to developers who prefer the explicit configuration of the manifest over the convention-based “magic” of a full framework.

5.2. Developer Experience (DX): Lean and Unopinionated

The primary developer experience feature and key technical achievement of CRXJS is its implementation of “True Hot Module Replacement” that works for content scripts.This is a significant differentiator. While other tools can reload the UI of a popup or options page, CRXJS is able to inject updated code into a content script on a live webpage without requiring a full page refresh, preserving the state of the page and the extension. This provides a dramatic acceleration of the development feedback loop for extensions that are heavily reliant on content script functionality. Some community members have noted that this level of HMR for content scripts is not as effective in other frameworks, making CRXJS a superior choice for this specific use case.

The setup process is lean and straightforward: a developer initializes a standard Vite project, installs the @crxjs/vite-plugin package, and adds it to the vite.config.js file, pointing it to the project’s manifest.json.This minimalist approach grants developers maximum control, as they are free to structure their application and choose their own libraries for tasks like storage and messaging without being bound by framework conventions.

5.3. Core Features

CRXJS focuses on a narrow but critical set of responsibilities:

  • Vite Integration and HMR: Its main function is to correctly bundle all extension components using Vite and to manage the HMR connection for both extension pages (popups, options) and content scripts.
  • Web Accessible Resources: It automates the process of declaring assets in the web_accessible_resources field of the manifest. This is a common source of manual error for developers, and the plugin’s ability to automatically manage these entries based on static asset imports in the code is a significant quality-of-life improvement.

It is important to note what CRXJS does not provide. There are no built-in wrappers or abstractions for the browser’s Storage, Messaging, or Internationalization (i18n) APIs. Developers using CRXJS are expected to interact directly with the native chrome.* or browser.* APIs or to select and integrate their own third-party libraries for these purposes.

5.4. Ecosystem and Viability: Signs of Concern

The project’s history and maintenance status have been a source of concern for the community. The Vite plugin remained in a beta state for over three years before its official version 2.0.release in June 2025.During this extended beta period, there were discussions about the project being unmaintained or potentially archived, which may have impacted its adoption.

While a new, active team of maintainers has recently taken stewardship of the project and pushed the official 2.0.release, this history of instability may give potential adopters pause, especially for long-term enterprise projects.Its user base, as indicated by its 3.5k stars on GitHub, is smaller and more niche than that of its full-framework competitors.

The niche for a build-tool-only solution like CRXJS appears to be shrinking. Its primary value proposition—a high-performance, Vite-based build process with excellent HMR—is now also a core feature of comprehensive frameworks like WXT. A team choosing WXT gets the benefits of the Vite toolchain plus a rich set of valuable, pre-built runtime abstractions for storage, messaging, and cross-browser compatibility. A team choosing CRXJS would need to build or source these abstractions themselves, effectively re-implementing a portion of what a full framework already provides. Therefore, the ideal user for CRXJS is a developer or team with a very specific need for its superior content script HMR, or one that has a strong preference for minimal abstraction and is willing to manage all application-level concerns manually.

Section 6: Comparative Framework Analysis: A Head-to-Head Evaluation

A direct, feature-by-feature comparison of WXT, Plasmo, and CRXJS reveals a clear hierarchy in terms of completeness, developer experience, and project health. While each tool has its strengths, WXT consistently offers the most comprehensive and well-supported feature set, making it the most robust choice for a wide range of projects.

6.1. Detailed Feature Matrix

The following table provides a detailed comparison of the three leading frameworks across several key categories. The data is synthesized from official documentation, community discussions, and direct feature comparisons provided by the framework authors themselves.

Feature CategoryFeatureWXTPlasmoCRXJS
Project HealthActively Maintained✅🟡¹🟡²
GitHub Stars7.9k 2212.3k 43.5k 28
Developer ExperienceFirst-class TypeScript✅✅✅
Entrypoint Discovery✅ (File-based)✅ (File-based)❌³
Inline Entrypoint Config✅✅❌
Auto-imports✅❌❌
Reusable Module System✅❌❌
Supports All UI Frameworks✅🟡⁴✅
Build ToolsUnderlying BundlerViteParcelVite
Create Extension ZIPs✅✅❌
Create Firefox Sources ZIP✅❌❌
Automated Publishing✅✅❌
Remote Code Bundling✅✅❌
Dev Mode Features.env File Support✅✅✅
HMR for UIs✅🟡⁵✅
HMR for Content Scripts🟡⁶🟡⁶✅
Reload Background on Change🟡⁶🟡⁶🟡⁶
API WrappersStorage API✅✅❌⁷
Messaging API❌⁷✅❌⁷
Content Script UI✅✅❌⁷
Internationalization (i18n)✅❌❌
Browser/ManifestSupports All Browsers✅✅✅
MV2 Support✅✅🟡⁸
MV3 Support✅✅🟡⁸

Table Footnotes:
š Appears to be in maintenance mode with concerns about outdated dependencies.

² Has a history of being unmaintained, though a new team has recently become active.

Âł Entrypoints are configured exclusively in manifest.json.

⁴ First-class support is for React; support for Vue and Svelte is optional and less optimized.

⁾ HMR is optimized for React only; other frameworks trigger a full reload.

⁜ Reloads the entire extension rather than performing a true hot-module replacement.

⁡ No built-in wrapper is provided; developers must use native browser APIs or third-party libraries.

⁸ Supports either MV2 or MV3 in a given build, but not both from the same codebase simultaneously.

6.2. Analysis of Key Differentiators

The feature matrix highlights several critical areas where the frameworks diverge significantly, with important practical implications for development teams.

  • Maintenance & Viability: This is the most crucial differentiator. WXT demonstrates clear signs of active, healthy maintenance and strong community adoption.In stark contrast, both Plasmo and CRXJS carry significant red flags. Plasmo’s reliance on outdated dependencies and the community perception of it being in “maintenance mode” introduce substantial risk.CRXJS, despite a recent revival, has a history of instability that may deter risk-averse teams.For any project intended for long-term production use, WXT’s stability is a decisive advantage.
  • Developer Experience: WXT leads in overall developer experience due to its unique combination of features. Its auto-imports functionality is a powerful productivity booster not found in the other tools.While Plasmo’s initial setup is smooth for React developers, its React-only HMR is a notable limitation.CRXJS offers the best-in-class HMR for content scripts, but this single advantage is weighed against its lack of other DX features like auto-imports or file-based entrypoints.
  • Abstraction Level: The choice between these tools is also a choice of abstraction level. Plasmo and WXT are comprehensive frameworks that provide both build tooling and high-level runtime APIs for storage, messaging, and UI injection. This “all-in-one” approach accelerates development by providing solutions for common problems out of the box. CRXJS, on the other hand, is a tool that operates almost entirely at the build level. It requires a “bring your own abstractions” approach, offering maximum control and flexibility at the cost of increased initial development effort. As WXT’s abstractions are well-designed and optional, they provide a more productive starting point for most projects than the purely manual approach required by CRXJS.

Section 7: Performance and Build Tooling Deep Dive: Vite vs. Parcel

The choice of an underlying bundler is a foundational architectural decision that profoundly impacts both the developer experience during development and the performance of the final extension. The divergence between Vite (used by WXT and CRXJS) and Parcel (used by Plasmo) is a key technical differentiator that reflects a broader trend in the modern web development ecosystem.

7.1. The Bundler’s Impact

A bundler’s responsibilities include resolving module imports, transforming code (e.g., TypeScript to JavaScript, JSX to JS), optimizing assets, and packaging everything into files that a browser can execute. The efficiency of this process directly affects how quickly a developer can see their changes (dev server speed and HMR) and the size and speed of the final product (production build performance).

7.2. Vite (WXT, CRXJS): The Need for Speed

Vite has rapidly become the standard for modern frontend tooling due to its innovative architecture that prioritizes speed.Its performance advantages stem from two key design choices:

  • Native ESM Dev Server: During development, Vite does not bundle the application’s source code. Instead, it leverages the browser’s native support for ES modules (ESM). When a file is requested, Vite transforms and serves it on-demand. This approach results in a near-instantaneous server start time, regardless of the project’s size.
  • esbuild for Pre-Bundling: Vite uses esbuild, a bundler written in Go, to pre-bundle third-party dependencies from node_modules. Because esbuild is 10-100 times faster than JavaScript-based bundlers, this initial dependency-bundling step is incredibly fast.
  • Rollup for Production: For production builds, Vite uses Rollup, which is renowned for its highly optimized output and excellent tree-shaking capabilities, resulting in smaller, more efficient bundles.

The combination of these technologies provides the fast and responsive developer experience frequently praised by users of WXT and CRXJS.This choice aligns these frameworks with the cutting edge of the web development ecosystem.

7.3. Parcel (Plasmo): Simplicity at a Cost

Parcel’s primary design goal is simplicity through a zero-configuration experience.It is a capable bundler that can handle a wide variety of assets automatically. However, community feedback and developer testimonials indicate that this simplicity can come at the cost of performance, especially as projects grow in complexity.

Developers migrating from Plasmo to WXT have reported “significant improvements” and “much faster build and dev startup times”.Others have noted that Parcel’s caching and HMR can be “poor” and “slower” in the context of monorepos or larger projects.Furthermore, the fact that Plasmo is reportedly “lagging major versions behind with parcel” is a significant red flag.It suggests the project is accumulating technical debt and is unable to leverage the latest performance improvements and features from its own core dependency. This makes the choice of build tool a strong proxy for a framework’s overall health and modernity. WXT and CRXJS are built on a modern, high-performance foundation, while Plasmo’s foundation shows signs of aging.

7.4. Bundle Size and Runtime Performance

In the resource-constrained environment of a browser extension, every kilobyte of the bundle and every millisecond of execution time matters.Large extensions can contribute to browser lag, increase memory consumption, and lead to a poor user experience.

Frameworks that rely on large UI libraries like React can introduce a significant payload, especially for simple UIs like a popup.For performance-critical interfaces, a framework like Svelte, which compiles components to minimal vanilla JavaScript at build time and has no runtime library, can be a superior choice.WXT’s framework-agnostic nature is a distinct advantage here, as it allows developers to choose Svelte or another lightweight library for performance-sensitive parts of their extension.

The frameworks also offer tools for performance analysis and optimization. Plasmo, for instance, provides a —bundle-buddy flag to generate a visual report of the bundle’s composition and a —hoist flag to optimize dependency bundling, which can significantly improve speed and reduce size.Developers must leverage these tools and employ standard web performance techniques like code-splitting, tree-shaking, and lazy loading to ensure their extensions remain lean and responsive.

Section 8: Strategic Framework Selection: Recommendations for Project Archetypes

The optimal framework choice is not absolute but is contingent upon the specific context and constraints of a project. Factors such as team expertise, project scale, strategic priorities, and target platforms must be considered. This section provides a strategic decision matrix and detailed scenario analysis to guide technical leaders in selecting the most appropriate framework for their needs.

8.1. Framework Decision Matrix

The following table maps common project requirements to the suitability of each framework, translating the preceding technical analysis into actionable strategic guidance.

Project RequirementWXTPlasmoCRXJS
Team Expertise
React-Heavy TeamExcellentGood (DX) / Poor (Risk)Viable
Vue/Svelte/SolidJS TeamExcellentPoorViable
Polyglot / Agency TeamExcellentPoorGood
Project Scale
Small Prototype / MVPExcellentGoodGood
Mid-Sized ProductExcellentPoor (Risk)Viable
Enterprise SuiteExcellentPoor (Risk)Poor (Risk)
Strategic Priority
Fastest Time-to-MarketExcellentGoodGood
Long-Term MaintainabilityExcellentPoorPoor
Maximum Control / MinimalismGoodPoorExcellent
Target Platforms
Chrome-OnlyExcellentGoodExcellent
All Major BrowsersExcellentGoodGood

8.2. Detailed Scenario Analysis

The decision matrix can be further illuminated by examining several common project archetypes.

  • Scenario A: The Enterprise React Team
    • Context: A large organization with deep in-house React expertise is tasked with building a complex, mission-critical browser extension that will be supported for many years. Stability, security, and long-term maintainability are the highest priorities.
    • Analysis: At first glance, Plasmo’s React-first developer experience and Next.js-like patterns seem highly appealing.However, the significant and credible community concerns about its maintenance status and outdated dependencies introduce an unacceptable level of risk for a long-term enterprise product.The potential for the framework to become unmaintained or fall behind on critical browser updates or security patches is a deal-breaker.
    • Recommendation: WXT. WXT’s active maintenance, proven stability in large-scale applications, and excellent first-party support for React via the @wxt-dev/module-react package make it the most prudent and professional choice.It provides a comparable developer experience for React teams without the associated maintenance risk.
  • Scenario B: The Lean Startup / Indie Developer
    • Context: A small, agile team or a solo developer is building a Minimum Viable Product (MVP). The primary goal is to validate an idea and ship a functional product as quickly as possible.
    • Analysis: All three tools offer a fast initial setup. CRXJS is very quick to get started for a developer comfortable with Vite.However, a “fast start” is different from “fast to the finish line.” WXT’s rich set of built-in abstractions for common tasks like cross-browser storage and messaging will ultimately accelerate development more significantly by reducing the amount of boilerplate code that needs to be written from scratch.
    • Recommendation: WXT. Its combination of a fast scaffolding process, powerful DX features like auto-imports, and ready-made solutions for common extension problems makes it the fastest path from idea to a feature-complete MVP.
  • Scenario C: The Multi-Framework Agency
    • Context: A digital agency or consultancy that builds browser extensions for a variety of clients. These clients may have existing technology stacks and preferences for different UI frameworks, such as React, Vue, or Svelte.
    • Analysis: This scenario perfectly highlights the strategic advantage of WXT’s architecture. Its framework-agnostic nature is a killer feature for this use case.An agency can standardize its core extension development and build process on WXT, creating a consistent, efficient workflow across all projects. This allows them to accumulate institutional knowledge and reusable code (potentially using WXT’s module system) while retaining the flexibility to use the specific UI framework required by each client.
    • Recommendation: WXT. No other framework offers this level of flexibility. Adopting WXT allows the agency to serve a broader market without having to maintain separate, specialized toolchains for each UI framework.
  • Scenario D: The Performance Purist / Tooling Expert
    • Context: A developer building a highly-performant, lightweight extension where every kilobyte of bundle size and every millisecond of latency is critical. This developer is a tooling expert who prefers to have full, granular control over every dependency and build step, and is wary of framework “magic.”
    • Analysis: For this specific and advanced use case, the lack of abstractions in CRXJS becomes a feature, not a bug. The developer can leverage the powerful Vite build process and its best-in-class content script HMR without inheriting any of the runtime abstractions or conventions of a full framework.This allows them to hand-pick every library and write their own minimal, highly-optimized code for storage, messaging, and state management.
    • Recommendation: CRXJS. While this represents a niche, it is the scenario where CRXJS truly excels. It provides the essential build-time tooling needed for a modern development workflow while affording the expert developer the complete control they require.

Section 9: Conclusion and Future Outlook

9.1. Final Verdict

The analysis conducted in this report leads to a clear and confident conclusion: WXT is the superior choice for nearly all new browser extension projects in 2025. It successfully synthesizes the best aspects of the current tooling landscape, combining a modern, high-performance Vite-based architecture with a best-in-class developer experience that demonstrably accelerates development. Most importantly, it is backed by an active, healthy open-source community, providing the assurance of ongoing maintenance and long-term stability that is critical for professional software development.

While Plasmo offers a compelling vision and a polished experience for React developers, the significant risks associated with its maintenance status make it a difficult choice to recommend. CRXJS remains an excellent tool for a specific niche of experts who demand minimal abstraction, but its value proposition is increasingly being absorbed by more comprehensive frameworks like WXT that offer the same build-time advantages alongside valuable runtime features.

9.2. The Future of the Ecosystem

The browser extension framework space appears to be in a state of consolidation, moving from a period of rapid experimentation to one of maturation around a few dominant players. The technical debt and maintenance challenges evidently faced by Plasmo and CRXJS underscore the immense difficulty of sustaining complex open-source tooling in a fast-moving ecosystem. The success of WXT demonstrates that a successful framework must excel not only in its technical architecture but also in its community stewardship.

For technical decision-makers, the key takeaway is that the evaluation of open-source frameworks must now extend beyond a simple feature matrix. A thorough assessment of a project’s maintenance velocity, community engagement, and dependency freshness has become a non-negotiable part of the due diligence process. In the current landscape, the health of the community is the most reliable predictor of the long-term success and viability of a project. As such, the continued evolution and stewardship of the WXT framework will be the central trend to monitor in this space for the foreseeable future.

Works cited

  1. WXT: Next-gen Web Extension Framework, accessed September 3, 2025, https://wxt.dev/
  2. WXT: Next-Gen Web Extension Framework - Hacker News, accessed September 3, 2025, https://news.ycombinator.com/item?id=42347638
  3. Plasmo Framework – Plasmo, accessed September 3, 2025, https://docs.plasmo.com/framework
  4. PlasmoHQ/plasmo: The Browser Extension Framework - GitHub, accessed September 3, 2025, https://github.com/PlasmoHQ/plasmo
  5. I wrote WXT, a relatively new framework for building web extensions. AMA! - Reddit, accessed September 3, 2025, https://www.reddit.com/r/chrome_extensions/comments/1fs9om2/i_wrote_wxt_a_relatively_new_framework_for/
  6. Comparing frameworks for extension development: WXT vs Plasmo vs CRXJS - Reddit, accessed September 3, 2025, https://www.reddit.com/r/chrome_extensions/comments/1k1c8gv/comparing_frameworks_for_extension_development/
  7. crxjs/vite-plugin - NPM, accessed September 3, 2025, https://www.npmjs.com/package/@crxjs/vite-plugin
  8. Compare - WXT, accessed September 3, 2025, https://wxt.dev/guide/resources/compare
  9. Build a cross-browser extension - MDN - Mozilla, accessed September 3, 2025, https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Build_a_cross_browser_extension
  10. Creating a Browser Extension using SolidJS + WXT II | by Michael Essiet - Medium, accessed September 3, 2025, https://devshogun.medium.com/creating-a-browser-extension-using-solidjs-wxt-ii-2ff10fcafc98
  11. Building AI-Powered Browser Extensions With WXT - Marmelab, accessed September 3, 2025, https://marmelab.com/blog/2025/04/15/browser-extension-form-ai-wxt.html
  12. Best Browser Extension Framework: Choose the Right One - iotric, accessed September 3, 2025, https://www.iotric.com/blog/best-browser-extension-framework/
  13. Chrome Extension with React, Vite (No CrxJS Plugin) | Medium - Ajay n Jain, accessed September 3, 2025, https://ajaynjain.medium.com/how-i-built-a-chrome-extension-with-react-and-vite-without-crxjs-plugin-b607194c4f5e
  14. More on @crxjs/vite-plugin - Honwhy Blog, accessed September 3, 2025, https://honwhy.wang/blog/java/more-on-crxyjs-vite-plugin/
  15. Beyond the Popup: Crafting Next-Level Chrome Extensions with CRXJS - zerodays, accessed September 3, 2025, https://www.zerodays.dev/sl/blog/beyond-the-popup-crafting-next-level-chrome-extensions-with-crxjs
  16. The 3 Chrome extension framework you’ll ever need - Ful.io, accessed September 3, 2025, https://ful.io/blog/the-3-chrome-extension-framework-youll-ever-need
  17. Plasmo - the browser extension framework : r/chrome_extensions - Reddit, accessed September 3, 2025, https://www.reddit.com/r/chrome_extensions/comments/14346cu/plasmo_the_browser_extension_framework/
  18. Plasmo: Supercharge your browser extension development, accessed September 3, 2025, https://www.plasmo.com/
  19. Introduction to Plasmo – Plasmo, accessed September 3, 2025, https://docs.plasmo.com/
  20. Plasmo - GitHub, accessed September 3, 2025, https://github.com/plasmohq
  21. Welcome to WXT – WXT, accessed September 3, 2025, https://wxt.dev/guide/introduction
  22. wxt-dev/wxt: Next-gen Web Extension Framework - GitHub, accessed September 3, 2025, https://github.com/wxt-dev/wxt
  23. Frontend Frameworks - WXT, accessed September 3, 2025, https://wxt.dev/guide/essentials/frontend-frameworks
  24. Developing web extensions with the WXT library - LogRocket Blog, accessed September 3, 2025, https://blog.logrocket.com/developing-web-extensions-wxt-library/
  25. Frameworks for developing browser extensions - Chuniversiteit.nl, accessed September 3, 2025, https://chuniversiteit.nl/programming/developing-chrome-extensions
  26. Create a project | CRXJS Vite Plugin, accessed September 3, 2025, https://crxjs.dev/vite-plugin/getting-started/vanilla-js/create-project
  27. Releases ¡ crxjs/chrome-extension-tools - GitHub, accessed September 3, 2025, https://github.com/crxjs/chrome-extension-tools/releases
  28. crxjs - GitHub, accessed September 3, 2025, https://github.com/crxjs
  29. crxjs chrome-extension-tools ¡ Discussions - GitHub, accessed September 3, 2025, https://github.com/crxjs/chrome-extension-tools/discussions
  30. Parcel vs Vite: Choosing the Right Frontend Build Tool | Better Stack Community, accessed September 3, 2025, https://betterstack.com/community/guides/scaling-nodejs/parcel-vs-vite/
  31. Vite vs. Webpack: A Head-to-Head Comparison - KinstaÂŽ, accessed September 3, 2025, https://kinsta.com/blog/vite-vs-webpack/
  32. Why Vite, accessed September 3, 2025, https://vite.dev/guide/why
  33. Why I switched from Parcel to Vite ? - Anoop Jadhav | Blogs, accessed September 3, 2025, https://blog.anoopjadhav.in/why-i-switched-from-parcel-to-vite
  34. Why Your Browser Extension is Slower Than It Should Be (And How Svelte Fixes It), accessed September 3, 2025, https://hexshift.medium.com/why-your-browser-extension-is-slower-than-it-should-be-and-how-svelte-fixes-it-15a71063d7f0
  35. Impact of Extensions on Browser Performance: An Empirical Study on Google Chrome, accessed September 3, 2025, https://arxiv.org/html/2404.06827v1
  36. Create a Production Build - Plasmo Docs, accessed September 3, 2025, https://docs.plasmo.com/framework/workflows/build
  37. Mastering Bundle Size: Inspect and Minify Your Web App’s Main Chunk | by Bachri, accessed September 3, 2025, https://javascript.plainenglish.io/inspect-and-reduce-your-web-apps-main-bundle-bd3fce587aa7
  38. 8 Ways to Optimize Your JavaScript Bundle Size - Codecov, accessed September 3, 2025, https://about.codecov.io/blog/8-ways-to-optimize-your-javascript-bundle-size/