Complete guides for submitting browser extensions to Chrome Web Store, Firefox Add-ons (AMO), Safari App Store, and Edge Add-ons. Covers account setup, asset preparation, submission process, and post-publication management.
npx claudepluginhub arustydev/aiThis skill uses the workspace's default tool permissions.
Complete guides for submitting browser extensions to Chrome Web Store, Firefox Add-ons (AMO), Safari App Store, and Edge Add-ons. Covers account setup, asset preparation, submission process, and post-publication management.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Complete guides for submitting browser extensions to Chrome Web Store, Firefox Add-ons (AMO), Safari App Store, and Edge Add-ons. Covers account setup, asset preparation, submission process, and post-publication management.
| Store | Review Time | Fee | Manifest Version | Update Frequency |
|---|---|---|---|---|
| Chrome Web Store | 1-3 days | $5 (one-time) | V3 required | On submission |
| Firefox Add-ons | 1-5 days | Free | V2 or V3 | On submission |
| Safari App Store | 1-7 days | $99/year | V3 required | App Store Connect |
| Edge Add-ons | 1-7 days | Free | V3 required | Partner Center |
| Asset | Dimensions | Format | Notes |
|---|---|---|---|
| Icon | 128x128 | PNG | Required in manifest |
| Screenshots | 1280x800 or 640x400 | PNG/JPEG | 1-5 required |
| Promotional tile (small) | 440x280 | PNG/JPEG | Optional |
| Promotional tile (large) | 920x680 | PNG/JPEG | Featured extensions |
| Marquee | 1400x560 | PNG/JPEG | Homepage features |
1. Package Extension
$ wxt zip # Creates .output/<name>-<version>-chrome.zip
2. Upload to Dashboard
→ Developer Dashboard → Items → Add New Item
→ Upload ZIP file
3. Complete Store Listing
→ Description (up to 132 chars visible)
→ Screenshots (actual functionality)
→ Category selection
→ Language/region targeting
4. Privacy Practices
→ Data collection disclosure
→ Privacy policy URL (if collecting data)
→ Permissions justification
5. Submit for Review
→ Preview listing
→ Submit for review
Chrome requires justification for sensitive permissions:
| Permission | Requires Justification | Example Justification |
|---|---|---|
<all_urls> | Yes | "Required to inject content script on all pages for ad blocking" |
tabs | Yes | "Needed to track tab URLs for bookmark sync" |
webRequest | Yes | "Required to modify request headers for privacy protection" |
history | Yes | "Core functionality: history search and management" |
cookies | Yes | "Session management for authenticated API calls" |
| Reason | Policy | Fix |
|---|---|---|
| Misleading metadata | Accurate descriptions | Match listing to functionality |
| Insufficient functionality | Single purpose | Add meaningful features |
| Excessive permissions | Minimum necessary | Remove unused permissions |
| Remote code execution | No remote code | Bundle all scripts |
| Trademark violation | IP rights | Remove protected terms |
| Spam/deceptive | Quality guidelines | Provide genuine value |
{
"browser_specific_settings": {
"gecko": {
"id": "extension@example.com",
"strict_min_version": "109.0",
"data_collection_permissions": {
"required": [],
"optional": ["technicalAndInteraction"]
}
}
}
}
| Asset | Dimensions | Format | Notes |
|---|---|---|---|
| Icon | 48x48, 96x96 | PNG | Required in manifest |
| Screenshots | Any reasonable | PNG/JPEG | 1+ showing functionality |
| Header image | 700x280 | PNG/JPEG | Optional |
1. Build Extension
$ wxt zip -b firefox # Creates .output/<name>-<version>-firefox.zip
2. Sign Extension (optional for self-distribution)
$ web-ext sign --api-key=KEY --api-secret=SECRET
3. Submit to AMO
→ addons.mozilla.org → Submit a New Add-on
→ Upload ZIP file
→ Choose visibility (listed/unlisted)
4. Provide Information
→ Extension name and summary
→ Category selection
→ Support email/URL
→ License selection
5. Source Code Submission (if minified)
→ Upload source archive
→ Include build instructions
6. Review Notes
→ Testing instructions
→ Permission explanations
→ Third-party library list
{
"browser_specific_settings": {
"gecko": {
"data_collection_permissions": {
"required": ["technicalAndInteraction"],
"optional": ["locationData", "healthData"]
}
}
}
}
| Permission | Description |
|---|---|
technicalAndInteraction | Usage patterns, crash reports |
locationData | Geographic information |
healthData | Health-related data |
financialData | Payment/financial info |
personalIdentifiers | Names, emails, accounts |
| Reason | Fix |
|---|---|
| Missing gecko.id | Add unique email-format ID |
| Obfuscated code without source | Submit source code archive |
| eval() or new Function() usage | Refactor to static code |
| Inline scripts in HTML | Move to external files |
| Missing data consent | Add data_collection_permissions |
| Security vulnerabilities | Fix reported issues |
| Type | Review | Distribution | Updates |
|---|---|---|---|
| Listed | Full review | AMO search/install | Auto-update |
| Unlisted | Automated | Direct download | Manual or auto |
Use unlisted for: Enterprise deployments, beta testing, private tools.
# Convert existing extension to Safari format
xcrun safari-web-extension-converter /path/to/extension \
--project-location /path/to/output \
--app-name "Extension Name" \
--bundle-identifier com.example.extension
# Open generated Xcode project
open /path/to/output/Extension\ Name.xcodeproj
| Asset | Dimensions | Format | Notes |
|---|---|---|---|
| App Icon | 1024x1024 | PNG | Plus all required sizes |
| Screenshots (iPhone) | Various sizes | PNG | Per device class |
| Screenshots (iPad) | Various sizes | PNG | If supporting iPad |
| Screenshots (Mac) | 2880x1800 | PNG | For Mac App Store |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeBrowsingHistory</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
</array>
<key>NSPrivacyAccessedAPITypes</key>
<array/>
</dict>
</plist>
1. Build in Xcode
→ Product → Archive
→ Select archive → Distribute App
→ App Store Connect → Upload
2. App Store Connect
→ Create new app record
→ Fill app information
→ Upload screenshots
→ Complete privacy questionnaire
3. Submit for Review
→ Select build
→ Add review notes
→ Submit for review
| Guideline | Issue | Fix |
|---|---|---|
| 2.1 Performance | App crashes | Test on all target devices |
| 2.3 Accurate Metadata | Screenshots don't match | Update screenshots |
| 2.5 Software Requirements | Missing privacy manifest | Add PrivacyInfo.xcprivacy |
| 4.2 Minimum Functionality | Extension does too little | Add meaningful features |
| 5.1 Privacy | Undisclosed data collection | Update privacy policy |
1. Package Extension (same as Chrome)
$ wxt zip # Chrome format works for Edge
2. Partner Center
→ Partner Center → Microsoft Edge → Extensions
→ Create new extension
→ Upload ZIP file
3. Complete Listing
→ Store listing information
→ Screenshots and assets
→ Category selection
4. Submit for Review
→ Preview and submit
Edge accepts Chrome extensions with minimal changes:
{
"manifest_version": 3,
"name": "Extension Name",
"version": "1.0.0",
"description": "Description"
// No Edge-specific fields required
}
MAJOR.MINOR.PATCH
1.0.0 → Initial release
1.0.1 → Bug fix
1.1.0 → New feature (backward compatible)
2.0.0 → Breaking changes
| Store | Update Method | Notes |
|---|---|---|
| Chrome | Upload new version | Same item, increment version |
| Firefox | Upload new version | Must be higher version |
| Safari | New build in Xcode | Increment build number |
| Edge | Upload new version | Same extension ID |
Chrome Web Store supports staged rollouts:
1. Developer Dashboard → Item → Package
2. Upload new version
3. Set rollout percentage (5%, 10%, 50%, 100%)
4. Monitor crash reports and reviews
5. Increase percentage or rollback
| Scenario | Typical Delay | Mitigation |
|---|---|---|
| First submission | +2-3 days | Thorough preparation |
| Sensitive permissions | +1-2 days | Detailed justification |
| Code review required | +3-5 days | Submit source code |
| Policy questions | Variable | Respond quickly |
| High volume periods | +1-3 days | Avoid holidays |
Do:
- Thank users for feedback
- Acknowledge issues promptly
- Provide solutions or workarounds
- Follow up after fixes
Don't:
- Argue with users
- Make excuses
- Ignore negative reviews
- Promise features you can't deliver
1. Read rejection reason carefully
2. Understand the specific policy violated
3. Make necessary changes
4. Document changes in notes
5. Resubmit with explanation
6. Appeal if rejection seems incorrect
# Build for all stores
wxt zip # Chrome/Edge
wxt zip -b firefox # Firefox
# Safari requires Xcode build
# Open project and archive
# Submit in order of review speed
1. Edge Add-ons (fastest)
2. Chrome Web Store
3. Firefox Add-ons
4. Safari App Store (slowest)
Before submitting to any store: