Migrating Your Chrome Extension to Manifest V3: A Practical Checklist
Manifest V2 is gone from the Chrome Web Store. If you still have a V2 codebase, here is the practical checklist to get to V3 without surprises.
1. Bump the manifest version
{
"manifest_version": 3,
"name": "My Extension",
"version": "2.0.0"
}
This one line triggers everything below. Test after each step, not all at once.
2. Background pages become service workers
The biggest change. Replace your persistent background page with a service worker:
{
"background": {
"service_worker": "background.js"
}
}
Service workers are ephemeral. They spin down when idle, so do not rely on
global state. Persist anything important with chrome.storage, and re-read it
when the worker wakes.
3. Move host permissions
Host permissions are now a separate key:
{
"permissions": ["storage", "scripting"],
"host_permissions": ["https://*.example.com/*"]
}
4. Replace blocking webRequest
webRequest blocking is not available to most extensions in V3. Use
declarativeNetRequest with static or dynamic rules instead. If you were
rewriting or blocking requests, budget real time for this: the model is
different, not just the API.
5. Swap executeScript and remote code
chrome.tabs.executeScriptbecomeschrome.scripting.executeScript.- Remotely hosted code is banned. Bundle all scripts inside the package.
- Inline
<script>in extension pages is blocked by CSP. Move it to a file.
6. Audit your permissions
V3 reviews are stricter about permission justification. Request the minimum you
need, and prefer activeTab over broad host permissions where possible. Fewer
permissions also means a smoother review and higher install conversion.
Before you submit
Run through the checklist one more time:
-
manifest_versionis 3 - Background logic runs in a service worker and survives restarts
-
host_permissionssplit out frompermissions - No blocking
webRequest; rules migrated todeclarativeNetRequest - No remotely hosted or inline scripts
- Permissions trimmed to the minimum
Want a fast sanity check? Paste your manifest.json into our free
Manifest V3 validator to catch deprecated keys and
missing fields before you upload.