Chrome ext permissions
Skill RadOrigin-LLC/RAD-Claude-Skills/plugins/rad-chrome-extension/skills/chrome-ext-permissions
This skill should be used when working on Chrome extension permissions or Chrome Web Store compliance. Trigger when: declaring extension permissions, "manifest permissions", "activeTab vs tabs", "optional_permissions", "host_permissions", "Chrome Web Store rejection", "permission minimization", "over-permissioning", "CWS review", "Purple Potassium", "extension permission audit", "narrowest permission", "permission warnings", "chrome.permissions.request", "permission justification".From its SKILL.md
npx -y skills add RadOrigin-LLC/RAD-Claude-Skills --skill chrome-ext-permissionsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.3 KB, 842 tokens by cl100k_base, as published. Nobody here has run it
Chrome Extension Permissions
The principle of least privilege governs all permission decisions. Request only what the extension actively uses today — never future-proof permissions. Approximately 70% of submitted extensions over-request permissions. Over-permissioning triggers CWS rejections, alarming install warnings, and longer review cycles.
Permission Decision Rules
activeTab vs. tabs vs. host_permissions
| Need | Use | Why |
|---|---|---|
| Temporary access after user click | activeTab | No install warning, minimal scope |
| Read URL/title of tabs without host access | tabs | Required for tab.url, tab.title, tab.favIconUrl |
| Persistent access to specific sites | host_permissions: ["https://example.com/*"] | Narrow host pattern |
| Access to all sites | host_permissions: ["<all_urls>"] | Last resort — triggers 3x rejection rate |
activeTab grants temporary access to the currently focused tab only after the user explicitly invokes the extension. It requires no install warning. Always prefer it over broad alternatives.
Common Permission Misconceptions
| Misconception | Reality |
|---|---|
"Need tabs to use chrome.tabs API" | Most chrome.tabs methods work without the permission |
"Need storage for localStorage" | storage is only for chrome.storage API, not web storage |
"Need cookies for document.cookie" | cookies permission is only for chrome.cookies API |
"Need <all_urls> to work on any site" | activeTab + user action covers most use cases |
Optional Permissions
Move non-core features to optional permissions. Request at runtime when the feature is activated:
// Request permission when user enables a feature
async function enableAdvancedFeature() {
const granted = await chrome.permissions.request({
permissions: ['bookmarks'],
origins: ['https://api.example.com/*'],
});
if (granted) {
// Permission granted — enable feature
} else {
// Permission denied — show explanation
}
}
Benefits:
- Reduces alarming install warnings
- Gives users informed control
- Accelerates CWS review
- Permissions can be revoked when feature is disabled
Host Permission Patterns
Declare in host_permissions array (MV3), not in permissions:
{
"host_permissions": [
"https://api.example.com/*",
"https://cdn.example.com/*"
]
}
Rules:
- Use exact domains, not wildcards
- Prefer
https://over*:// - Never use
<all_urls>unless absolutely required - Move non-essential hosts to
optional_host_permissions
Pre-Release Permission Audit
Before every CWS submission:
- Grep codebase for every
chrome.*API call — verify each has a matching permission - Remove any declared permission not backed by a code path
- Replace broad permissions with narrower alternatives where possible
- Test packed
.crxbuild to verify exact install warning dialogs - Prepare a short video demonstrating how each sensitive permission is used
- Write clear cause-and-effect justifications for the CWS privacy tab
CWS Rejection Codes for Permissions
| Code | Name | Trigger |
|---|---|---|
| Purple Potassium | Excessive Permissions | Unused or overly broad permissions |
| Purple Lithium | User Data Privacy | Missing privacy policy, insecure data handling |
| Purple Copper | Data Transmission | Sensitive data via HTTP or in URL params |
Warning: Adding permissions that trigger install warnings will temporarily disable the extension for existing users until they accept the new terms.
Additional Resources
Reference Files
references/permission-guide.md— Detailed permission-by-permission reference and narrowing strategiesreferences/cws-rejection-codes.md— Complete CWS rejection code taxonomy with prevention strategies
What ships with it: 2 files
10.3 KB alongside SKILL.md
references/
- cws-rejection-codes.md4.8 KB
- permission-guide.md5.5 KB
Gives 0 of the 12 instructions most audit compliance skills give in 842 tokens
Counted across 937 of the 1,487 authors here whose files we hold, read 2026-08-07
- Fetch latest guidelines before each reviewin 43 of 937, across 3 files
- Group findings by severityin 43 of 937
- Check files against all fetched rulesin 42 of 937, across 2 files
- Output findings in terse file:line formatin 41 of 937, across 3 files
- Ask user which files to review if none specifiedin 41 of 937, across 3 files
- Read specified files or prompt user for filesin 39 of 937, across 1 file
- Generate the audit reportin 33 of 937, across 30 files
- Assign a severity to every findingin 25 of 937
- Run automated accessibility scansin 23 of 937, across 13 files
- Output a markdown audit reportin 22 of 937
- Map findings to WCAG criteriain 20 of 937, across 10 files
- Confirm audit scopein 19 of 937, across 9 files
Said here and by no other author read
- request only permissions actively used today
- prefer activeTab over broad alternatives
- move non-core features to optional permissions
- declare host permissions in host_permissions array
- use exact domains instead of wildcards
- prefer https over wildcard protocols
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.