- Before launch, it reads the built
manifest.jsonof every extension it is about to load and warns about each refusal it can prove, naming the field and the reason. - At build time, it repairs a small set of unambiguous fatal shapes and prints a fix line for each repair.
Pre-launch diagnosis
These checks run against the built extension, right before the browser spawns.Manifest version refusals
Invalid match patterns
One invalid pattern makes Chrome refuse the whole extension. Extension.js checkshost_permissions, optional_host_permissions, content_scripts (matches and exclude_matches), and web_accessible_resources matches.
The host grammar allows *, *.domain.tld, or a literal host. Any other wildcard placement in the host is invalid, for example https://foo.*.com/*. Ports, query strings, and fragments do not trigger a refusal, and the port may itself be a wildcard.
The load-blocker catalogue
Each of these was verified to refuse the whole extension on a live Chrome build:name: missing, empty, or not a string. Chrome requires a non-empty string name.version: missing, or not 1 to 4 dot-separated integers, each 0 to 65535.- MV3
web_accessible_resources: entries must be dictionaries withresources, plus one ofmatches,extension_ids, oruse_dynamic_url. The MV2 string-array form refuses on MV3. MV2 keeps it legal. content_scriptsgrammar:matchesis required and must not be empty,jsandcssentries must be strings,run_ataccepts onlydocument_start,document_end, ordocument_idle, and each entry needs at least onejsorcssfile.minimum_chrome_version: an invalid value refuses outright. A valid value above the resolved browser’s version refuses too, so the check compares against the binary that the session launches.commands: Chrome allows at most 4 shortcuts with asuggested_key. Firefox has no cap, so ported Firefox extensions routinely trip this.key: must be a valid base64 public key. Broken padding refuses the extension.- Icons: a manifest icon (
icons.*or any*_action.default_icon) whose file is missing or 0 bytes refuses the whole extension. - Locales: a declared
default_localewhose_locales/<locale>/messages.jsonis missing or not valid JSON refuses. So does a whole-string__MSG_key__reference that the catalog does not define (the lookup is case-insensitive,@@predefinednames are exempt). A populated_localestree with nodefault_localein the manifest refuses too. storage.managed_schema: a schema path that does not exist inside the extension directory refuses the whole extension.
Automatic repairs at build time
A subset of fatal shapes is unambiguous enough to fix. During the build, Extension.js repairs these in the emittedmanifest.json:
Every repair reports a fix line in the CLI output at the moment it happens, and records a
manifest.json build warning, so nothing is rewritten silently.
Repairs apply to the emitted
dist manifest only. Your source
manifest.json is never modified. Fix the source when you see a fix line, so
the repair stops being needed.Next steps
- Debugging overview: the full control surface for a running session.
- Browsers available: choose a target that can load your manifest.
- Cross-browser compatibility: keep one manifest working per engine.

