Browser Extension
Build a Manifest V3 extension for Chrome/Firefox and publish to the Web Store.
Phase Navigation
Design & Manifest
Define extension type, permissions, and the manifest.json that gates everything.
Why
Manifest V3 is mandatory in Chrome — the manifest dictates your permissions, CSP, and capabilities, and the Web Store reviews it strictly. Over-requesting permissions triggers review rejection and user distrust; under-requesting breaks your feature. Get this contract right first.
When
Before writing any content/popup/background code. 2-5 days to finalize the manifest + permission scope.
How
Example
Common Problems
- ⚠Requesting broad host permissions (<all_urls>) — triggers slow review and scares users
- ⚠Using eval/remote scripts — MV3 CSP rejects them at runtime
- ⚠Building for Chrome only, then discovering Firefox MV3 differences at publish time
Best Practices
- ✓Request activeTab instead of tabs — it grants access only on user action, easing review
- ✓Bundle everything with Vite; MV3 forbids remote code, so no CDN scripts at runtime
- ✓Use webextension-polyfill from day 1 so Chrome and Firefox share one codebase
Resources for this stage
Tools
Templates
Development & Testing
Build popup/content/SW with hot reload and test across browsers.
Why
Extension bugs are environment-specific: service workers suspend after 30s of idle, content scripts race with page JS, and popup state resets on every close. Without testing these lifecycles, you ship bugs that only appear in real browsing sessions.
When
After manifest is finalized. Build the popup UI first (fastest feedback loop), then content script, then SW.
How
Example
Common Problems
- ⚠Holding state in SW memory — lost when it suspends, causing intermittent 'first click does nothing' bugs
- ⚠Content script CSS leaks into the page — breaks host site styling and gets uninstalled
- ⚠Popup bundle > 1MB — slow open, users perceive the extension as laggy
Best Practices
- ✓Treat the service worker as stateless — persist to chrome.storage, rehydrate on every event
- ✓Wrap content script UI in a Shadow DOM root so your styles never collide with the page
- ✓Keep the popup bundle tiny (< 300KB); code-split heavy views and lazy-load on demand
Store Publishing
Package, sign, and publish to Chrome Web Store and Firefox Add-ons (AMO).
Why
The Web Store is your only distribution channel — a rejected submission blocks all users. Store review enforces permission justification, privacy practice, and single-purpose policy. A clean first submission builds trust; repeated rejections can get your developer account flagged.
When
When the extension is tested across browsers and the manifest permissions are justified. Budget 1-7 days for Chrome review, < 2 days for Firefox.
How
Example
Common Problems
- ⚠No privacy policy despite collecting data — instant rejection and possible account flag
- ⚠Vague single-purpose statement — reviewers reject extensions that 'do too many things'
- ⚠Resubmitting without addressing the specific review feedback — cycles for weeks
Best Practices
- ✓Write the privacy policy and single-purpose statement before packaging — they're review requirements
- ✓Justify every permission in the listing description; reviewers read this first
- ✓Address rejection feedback point-by-point and resubmit only the fixed version, not a rewrite
Full Developer Lifecycle
A 14-stage developer roadmap from idea to maintenance — visualize dependencies and track progress.
Next Step