Why this matters
Browsers still differ in key manifest areas, like background configuration and vendor metadata. Prefixed fields let you keep one sourcemanifest.json while producing browser-correct output for Chromium-family and Firefox-family targets.
How it works
Extension.js scans manifest keys and resolves prefixed entries for the selected browser:- Chromium-family targets (
chrome,edge,chromium-based) resolve:chromium:,chrome:,edge: - Gecko-family targets (
firefox,gecko-based) resolve:firefox:,gecko:
For Chromium-based browsers (Chrome, Edge, …)
For Firefox
service_worker available only for Chromium-family outputs while keeping background.scripts for Firefox outputs.
Supported prefix map:
| Prefix | Included for target browser |
|---|---|
chromium: | chrome, edge, chromium-based |
chrome: | chrome, chromium-based |
edge: | edge, chromium-based |
firefox: | firefox, gecko-based, firefox-based |
gecko: | firefox, gecko-based, firefox-based |
permissions, content_scripts, and background.
Best practices
- Keep shared defaults unprefixed: Put common fields in regular manifest keys, then prefix only browser-specific differences.
- Prefix only when behavior diverges: Use browser prefixes when runtime requirements differ.
- Build per target in continuous integration (CI): Generate and verify each browser output (
dist/<browser>) to catch compatibility regressions early. - Validate with MDN: Use MDN Web Docs to confirm support before adding browser-only settings.
Next steps
- Learn more about the Browsers available.
- Learn more about Cross-browser compatibility.

