Keep your extension capable without asking for more privilege than the feature requires. Extension.js compiles and validates your extension, but the browser still enforcesDocumentation Index
Fetch the complete documentation index at: https://extension.js.org/llms.txt
Use this file to discover all available pages before exploring further.
permissions, host_permissions, and optional_* fields from manifest.json. Good permission design improves trust and reduces issues during store review.
Permission strategy
| Need | Prefer |
|---|---|
| Core API access required for the extension to function | permissions |
| Host access required on install | host_permissions |
| Capability you can request later | optional_permissions |
| Domain access that only some users need | optional_host_permissions |
Common patterns
Background-driven feature
Usepermissions for the browser APIs you need and add only the host patterns required by the feature:
Optional capability
If the first-run experience does not require a feature, keep it optional:Practical rules
- Ask for API permissions only when the feature truly needs them.
- Keep
host_permissionsscoped to the smallest working set of origins. - Prefer optional permissions for secondary or premium features.
- Re-audit permissions whenever you add background actions, content-script injection, or remote API calls.
Permission design by feature type
| Feature | Usually involves |
|---|---|
| Content-script enhancement on a known site | host_permissions for that site, sometimes scripting |
| Popup or options UI only | often no host permissions at all |
| Programmatic injection | scripting plus matching host permissions |
| Cross-tab workflows | tabs and sometimes activeTab |
| Persisted settings | storage |
| Notifications or badges | notifications, action-related manifest fields |
Common mistakes
- Using broad wildcards like
<all_urls>when you only need one or two origins. - Mixing
host_permissionsinto a feature that could instead use a narrower user-triggered workflow. - Forgetting that content scripts, web-accessible resources, and script injection via
chrome.scriptingall have different security implications. - Documenting permissions in feature docs without explaining why each permission exists.
Review checklist
- List every user-facing feature.
- Map each feature to the exact API and host permissions it needs.
- Move non-core permissions to optional permissions where possible.
- Remove stale permissions left over from old experiments.
- Re-test install prompts and browser-store expectations after changes.
Next steps
- Keep one manifest accurate in manifest.json.
- Review page access in Web-accessible resources.
- Validate boundary handling in Messaging.
- Do a release pass with Security checklist.
- Compare
permissionsvshost_permissionsbehavior in Manifest V3 troubleshooting.

