What is Chrome Manifest V3?
Manifest V3 is the current Chrome extension manifest format. Here is what changed from V2, which fields moved or disappeared, and how to check a manifest against the current rules.
The short version
manifest.json is the file that describes an extension: its name, its version, what it is allowed to do, and where its code lives. Manifest V3 is the current format. It keeps that job the same but tightens several things, mostly around what an extension can do to pages and to the browser itself.
An extension declares the format on the first line that matters:
"manifest_version": 3
Why it exists
The main driver was user trust. Manifest V2 gave extensions broad, permanent access — a blocking web request API, a persistent background page, host access decided at install time and rarely revisited. V3 narrows that: most network modification moves to declarative rules, background work moves to a service worker that can be suspended, and host permissions can be requested at the point of use rather than all up front.
What changed from V2
background became a service worker
A V2 background page — a hidden HTML page kept alive — is replaced by a service worker:
"background": { "service_worker": "background.js" }
The trade-off is that a service worker is terminated when idle, so long-lived state does not survive. Code that used to sit in memory must be restored, and persistent: true no longer exists. In practice this is the change that catches people: an MV2 extension moved naively will lose its state between events.
browser_action and page_action became action
Two separate toolbar keys collapsed into one:
"action": { "default_title": "…", "default_popup": "popup.html" }
Leaving browser_action in an MV3 manifest is one of the most common migration mistakes, and it does not throw an obvious error — the toolbar button simply does not appear.
Network blocking moved to declarativeNetRequest
The old webRequestBlocking model, where code saw and could rewrite each request, is replaced by declarativeNetRequest: a rules engine that blocks or redirects without your code ever seeing page content. It is faster and far narrower, which is the point.
Permissions split, and can be optional
Host patterns moved out of permissions into their ownhost_permissions list, and optional_permissions gainedoptional_host_permissions. An extension can now ask for access to a site when the user actually triggers the feature, rather than at install time. This is why reading the three lists separately — which thePermission Checker does — is worth the effort.
web_accessible_resources changed shape
V2 listed strings:
"web_accessible_resources": ["images/*.png"]
V3 uses objects with a resources list, usually constrained by matches:
"web_accessible_resources": [{ "resources": ["images/*"], "matches": ["https://example.com/*"] }]
The content security policy is an object
V2 took a string. V3 expects an object keyed by surface:
"content_security_policy": { "extension_pages": "script-src 'self'; object-src 'self'" }
What has not changed
nameandversionare still required, and version format rules are the same.content_scriptsstill usesmatches,jsandcss.icons,commandsandexternally_connectablework as before.- The archive layout is unchanged:
manifest.jsonat the root of a ZIP, wrapped in a CRX for distribution.
Version strings are stricter than people expect
version must be a string of one to four dot-separated integers, each 0–65535, with no leading zeros. So "1.0.0" and "2.10" are fine, while"v1.0.0", "1.0.0-beta" and "01.2" are rejected. It is also a common mistake to write it as a JSON number, which is a different type entirely.
Checking a manifest
The Manifest V3 Validator checks the structural and type rules described above and reports each finding with the field, the problem and a fix. It is an independent checker written against Chrome's published documentation — not Google's internal validator, and not a substitute for loading the extension.
To read a manifest rather than judge it, use theManifest Viewer. To get an orientation on a whole extension, use the Extension Inspector.
Where the authoritative answers are
Chrome's own documentation is the source of truth for all of the above, and it moves. The manifest reference, the MV3 migration guide, and the service worker and permissions pages are linked from each finding the validator reports, so you can check a rule rather than take it on trust.
Tools for this
Manifest V3 Validator
Check common Manifest V3 configuration problems in a manifest.
Runs locallyManifest Viewer
Read a manifest.json field by field, formatted and explained.
Runs locallyChrome Extension Inspector
Get a readable summary of what an extension declares and how it runs.
Runs locally