The cross-browser extension framework

Build browser extensions for Chrome, Edge, and Firefox with one modern workflow. Extension.js handles manifest compilation, browser-specific output, reload behavior, and packaging so you can focus on product features.

npx extension@latest create my-extension

Watch the full developer workflow

From scaffold to running extension, in one modern toolchain.

Extension.js welcome page preview
Click to expand

From developers worldwide

Real feedback from developers and teams experimenting with Extension.js.

Core features for the full extension lifecycle

Build, test, and ship for every browser with one modern extension workflow.

Compile one extension into browser-specific output

Chrome browser iconFirefox browser iconEdge browser icon

Build once for Chrome, Edge, Firefox, and custom Chromium or Gecko targets, while keeping browser-specific output predictable across development, testing, and release builds.

Keep extension structure explicit

Keep your manifest, paths, and emitted assets in sync as your extension grows.

Use the lightest safe path

Get the fastest safe update path for every change, from HMR to full restarts.

Bring your preferred stack

React framework iconVue framework iconSvelte framework icon

Start with React, Vue, Svelte, TypeScript, or JavaScript and keep one workflow, so your team can choose the right UI model without changing the core extension toolchain.

Build, preview, and package with one flow

Build, preview, and package for each browser from the same project, with a release flow that stays clear from first local check to store-ready artifacts.

Inject environment values cleanly

Environment doc icon

Load environment values by browser and mode, then replace them in JavaScript, JSON, and HTML.

Pick your framework. Keep your workflow.

Start with production-ready templates for React, Vue, Svelte, TypeScript, or JavaScript.

React

React icon

Build polished extension interfaces with React, strong tooling, and a mature component ecosystem.

Preact

Preact icon

Build polished extension interfaces with Preact, lighter bundles, and familiar JSX you know well.

Vue

Vue icon

Build polished extension interfaces with Vue, single-file flow, and predictable structure in UIs.

Svelte

Svelte icon

Build polished extension interfaces with Svelte, lean components, and tiny runtime in shipped UI.

TypeScript

TypeScript icon

Build polished extension interfaces with TypeScript, static typing, and safer refactors at scale.

JavaScript

JavaScript icon

Build polished extension interfaces with JavaScript, light tooling, and quick sketch-to-UI speed.

Backing the open source core

Sponsors help us ship faster releases, better developer experience, and long-term reliability for extension teams.

TestMu AI logo

Developer FAQ

Common questions about building browser extensions with Extension.js—from hot reload and cross-browser builds to Manifest V3, frameworks, and monorepo support.

Run npx extension dev and the CLI watches your project for changes. Edits to popups, content scripts, background service workers, and options pages trigger the fastest safe update path available—HMR when the browser platform supports it, targeted reloads when it does not.

You stay in the editor and the browser instead of restarting manually or maintaining custom reload scripts. The CLI resolves common pain points like stale service workers and missed content-script updates automatically.

Extension.js compiles a single codebase into browser-specific output. One set of commands produces correctly packaged builds for Chrome, Edge, Firefox, and other Chromium-based browsers, each with the right manifest format, paths, and platform adjustments.

This eliminates the need for parallel project trees or fragile shell scripts per browser. Your CI pipeline uses the same build step with different browser flags, reducing drift between store submissions.

Yes. Extension.js ships production-ready templates for React, Vue, Svelte, TypeScript, and plain JavaScript. You write components and UI the same way you would in any frontend project—the CLI handles the extension-specific compilation, manifest wiring, and browser packaging.

Framework choice does not affect the core workflow. Create, develop, build, and package commands work identically regardless of your UI stack.

Yes. The toolchain is built around Manifest V3 and the constraints that browser stores enforce today—service workers, declarative APIs, updated permissions, and stricter packaging rules. MV3 is the default, not an afterthought.

Extension.js surfaces manifest issues during development so problems appear before store submission, not after. You keep full control over permissions, host access, and content security policies.

Extension.js replaces the extension-specific glue code in hand-rolled bundler configs: manifest versioning, multi-browser output, content-script injection boundaries, and reload orchestration. You move your source files and manifest into an Extension.js project and the CLI handles the rest.

Your existing React, Vue, Svelte, or TypeScript code works without rewriting. The migration removes maintenance overhead around build tooling while preserving the UI patterns your team already uses.

Extension.js supports pnpm, npm, and Yarn workspaces in monorepo setups. Path resolution and shared dependencies work correctly across workspace boundaries, so you know exactly which files end up in the shipped extension package.

Environment variables are injected per browser and build mode, with replacement applied across JavaScript, JSON, and HTML. Values stay scoped to the right surface—development secrets never leak into production bundles.