MCPcopy
hub / github.com/extension-js/extension.js

github.com/extension-js/extension.js @v4.0.3 sqlite

repository ↗ · DeepWiki ↗ · release v4.0.3 ↗
2,590 symbols 7,220 edges 666 files 21 documented · 1%
README

Extension.js Version Downloads Stars CI Discord

Build extensions for Chrome, Edge, and Firefox. No build config required.

Logo

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

Works with npm, pnpm, yarn, and bun.

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 background, content, popup, and options scripts, including React, Vue, Svelte, and Preact components
  • Manifest V3 by default, with automatic adapters for Chrome, Edge, and Firefox 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

60-second demo

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
Cross-browser HMR for content scripts Built in, 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

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 <chrome | edge | firefox>
  • 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"
Chrome Edge Firefox Safari Chromium Gecko
Google Chrome

✅ Supported | Microsoft Edge

✅ Supported | Mozilla Firefox

✅ Supported | Apple Safari

🚙 Next | 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, npm run build for production, and npm run preview to inspect the production output. See it in action.

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

Watch demo

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

License

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

Extension points exported contracts — how you extend this code

ControlServer (Interface)
(no doc) [7 implementers]
programs/develop/dev-server/control-bridge/ws-control-server.ts
UnifiedLoggerConfig (Interface)
Unified-logger output options shared by the long-running commands.
programs/extension/config-types.ts
InstallOptions (Interface)
(no doc)
programs/install/module.ts
CreateLogger (Interface)
(no doc)
programs/create/module.ts
LogEvent (Interface)
(no doc)
extensions/extension-js-devtools/src/types/logger.ts
RunnerPlugin (Interface)
(no doc) [63 implementers]
programs/develop/plugin-browsers/index.ts
BrowserLaunchConfig (Interface)
Browser launch options shared across commands and per-browser overrides.
programs/extension/config-types.ts
UninstallOptions (Interface)
(no doc)
programs/install/module.ts

Core symbols most depended-on inside this repo

push
called by 472
programs/develop/dev-server/control-bridge/ring-buffer.ts
apply
called by 202
programs/develop/plugin-browsers/index.ts
code
called by 184
programs/extension/helpers/messages.ts
resolve
called by 109
programs/develop/lib/manifest-utils.ts
tap
called by 88
programs/develop/plugin-web-extension/feature-scripts/steps/setup-reload-strategy/webpack-target-webextension-fork/lib/webpack5/ChunkLoader.ts
getLoggingPrefix
called by 84
programs/extension/browsers/browsers-lib/messages.ts
arg
called by 75
programs/extension/helpers/messages.ts
getFilename
called by 41
programs/develop/plugin-web-extension/shared/paths.ts

Shape

Function 1,804
Method 395
Class 230
Interface 161

Languages

TypeScript100%

Modules by API surface

programs/extension/browsers/browsers-lib/messages.ts109 symbols
programs/develop/lib/messages.ts59 symbols
scripts/run-optional-deps-smoke.mjs39 symbols
programs/develop/lib/optional-deps-resolver.ts37 symbols
programs/create/lib/messages.ts33 symbols
programs/develop/dev-server/control-bridge/broker.ts26 symbols
programs/extension/helpers/telemetry.ts22 symbols
programs/extension/browsers/run-safari/safari-launch/safari-config.ts22 symbols
programs/develop/plugin-browsers/index.ts22 symbols
programs/extension/browsers/run-firefox/firefox-launch/index.ts21 symbols
programs/extension/browsers/run-chromium/cdp/cdp-client.ts21 symbols
extensions/extension-js-devtools/src/background/log-central.ts21 symbols

Dependencies from manifests, versioned

@biomejs/biome2.4.5 · 1×
@changesets/cli2.29.8 · 1×
@playwright/test1.58.2 · 1×
@prefresh/core1.5.9 · 1×
@prefresh/utils1.2.1 · 1×
@prefresh/webpack4.0.6 · 1×
@radix-ui/react-avatar1.1.11 · 1×
@radix-ui/react-checkbox1.1.1 · 1×
@radix-ui/react-collapsible1.0.3 · 1×
@radix-ui/react-dialog1.1.3 · 1×
@radix-ui/react-dropdown-menu2.1.1 · 1×
@radix-ui/react-label2.1.0 · 1×

For agents

$ claude mcp add extension.js \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact