Troubleshooting capabilities
Fast triage flow
- Reproduce with one target (
--browser=chromium). - Remove custom profile and binary flags.
- Confirm whether the issue happens in
dev,build, or both. - Fix one error class at a time (restart, dependency, path, or launch).
Quick diagnosis decision tree
Common issues
Restart required diagnostics
If you see a restart-required error, stop and rerunextension dev.
Typical triggers:
- Manifest entrypoint list changes.
- Adding/removing files in
pages/orscripts/. - Structural HTML script/style entry changes.
Missing optional dependencies
The CLI installs some integrations on demand (for example, Vue/Preact refresh tooling, style preprocessors). If the CLI prompts for optional dependency installation:- Allow the install.
- Restart
extension dev. - Run again after dependencies finish installing.
Browser binary problems
If target browser launch fails:- Verify custom binary path (
--chromium-binary/--gecko-binary). - Confirm browser target is compatible with the provided binary.
- Fall back to the default
chromiumtarget to isolate configuration issues.
Build runs but preview shows the wrong code
preview loads dist/<target> when it exists and falls back to the source manifest directory when it does not, so a missing build runs the source as-is instead of failing.
- Run
extension build --browser=<target>. - Then run
extension preview --browser=<target>.
Manifest reference errors
If build reports missing manifest files:- Verify paths are relative to manifest location.
- Verify leading
/usage (public-root semantics). - Ensure files actually exist in source/public locations.
Docker, dev containers, and Codespaces
When running inside a container, the dev server binds to127.0.0.1 by default, so the host machine cannot reach it.
- Pass
--host 0.0.0.0to bind to all interfaces. - Use
--port 0to let the OS assign a free port if8080is taken. - If browser connections are slow or flaky in continuous integration (CI) containers, increase the connection timeouts using browser transport tuning variables.
Node.js script in scripts/ folder
If the build fails with scripts/ is a reserved folder in Extension.js, you have a Node.js file inside the scripts/ special folder. Extension.js wraps every file in scripts/ with a browser content-script runtime. Node.js-only files fail in this context.
Move the file to a different folder at the project root (for example, bin/, tools/, or ci-scripts/). See special folders for details.
content_scripts/content-0.css fails with net::ERR_FILE_NOT_FOUND
The console shows a red request for chrome-extension://<id>/content_scripts/content-0.css with net::ERR_FILE_NOT_FOUND, and the extension still works.
Before Extension.js 4.1.10, a content script with no stylesheet still requested a sibling content-0.css that the build never emitted. The request is harmless, but it stays red in the console. The fix shipped in 4.1.10, so upgrade:
- Run
npx extension@latest devto use the latest CLI, or bump theextensiondependency inpackage.json.
css, the file is real and must exist in dist/<browser>/content_scripts/. A missing file in that case is a build problem, not this phantom request.
Extension pages reload with ?rspack-dev-server-hot=false in the URL
In extension dev, the URL of an options, popup, or sidebar page ends with ?rspack-dev-server-hot=false&webpack-dev-server-hot=false. Each edit reloads the whole page instead of updating it in place.
From 3.18.1 to 4.1.9, Extension.js added these parameters on purpose. They turned off hot module replacement on HTML pages, so pages fell back to a full reload. Version 4.1.10 turns hot module replacement on for these pages and removes the old parameters from the URL. Upgrade:
- Run
npx extension@latest devto use the latest CLI, or bump theextensiondependency inpackage.json.
Still blocked after fixes
If the issue persists:- Clear temporary assumptions and reproduce from a clean terminal session.
- Reduce to the smallest manifest/entrypoint case that still fails.
- Capture the exact command + error output for issue reporting.
Debugging checklist
- Reproduce with a single browser target first (
--browser=chromium). - Reproduce without custom profile/binary flags.
- Check whether the issue appears in both
devandbuild. - Keep one change at a time when touching manifest + entrypoint files.
Next steps
- Review Security checklist.
- Review Performance playbook.

