> ## Documentation Index
> Fetch the complete documentation index at: https://extension.js.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Browser launch flags for Chrome, Firefox, and Edge

> Use firefox://flags, chrome://flags, and browser launch flags in Extension.js. Control Chrome, Firefox, and Edge runtime behavior during extension development.

<AvatarBrowsers browsers={["chrome", "firefox", "edge"]} />

Control browser launch behavior for debugging, automation, and runtime
experiments.

<Note>
  **Looking for `chrome://flags` or `edge://flags`?** Type it into your address
  bar — that's the browser's built-in page. **Firefox has no `firefox://flags`**;
  use `about:config` instead.

  If you're toggling flags to **test or build a browser extension**, Extension.js
  applies them per-project automatically across Chrome, Edge, and Firefox — so you
  don't pass flags by hand on every run. [Create your first extension in 30
  seconds →](/docs/getting-started)
</Note>

Tune browser launch behavior without changing extension source code. Extension.js merges browser flags from your `extension.config.*` and applies them in `dev`, `preview`, and `start` flows.

## Does Firefox have `firefox://flags`?

Firefox does not use `firefox://flags` the way Chromium browsers use `chrome://flags` or `edge://flags`. Firefox exposes runtime toggles through `about:config` (preferences) and accepts launch flags from the command line.

If you searched for `firefox://flags`, `firefox //flags`, `browser://flags`, `mozilla://flags`, or `about flags firefox`, you are probably trying to change browser behavior during extension development. In Extension.js, do that in two places:

* Use [`browserFlags`](/docs/browsers/browser-flags) for launch-time flags Extension.js passes to the browser binary.
* Use [Firefox preferences](/docs/browsers/browser-preferences) for repeatable Gecko runtime behavior that would otherwise live in `about:config`.

Both work for Chrome, Edge, and Firefox extension development from the same Extension.js project.

## Flags in other browsers

Extension.js launches and configures any Chromium-based browser the same way.

* **`brave://flags`, `opera://flags`, `vivaldi://flags`, `yandex://flags`** — all
  Chromium-based, so they behave identically to `chrome://flags`, and Extension.js
  manages them per-project.
* **`internet://flags` and `browser://flags`** — these are not real browser
  schemes. You are most likely looking for `chrome://flags` (Chromium) or
  `about:config` (Firefox).
* **`edge://flags`** — Edge is Chromium, so it works exactly like Chrome in
  Extension.js.

Building an extension that needs specific flags at launch? Set them once in
`extension.config.*` and Extension.js applies them every run — see
[`browserFlags`](/docs/browsers/browser-flags) below.

## Template examples

### `new-browser-flags`

<img src="https://mintcdn.com/extensionjs/VCnDd7fX2Nza24SE/images/examples/new-browser-flags/screenshot.png?fit=max&auto=format&n=VCnDd7fX2Nza24SE&q=85&s=d98285fcb9822b2142c4f1a71308cf91" alt="new-browser-flags template screenshot" width="3024" height="1890" data-path="images/examples/new-browser-flags/screenshot.png" />

See browser flags in action with a new-tab extension that configures launch behavior.

<CodeGroup>
  ```bash npm theme={null}
  npx extension@latest create my-extension --template=new-browser-flags
  ```

  ```bash pnpm theme={null}
  pnpx extension@latest create my-extension --template=new-browser-flags
  ```

  ```bash yarn theme={null}
  yarn dlx extension@latest create my-extension --template=new-browser-flags
  ```

  ```bash bun theme={null}
  bunx extension@latest create my-extension --template=new-browser-flags
  ```

  ```bash deno theme={null}
  deno run -A npm:extension@latest create my-extension --template=new-browser-flags
  ```
</CodeGroup>

Repository: [extension-js/examples/new-browser-flags](https://github.com/extension-js/examples/tree/main/examples/new-browser-flags)

## How it works

Configure flags in `extension.config.*`:

* `browser.<target>.browserFlags`
* `commands.dev|start|preview.browserFlags`
* Optional `excludeBrowserFlags` to remove defaults or user flags (behavior depends on whether you target Chromium or Firefox).

Override order: browser defaults → command defaults → CLI-selected command context.

## Flag capabilities

| Config key                             | What it does                                             |
| -------------------------------------- | -------------------------------------------------------- |
| `browser.<target>.browserFlags`        | Sets default launch flags for a specific browser target. |
| `commands.dev.browserFlags`            | Adds or overrides flags for `dev` runs.                  |
| `commands.start.browserFlags`          | Adds or overrides flags for `start` runs.                |
| `commands.preview.browserFlags`        | Adds or overrides flags for `preview` runs.              |
| `browser.<target>.excludeBrowserFlags` | Removes matching default or user flags for a target.     |
| `commands.<name>.excludeBrowserFlags`  | Removes flags in a command-specific context.             |

### Example configuration

```js theme={null}
export default {
  browser: {
    chrome: {
      browserFlags: ["--disable-web-security", "--auto-open-devtools-for-tabs"],
      excludeBrowserFlags: ["--mute-audio"],
    },
    firefox: {
      browserFlags: ["--devtools", "--new-instance"],
      excludeBrowserFlags: ["--devtools"],
    },
  },
};
```

## Chromium vs Firefox behavior

* **Chromium family (`chrome`, `edge`, `chromium`, `chromium-based`)**
  * Starts from an internal default flag set, then appends your `browserFlags`.
  * `excludeBrowserFlags` removes matching default flags (exact-match filtering).
  * Extension.js manages `--load-extension=...` and filters it out from user-provided flags.

* **Firefox/Gecko family (`firefox`, `gecko-based` / `firefox-based`)**
  * Uses user-provided `browserFlags` (no large default flag bundle like Chromium).
  * `excludeBrowserFlags` removes user flags by prefix matching.

### Default Chromium flags

Extension.js applies these flags automatically when launching Chromium-family browsers. Use `excludeBrowserFlags` to remove any you do not need.

| Flag                                                       | Purpose                                                                 |
| ---------------------------------------------------------- | ----------------------------------------------------------------------- |
| `--no-first-run`                                           | Disable first run experience                                            |
| `--disable-client-side-phishing-detection`                 | Disable phishing detection                                              |
| `--disable-sync`                                           | Disable sync to avoid account prompts                                   |
| `--disable-component-extensions-with-background-pages`     | Disable built-in extensions not affected by `--disable-extensions`      |
| `--disable-default-apps`                                   | Disable installation of default apps                                    |
| `--disable-features=InterestFeedContentSuggestions`        | Disable Discover feed on new tab page (NTP)                             |
| `--disable-features=Translate`                             | Disable Chrome translation                                              |
| `--hide-scrollbars`                                        | Hide scrollbars from screenshots                                        |
| `--mute-audio`                                             | Mute any audio                                                          |
| `--no-default-browser-check`                               | Disable default browser check prompt                                    |
| `--ash-no-nudges`                                          | Avoid user education nudges                                             |
| `--disable-search-engine-choice-screen`                    | Disable search engine choice screen                                     |
| `--disable-features=MediaRoute`                            | Disable Chrome Media Router background networking                       |
| `--use-mock-keychain`                                      | Use mock keychain on Mac to prevent blocking dialogs                    |
| `--disable-background-networking`                          | Disable background network services                                     |
| `--disable-breakpad`                                       | Disable crashdump collection                                            |
| `--disable-component-update`                               | Disable component updates                                               |
| `--disable-domain-reliability`                             | Disable domain reliability monitoring                                   |
| `--no-pings`                                               | Disable hyperlink auditing pings                                        |
| `--enable-features=SidePanelUpdates`                       | Ensure side panel is visible                                            |
| `--disable-features=DisableLoadExtensionCommandLineSwitch` | Allow `--load-extension` at the command line                            |
| `--enable-unsafe-extension-debugging`                      | Allow Chrome DevTools Protocol (CDP) extension management (Chrome 126+) |
| `--silent-debugger-extension-api`                          | Suppress the "X is debugging this browser" infobar                      |

<Note>
  In Docker, continuous integration (CI), or containerized environments,
  Extension.js also applies `--no-sandbox` and `--disable-setuid-sandbox`
  automatically.
</Note>

## Supported targets and references

| Browser        | Usage                                    | More information                                                                       |
| -------------- | ---------------------------------------- | -------------------------------------------------------------------------------------- |
| Chrome         | `extension dev --browser=chrome`         | [Chrome Flags](https://peter.sh/experiments/chromium-command-line-switches/)           |
| Edge           | `extension dev --browser=edge`           | [Edge Flags](https://docs.microsoft.com/en-us/deployedge/microsoft-edge-policies)      |
| Firefox        | `extension dev --browser=firefox`        | [Firefox Flags](https://developer.mozilla.org/en-US/docs/Mozilla/Command_Line_Options) |
| Chromium-based | `extension dev --browser=chromium-based` | [Chromium Flags](https://peter.sh/experiments/chromium-command-line-switches/)         |
| Gecko-based    | `extension dev --browser=gecko-based`    | Firefox-based browsers share the same flags as Firefox.                                |

Use binary flags when needed for engine-based targets:

* `--chromium-binary=...`
* `--gecko-binary=...`

## Best practices

* **Add only necessary flags**: Minimize long flag lists to reduce flaky or non-portable setups.
* **Prefer `excludeBrowserFlags` over replacing defaults**: Remove only what conflicts with your workflow.
* **Do not pass `--load-extension` manually**: Extension.js manages extension loading flags internally.
* **Validate per browser family**: A flag working in Chromium may be invalid or ignored in Firefox.

## Next steps

* Learn more about [Browser preferences](/docs/browsers/browser-preferences).
* Learn more about [Browser profile](/docs/browsers/browser-profile).
* Choose a target in [Browsers available](/docs/browsers/browsers-available).
* Wire flags through [`extension.config.*`](/docs/features/extension-configuration).
* New to extension tooling? Start with a [browser extension framework](/docs/compare) overview.
