extension.js is a free, open source build & deployment project written in TypeScript and released under MIT. It has 5,159 GitHub stars, 139 forks and 7 open issues, and was last pushed 5 hours ago. On this registry it ranks #27 of 59 tracked projects in Build & Deployment, with 5 head-to-head comparisons available.

What is extension.js?

What it is

extension.js is an open-source cross-browser extension framework written in TypeScript under the MIT license. It targets Chrome, Edge, Firefox, and Safari, and it lets developers build extensions without a separate build configuration for each browser.

The project addresses the fragmented development experience for browser extensions. The README names Manifest V3 fragmentation, browser-specific quirks, no hot reload for content scripts, and a separate build pipeline for every target. Extension.js reduces that overhead with one CLI, default Manifest V3 handling, and a workflow that can start from a template or be added to an existing extension.

Key capabilities

  • Hot Module Replacement works for popup, options, devtools, and other extension pages, including React, Vue, Svelte, and Preact components, while content scripts and the service worker receive targeted reloads.
  • Manifest V3 is the default target, with automatic adapters for Chrome, Edge, Firefox, and Safari.
  • One CLI runs Chrome, Edge, Firefox, and any Chromium or Gecko binary, with options for custom Chromium and Gecko binaries.
  • The workflow is zero config, so developers do not maintain webpack, rollup, or additional plugins.
  • Production builds can be created with extension build --zip, which the README says is ready for the Chrome Web Store and Firefox Add-ons.
  • Existing extensions can adopt the framework as a development dependency, and the CLI can run a GitHub sample directly or install a managed Firefox binary.

Who uses it and how

  • Extension developers use the create command to start a project, then run the development server to load the extension in a browser.
  • Teams working with React, Vue, Svelte, Preact, or TypeScript use one project structure while targeting Chrome, Edge, Firefox, and Safari.
  • Reviewers and collaborators can receive an unpublished build through extension.dev, which the README says hosts the build, share, and store submission side.
  • Developers testing browser behavior can use managed browser binaries or custom Chromium and Gecko binaries.

Getting started

The README shows installation with npx extension@latest create my-extension, followed by cd my-extension and npm run dev. It works with npm, pnpm, yarn, bun, and deno, and production builds use extension build --zip.

When to use it — and when not to

Extension.js is useful when a team wants one cross-browser workflow for Manifest V3 extensions and wants to avoid maintaining separate webpack, rollup, or plugin configurations for each browser. It compares itself to Plasmo, WXT, and CRXJS by emphasizing direct GitHub sample execution, managed browser binaries, targeted content-script reload, store-ready zip builds, and framework-agnostic templates. The README does not describe Docker deployment or a built-in database, SMTP, or storage service, and store submission remains a browser-side task.

project readme (upstream, from github) — read inline

Extension.js Version Downloads CI Discord OpenSSF Scorecard

The cross-browser extension framework. Build for Chrome, Edge, Firefox, and Safari with no build config required.

Logo
npx extension@latest create my-extension
cd my-extension
npm run dev

Works with npm, pnpm, yarn, bun, and deno.

Documentation · Templates · Examples · Discord

Why Extension.js

Browser extensions ship with the worst dev experience in modern web. Manifest V3 fragmentation, browser-specific quirks, no hot reload for content scripts, and a separate build pipeline for every target. Extension.js fixes that.

  • Hot Module Replacement for popup, options, devtools and other extension pages, including React, Vue, Svelte, and Preact components, with targeted reloads for content scripts and the service worker so one save never reloads the whole extension
  • Manifest V3 by default, with automatic adapters for Chrome, Edge, Firefox, and Safari targets
  • One CLI for Chrome, Edge, Firefox, and any Chromium or Gecko binary
  • Zero config, no webpack, no rollup, no plugins to maintain
  • First-class TypeScript, React, Vue, Svelte, and Preact support
  • Production builds with extension build --zip, ready for the Chrome Web Store and Firefox Add-ons
  • Drop-in for existing extensions with one devDependency

Watch it work

One command, and the extension is running in a real browser

Or skip the install and try a live template in your browser.

How is this different

If you have used Plasmo, WXT, or CRXJS, here is what Extension.js does that the others do not:

Capability Extension.js
Run any GitHub sample directly extension dev https://github.com/.../sample
Managed browser binaries extension install firefox downloads an isolated build
Targeted content-script reload across browsers Built in, only the changed entries re-inject, no plugin glue
Production zip for the stores extension build --zip
Framework agnostic Vanilla, TS, React, Vue, Svelte, Preact, no lock-in
Custom Chromium and Gecko binaries --chromium-binary, --gecko-binary

Extension.js is sponsored by extension.dev, the platform that hosts the build, share and store submission side of shipping an extension. To hand someone an unpublished build behind a link, with no zip and no install on their side, see Share an unpublished build for review.

Frameworks

ESNext TypeScript WASM React Vue Svelte Preact
ESNext
Try out
TypeScript
Try out
WASM
Try out
React
Try out
Vue
Try out
Svelte
Try out
Preact
Try out

Browsers

Use these flags with extension dev, extension start, or extension preview:

  • Select a browser: --browser
  • Custom Chromium binary: --chromium-binary
  • Custom Gecko (Firefox) binary: --gecko-binary
# Chrome (system default)
npx extension@latest dev --browser=chrome

# Edge
npx extension@latest dev --browser=edge

# Custom Chrome/Chromium path
npx extension@latest dev --chromium-binary "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"

# Custom Firefox path
npx extension@latest dev --gecko-binary "/Applications/Firefox.app/Contents/MacOS/firefox"
Chrome Edge Firefox Safari Chromium Gecko
Google Chrome
✅ Supported
Microsoft Edge
✅ Supported
Mozilla Firefox
✅ Supported
Apple Safari
✅ Supported
Chromium-based
✅ Supported
Gecko-based
✅ Supported

Ship to the store

Build a production-ready bundle and zip it for submission to the Chrome Web Store, Edge Add-ons, or Firefox AMO:

# Production build
npx extension@latest build

# Production build packaged as a ZIP
npx extension@latest build --zip

# Per-browser builds
npx extension@latest build --browser=firefox --zip

Useful flags:

  • --zip packages the build into a ZIP ready for store upload
  • --zip-source includes source files for store source-code review
  • --zip-filename controls the output filename
  • --polyfill enables the cross-browser webextension polyfill

Manage browser binaries

Skip the system-install dance. Extension.js can download and manage isolated browser binaries for clean dev sessions:

# Install a managed Firefox build
npx extension@latest install firefox

# Install Chrome and Edge in one go
npx extension@latest install --browser=all

# Print where managed browsers live
npx extension@latest install --where

Add to an existing extension

Install Extension.js as a dev dependency and wire up your scripts.

npm install extension@latest --save-dev
{
  "scripts": {
    "build": "extension build",
    "dev": "extension dev",
    "preview": "extension preview"
  }
}

Run npm run dev to develop, and watch the browser open with your extension already loaded:

[![extension dev: the browser opens with the extension loaded](https://media.extension.land/video/extension-js/dev-build-pr

readme truncated — read the full docs on github

Frequently asked questions

Is extension.js free to use?

extension.js is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does extension.js do?

The cross-browser extension framework.

What is extension.js written in?

extension.js is primarily written in TypeScript. Its source is publicly available at https://github.com/extension-js/extension.js, and it has 5,159 GitHub stars.