Chrome Extension Permission Checker

Scans your extension's JavaScript/TypeScript source for chrome.* API usage and checks it against manifest.json's declared permissions, optional_permissions, and host_permissions -- the most common cause of a Chrome Web Store review rejection for excessive or unused permissions ("Purple Potassium"), plus the reverse case: an API call whose permission was never declared, which fails at runtime. Everything runs in this tab; nothing is uploaded. A command-line version for CI is in the same repository (node check.mjs .).


Open your extension's project folder, select every .js/.mjs/.cjs/.ts/.tsx/.jsx file plus manifest.json (select-all works), then choose them here. Not at your project right now? instead.

No files selected yet.

Common questions

Why did Chrome Web Store reject my extension for unused or excessive permissions (Purple Potassium)?

Chrome's own troubleshooting documentation names this as the most common review rejection: your manifest.json declares a permission that reviewers cannot find a matching feature for. This tool scans your source for the chrome.* calls each permission unlocks and tells you exactly which declared permission has no detected use.

What does it mean if my extension uses a chrome.* API that isn't declared in the manifest?

That call will fail at runtime, not just at review -- Chrome enforces the permission at the API level. This tool checks both directions: permissions declared but unused, and APIs used but undeclared.

Is my extension's source code uploaded anywhere?

No. The browser tool reads the files you select using the File API and never sends them anywhere -- everything happens in memory in your tab. The CLI never makes a network call either.

Does a clean report mean Chrome Web Store will approve my extension?

No. This is evidence of what your code and your manifest currently say, produced by pattern-matching known chrome.* symbols -- it is not the review process, and it cannot see permissions used only by a bundled third-party library's minified code, dynamic imports, or a permission the manifest declares with no code signature this tool maps (activeTab, background, unlimitedStorage, and ChromeOS/enterprise-only permissions). Always confirm against Chrome's current documentation before submitting.

More on the specific rejection code: Fixing "Purple Potassium" unused-permission rejections.

Vetting an extension someone else already published instead of your own? See this checker vs. CRXcavator. Prefer to just read the manifest? See this checker vs. checking the manifest by hand.