Build and package the same extension for multiple browsers with predictable outputs. Ship the same extension to Chrome, Edge, and Firefox without maintaining separate build scripts. Extension.js runs production builds per target and writes artifacts toDocumentation Index
Fetch the complete documentation index at: https://extension.js.org/llms.txt
Use this file to discover all available pages before exploring further.
dist/<browser>. It can also generate zip packages for distribution.
How it works
Run a production build:chromium unless you override it.
Browser selection
You can target a specific browser/engine:chromeedgefirefoxchromiumchromium-basedgecko-based/firefox-based(aliases)
chrome, edge, and firefox.
Output layout
Each target writes to its own folder:dist/chromedist/edgedist/firefoxdist/chromiumdist/chromium-baseddist/gecko-based
Build capabilities
| Option | What it does |
|---|---|
--browser=<target> | Builds for a specific browser or engine family. |
--zip | Creates a distribution zip per target output. |
--zip-filename=<name> | Overrides the default zip file name. |
--zip-source | Creates a source archive alongside output. |
--polyfill | Enables compatibility behavior for browser.* API usage in Chromium-family targets. |
Generating a zip file
Generate a distribution zip from each target output with--zip:
name + version, for example:
my-extension-1.0.0.zip
my-release.zip inside the target dist/<browser> folder.
Include source archive
Use--zip-source to generate a source archive alongside distribution output.
--zip-source produces:
dist/<name>-<version>-source.zip
Polyfilling browser APIs
If your code relies on Gecko-stylebrowser.* APIs and you need Chromium compatibility, enable --polyfill:
Best practices
- Build per target in continuous integration (CI): Treat each browser output as an independent artifact.
- Use a browser matrix command for parity checks: Catch target-specific issues early in one pipeline step.
- Package intentionally: Use
--zipfor store uploads and--zip-sourcefor traceable source artifacts. - Keep target configuration explicit: Use
extension.config.*command/browser defaults for reproducible builds.
Next steps
- Learn more about the Browsers available.
- Explore Path resolution for asset/output mapping details.

