Back to blog

Migrating Your Chrome Extension to Manifest V3: A Practical Checklist

ExtensionBill

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.executeScript becomes chrome.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_version is 3
  • Background logic runs in a service worker and survives restarts
  • host_permissions split out from permissions
  • No blocking webRequest; rules migrated to declarativeNetRequest
  • 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.