extension.config.js (or .mjs / .cjs) from your project root and applies settings to every command and the bundler config.
How it works
Addextension.config.js at your project root (same level as package.json in typical setups).
Supported file names:
extension.config.jsextension.config.mjsextension.config.cjs
| Key | Description |
|---|---|
browser | Browser-specific defaults keyed by browser target. |
commands | Per-command defaults (dev, start, preview, build). |
extensions | Companion extensions applied across commands (load-only). |
transpilePackages | Default package transpile allowlist (Monorepo/workspace support). |
config | Hook to extend/override the generated Rspack config. |
Environment loading for config files
extension.config.* runs in Node and should read values from process.env.*.
- Extension.js preloads env files before evaluating
extension.config.*. - It first checks the project folder.
- In monorepos, if Extension.js finds no project-local
.env*file, it falls back to the nearest workspace root. The workspace root is the folder containingpnpm-workspace.yaml. - Prefer built-in env preload over importing
dotenvin your config file.
Browser configuration
Need different browser defaults per target? Usebrowser:
chrome, edge, firefox, chromium, chromium-based, gecko-based, firefox-based.
Common browser fields:
profile,persistProfilepreferencesbrowserFlags,excludeBrowserFlagschromiumBinary,geckoBinaryextensions(companion load-only extensions)
Browser target capabilities
| Key | What it does |
|---|---|
profile | Sets the browser profile path (or profile behavior) used when launching. |
persistProfile | Reuses profile data between runs. |
preferences | Applies browser preference overrides. |
browserFlags | Adds launch flags for the browser process. |
excludeBrowserFlags | Removes default launch flags you do not want. |
chromiumBinary | Uses a custom Chromium-family binary path. |
geckoBinary | Uses a custom Gecko/Firefox binary path. |
extensions | Loads companion extensions together with the main extension. |
Commands configuration
Usecommands to define defaults per command:
- Extension.js merges top-level
extensionsandtranspilePackagesinto command defaults. - Per-command values override top-level values.
- The
startcommand runsbuildthenpreviewinternally. Extension.js applies settings fromcommands.start. You can also put build-specific settings incommands.build. For finer control over browser-launch settings, usecommands.preview.
Command capabilities (shared)
| Key | Applies to | What it does |
|---|---|---|
browser | dev, start, preview, build | Sets browser or browser-family target. |
profile | dev, start, preview | Sets browser profile path/behavior. |
persistProfile | dev, start, preview | Reuses browser profile data between runs. |
chromiumBinary | dev, start, preview | Uses a custom Chromium-family binary. |
geckoBinary | dev, start, preview | Uses a custom Gecko-family binary. |
polyfill | dev, start, build | Enables compatibility polyfill behavior where relevant. |
startingUrl | dev, start, preview | Opens a specific URL on browser launch. |
port | dev, start, preview | Sets runner/devtools port. |
host | dev, start, preview | Sets dev server host. Use 0.0.0.0 for Docker/devcontainers. |
noBrowser | dev, start, preview | Disables browser launch. |
extensions | dev, start, preview, build | Loads companion extensions (or extension list). |
install | dev, start, build | Installs missing dependencies before running. |
transpilePackages | dev, start, preview, build | Transpiles listed workspace/external packages. |
build command capabilities
| Key | What it does |
|---|---|
zip | Generates a packaged zip artifact. |
zipSource | Adds source bundle/archive output for review/compliance workflows. |
zipFilename | Sets a custom zip output filename. |
silent | Reduces build log output. |
dev command capabilities
| Key | What it does |
|---|---|
noOpen | Runs dev server without auto-opening browser. |
source | Enables source-inspection flow from a remote source URL. |
watchSource | Re-runs source inspection when watched updates occur. |
sourceFormat | Sets source output format (pretty, json, ndjson). |
sourceSummary | Emits compact source summary output. |
sourceMeta | Includes page metadata in source output. |
sourceProbe | Probes source output with specific CSS selectors. |
sourceTree | Controls compact extension tree output. |
sourceConsole | Includes console summary in source output. |
sourceDom | Includes DOM snapshots/diffs in source output. |
sourceMaxBytes | Caps source output payload size. |
sourceRedact | Controls source redaction strategy. |
sourceIncludeShadow | Controls Shadow DOM inclusion strategy. |
sourceDiff | Includes diff metadata on source watch updates. |
Logging capabilities
| Key | Applies to | What it does |
|---|---|---|
logs | dev, start, preview | Sets minimum log level (off to all). |
logContext | dev, start, preview | Filters logs by context (background, content, etc.). |
logFormat | dev, start, preview | Sets output format (pretty, json, ndjson). |
logUrl | dev, start, preview | Filters logs by URL pattern. |
logTab | dev, start, preview | Filters logs by tab ID. |
Rspack configuration
Need advanced bundler customization? Useconfig to patch the generated Rspack config:
config may also be an object, which Extension.js merges on top of the generated config.
Full sample
Best practices
- Keep browser-specific values in
browser: Keep command definitions focused on workflow, not browser internals. - Use top-level defaults intentionally: Put shared
extensions/transpilePackagesat root; override only where needed. - Prefer
chromiumBinary/geckoBinarynames: They align with current command and type surface. - Keep
confighook minimal: Add only what first-class Extension.js options do not cover.
Next steps
- Learn more about browsers available.
- Learn more about Rspack configuration.

