npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

extension

v4.1.26

Published

The cross-browser extension framework. Build Chrome, Edge, Firefox, and Safari extensions with no build configuration.

Readme

Extension.js Version Stars CI Discord Best Practices

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

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

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

The CLI itself runs on Node.js 22.12+, Deno 2.5+, and Bun 1.2+.

Documentation · Templates · YouTube · Showcase · Blog

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

| | | | | | | | | :-: | :-: | :-: | :-: | :-: | :-: | :-: | | ESNextTry out | TypeScriptTry out | WASMTry out | ReactTry out | VueTry out | SvelteTry out | PreactTry out |

Browsers

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

  • Select a browser: --browser <chrome | edge | firefox | safari>
  • Custom Chromium binary: --chromium-binary <path-to-binary>
  • Custom Gecko (Firefox) binary: --gecko-binary <path-to-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"

| | | | | | | | :-: | :-: | :-: | :-: | :-: | :-: | | 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 <name> 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

Use npm run build for production, and npm run preview to inspect the production output.

Start from a Chrome sample

Pull any sample from Chrome Extension Samples and run it directly:

npx extension@latest dev https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/functional-samples/sample.page-redder --browser=edge

Running a Chrome sample straight from its GitHub URL

Package managers

Add Extension.js to a project, or run it once without installing, with the package manager you already use.

| Package manager | Add to a project | Run without installing | | :-- | :-- | :-- | | npm | npm install extension@latest --save-dev | npx extension@latest create my-extension | | pnpm | pnpm add extension@latest --save-dev | pnpm dlx extension@latest create my-extension | | Yarn | yarn add extension@latest --dev | yarn dlx extension@latest create my-extension | | Bun | bun add --dev extension@latest | bunx extension@latest create my-extension | | Deno | deno add npm:extension@latest | deno run -A npm:extension@latest create my-extension |

Which runtime the CLI then executes on is a separate question, answered below.

Runtimes

| | Runtime | Status | Notes | | :-: | :-- | :-- | :-- | | | Node.js | ✅ 22.12 and newer | The default. npx, pnpm dlx, yarn dlx and bunx all land here through the published bin | | | Deno | ✅ 2.5 and newer | deno run -A npm:extension@latest. Deno 2.8.0 is refused because it cannot load node:querystring, fixed in 2.8.1 | | | Bun | ✅ 1.2 and newer | bunx --bun extension and bun run --bun. Plain bunx runs the CLI on Node.js instead, through the published bin |

Community

  • Star the repo if Extension.js helped you ship faster
  • Join the Discord for help and feedback
  • Open issues and feature requests on GitHub
  • Browse production-ready examples

Sponsors

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

Documentation is hosted by Mintlify through its open source program. Tiers and placement are listed in BACKERS.md.

Contributing

Bug reports and pull requests are welcome. Read docs/CONTRIBUTING.md for the dev setup, the test commands, and what a pull request needs to carry.

License

MIT (c) Cezar Augusto and the Extension.js authors.