Skip to main content
Run popular Chromium and Gecko forks either by name (Extension.js locates the installed binary for you) or by providing an explicit binary path. Test Brave, Opera, Vivaldi, Yandex, Waterfox, and LibreWolf from the same Extension.js workflow. Name the fork directly, or point at any custom binary with binary flags and extension.config.* in dev, start, and preview.

Run a fork by name

These forks are first-class browser targets. Pass the name to --browser and Extension.js finds the installed binary on your system automatically, running it through its engine family’s launcher:
If the browser is not installed, Extension.js exits with install guidance. A named fork inherits its family’s manifest keys, so chromium:/firefox: prefixed fields resolve correctly (see Browser-specific manifest fields).
The dev, build, start, and preview help output all list every fork name. The start and preview lists leave out safari and webkit-based because those two commands refuse Safari targets by design.

Run a custom binary

To run a browser without a built-in locator, or to override the located binary, use one of these flags:
  • --chromium-binary <path>
  • --gecko-binary <path> (alias: --firefox-binary <path>)
These binary flags override which browser binary Extension.js launches, regardless of the named browser target you selected.

Binary capabilities

CLI examples

You can also use them with start and preview.

Find the binary path per OS

The binary flags expect an executable file. An invalid path fails fast with an error instead of launching.

macOS

On macOS, an app such as /Applications/Brave Browser.app is a folder, not an executable. Pass the executable inside the bundle, at Contents/MacOS:
The executable name can differ from the app name. List the folder to find it:

Windows

Quote the path and use forward slashes, which every shell accepts:
Backslashes also work, but many shells require you to double them, as in C:\\Program Files\\....

Linux

Pass the executable that your package manager installed:
Run which brave-browser to print the path when the binary is on your PATH.

Configure in extension.config.*

You can also place binary paths in command blocks:

Target mapping behavior

Binary hints map to engine targets:
  • chromiumBinarychromium-based
  • geckoBinary / firefoxBinarygecko-based
If you provide both, Extension.js applies Chromium binary resolution first.

Available browsers

Forks with a built-in locator run by name; anything else runs with a binary flag:

Important constraints

  • chromium-based requires --chromium-binary (or chromiumBinary in config). Without it the launch hard-exits with an error. There is no fallback to a system browser.
  • gecko-based / firefox-based require a valid geckoBinary path.
  • Invalid paths fail fast with a clear CLI/runtime error.
  • build does not accept binary flags. You can use binary-based launching only with dev, start, and preview.

Edge binary override

Set the EDGE_BINARY environment variable to launch --browser=edge from a specific binary, without touching config:
If the path does not exist, the launch fails instead of silently falling back.

Run without launching a browser

Sometimes the right browser count is zero, for example in containers, over SSH, or when you drive a browser yourself. Pass --no-browser to dev, start, or preview:
The dev loop stays complete. The server watches your files, and every rebuild broadcasts a reload. After the first successful compile, the terminal prints a (no-browser mode) banner that names the output folder. Load that dist/<browser> folder into a browser that you already run. In Chromium browsers, choose “Load unpacked” at chrome://extensions with Developer mode on. The loaded extension keeps updating on save. See dev for readiness synchronization with --wait. To make this the default for a command, set noBrowser in config. The CLI flag wins over the config value:

Opt out of injected defaults

dev, start, and preview inject launch defaults into every session. One visible default is dark appearance. Chromium targets get the --force-dark-mode and --enable-features=WebUIDarkMode flags. Gecko targets get the matching dark preferences. To keep your system appearance, list the flag in excludeBrowserFlags:
Excluding --force-dark-mode drops the whole appearance bundle, including the Gecko preferences. An exclude entry also matches by switch name, so --enable-features removes --enable-features=WebUIDarkMode. See Browser flags for the default flag list and the full exclusion rules.

Best practices

  • Pair binaries with explicit browser target: Use --browser=chromium-based or --browser=gecko-based for predictable intent.
  • Use absolute paths: Avoid shell-dependent path resolution issues.
  • Version-pin in continuous integration (CI) runners: Keep browser binary paths deterministic for automated checks.
  • Combine with profile/flags carefully: Reuse the same profile and flag strategy used for named browser targets.

Next steps