Extension Workshop
Extension Basics
Getting started
Mozilla Developer Network
Documentation Topics
Develop
Firefox Tools
User Experience
Firefox for Android
Port to Firefox
Test and debug
Getting Started
Unique Firefox Capabilities
Firefox Workflow Overview
About the WebExtensions API
Manifest V3
Manifest V3 migration guide
What is Manifest V3?
Manifest V3 changes
Migration checklist
Cross-Browser Development
Browser Compatibility
Namespace
Asynchronous
API Coverage
Manifest keys
More information
Build cross-browser extensions
Firefox Tools
Build an extension in 5 minutes
Browser Extension Development Tools
Boilerplating tools
Coding tools
Testing and debugging tools
Translation tools
Tools for Firefox for Android
Choosing a Firefox version for extension development
Firefox editions
Firefox version and their web extension development capabilities
Getting started with web-ext
Installation
Update
Using web-ext
Check your code
Test and debug
Package, sign, and publish
Use the configuration file
Advanced topics
See also
web-ext v8 command reference
What's new
Commands
web-ext build
web-ext docs
web-ext dump-config
web-ext lint
web-ext run
web-ext sign
Global options
Setting option environment variables
See also
web-ext v7 command reference
Commands
Global options
Setting option environment variables
See also
Web-ext Webpack plug-in
Browser API Polyfill
Extensions and the Add-on ID
Basic workflow with no add-on ID
When do you need an add-on ID?
User Experience
Build a secure extension
Request the right permissions
Introduction
Advised permissions
Avoid unnecessary permissions
Request permissions at runtime
Add information about permissions to your extensions AMO page
Best practices for collecting user data consents
Know your privacy settings
Get prepared
Create a privacy policy
Prompt after install
Determine your consent flow
Your consent dialogs
Build an accessible extension
Onboard, upboard, offboard users
Onboarding
Upboarding
Offboarding
User experience best practices
1. Keep it focused
2. Give users what they need, where they need it
3. Keep the user informed
4. Be Firefoxy in look and feel
5. Great onboarding experience
6. Test, test, and then test again
Mobile
Differences between desktop and Android extensions
Introduction
User interface
Native application interaction
Permissions
Storage
User experience guidelines for mobile extensions
Introduction
The basics
The extra mile
The last mile
Developing extensions for Firefox for Android
Set up your computer and Android emulator or device
Check for Firefox for Android compatibility
Install and run your extension in Firefox for Android
Debug your extension
Manifest V3 compatibility
GeckoView Extensions (Android library)
Port Your Extension
Porting a Google Chrome Extension
Debug and Test
Debugging
Developer tools toolbox
Debugging background scripts
Debugging options pages
Debugging popups
Debugging content scripts
Debugging sidebars
Debugging storage
Debugging developer tools pages and panels
Debug permission requests
Debugging browser restarts
Temporary Installation in Firefox
Reloading a temporary extension
Using the command line
Detecting temporary installation
Limitations
Testing persistent and restart features
What is an add-on ID?
What is a Firefox profile?
Extension behavior in Firefox
What do I do to ensure I can test my extension?
Test permission requests
Permission grant behavior during testing
Observe or verify install time permission requests
Retest runtime permission grants
Known issues
Content scripts don't appear in DevTools
Extension source don't update in DevTools
"Destroyed actor" errors when debugging Android
Publish
Get your extension signed
Distribute your signed extension
Promote your extension
Policies
Add-on Policies
No Surprises
Content
Submission Guidelines
Development Practices
Data Disclosure, Collection and Management
Monetization
Security, Compliance and Blocking
Firefox Add-on Distribution Agreement
1. Introduction
2. Accounts
3. Privacy Policy
4. Distribution, certificates, & review process
5. Your obligations
6. Licenses; proprietary rights
7. Content removal
8. Disclaimer of warranties
9. Limitation of liability
10. Release; indemnification
11. General legal terms
Add-ons Blocking Process
Security Over Choice
Blocking Criteria
Developer Outreach
Requesting a Block
Blocking Other Types of Third Party Software
Third Party Library Usage
When must links for third-party libraries be provided?
How to determine the third-party library link
Communicating third-party library links to reviewers
What does review rejection mean to users?
Review overview
Impact of review rejection
Blocklisting
Sign
Signing and distribution overview
Signing your add-ons
Distributing your add-on
Post-submission review
More information about AMO
Package your extension
Windows
Mac OSX
Linux / Mac OSX Terminal
Distribute
Distribute Manifest V2 and V3 extensions
Distribute pre-release versions
Submitting an add-on
Listing on AMO
Self-distribution
Get help
Source code submission
Provide your extension source code
Default reviewer build environment
Use of obfuscated code
Source code checklist
Firefox version compatibility
Version compatibility
The `browser_specific_settings` key
AMO compatibility setting
Recommendations
Add-on ownership
Transfer ownership
Code disputes
Developer accounts
Setting a display name
Blocked accounts
Issues receiving emails from AMO
Self-distribution
Self-distribution options
Sideloading
Preparing your add-on
Install add-on from file
Installation using the standard extension folders
For desktop apps
Promote
Create an appealing listing
Your add-on’s name
Create a captivating icon
Create a meaningful set of keywords
Make sure your summary is just long enough
Focus on key features in your screenshots
The add-on description can be longer, but not too long
Make it local
Make it experimental
Select the right platforms and versions
Categorize well
Be prepared to provide support
Set up a developer profile
Use plain language in any privacy policy or license agreement
Gently ask for a review
Make use of Markdown
Some other points
What’s great content and design?
Promoting your extension
Promote your add-on from your website
Friends, family, and colleagues
Events and meetups
Current users
Social media
Engage with your users
Create a forum, user group, or similar
Engage with bloggers and news media
Advertising
Make money from browser extensions
Will I ever be able to sell through AMO?
What can't you do
What can you do
Unsolicited offers
How can I maximize my income?
Recommended extensions
Overview
Criteria for Recommended extensions
Developer partnership
Selection process
Manage
Stay informed when Firefox changes
Publish extension updates
Manage authors of your extension
Promote your extension
Removing your extension from distribution
Resources
Updating your extension
Enabling updates to your extension
Manifest structure
Testing automatic updating
Best practices for updating your extension
Monitoring extension usage statistics
Accessing the statistics dashboard
Tracking external sources
Add-on listing example
Resources for publishers
Retiring your extension
Reasons for withdrawing your extension
Steps to retiring an extension
Suggested retirement timetable
Enterprise
Developing your enterprise extension
Distributing your enterprise extension
Enterprise support
Manage add-ons for Firefox for Enterprise
Install system add-ons for Firefox for Enterprise
Enterprise resources
Enterprise development
Data collection disclosure and consent for enterprise extensions
How to add policy support
Distributing your policy
Enterprise policies that impact extensions
Relevant policies
Other relevant policies
Enterprise distribution
Signed vs. unsigned extensions
Using an ExtensionSettings policy
Bundling add-ons with a custom Firefox
Themes
Creating themes
Using the AMO theme generator
Getting started
Submitting your theme
Updating your theme
Static themes
Introduction
Create a simple static theme
Updating static themes
Single image themes
Multiple image themes
Static animated themes
Dynamic themes
Introduction
Creating dynamic themes
Publishing dynamic themes
Cross-browser compatibility
Community
Who is part of the community?
Connect with the community
Get involved in the community
Get in touch
Community Forum
Add-ons Blog
Office Hours
Stack Overflow
Communication Calendar
Dev Mailing List
Contribute
Contribution opportunities
Onboard to the WebExtensions codebase
Hacking guide for WebExtensions code contributions
WebExtensions Experiments
Find or create a bug
Submit or Manage Extensions
Search
Submit or Manage Extensions
Search
Select a section
Page Name
Extension Basics
Getting started
Mozilla Developer Network
Documentation Topics
Develop
Firefox Tools
User Experience
Firefox for Android
Port to Firefox
Test and debug
Getting Started
Unique Firefox Capabilities
Firefox Workflow Overview
About the WebExtensions API
Manifest V3
Manifest V3 migration guide
What is Manifest V3?
Manifest V3 changes
Migration checklist
Cross-Browser Development
Browser Compatibility
Namespace
Asynchronous
API Coverage
Manifest keys
More information
Build cross-browser extensions
Firefox Tools
Build an extension in 5 minutes
Browser Extension Development Tools
Boilerplating tools
Coding tools
Testing and debugging tools
Translation tools
Tools for Firefox for Android
Choosing a Firefox version for extension development
Firefox editions
Firefox version and their web extension development capabilities
Getting started with web-ext
Installation
Update
Using web-ext
Check your code
Test and debug
Package, sign, and publish
Use the configuration file
Advanced topics
See also
web-ext v8 command reference
What's new
Commands
web-ext build
web-ext docs
web-ext dump-config
web-ext lint
web-ext run
web-ext sign
Global options
Setting option environment variables
See also
web-ext v7 command reference
Commands
Global options
Setting option environment variables
See also
Web-ext Webpack plug-in
Browser API Polyfill
Extensions and the Add-on ID
Basic workflow with no add-on ID
When do you need an add-on ID?
User Experience
Build a secure extension
Request the right permissions
Introduction
Advised permissions
Avoid unnecessary permissions
Request permissions at runtime
Add information about permissions to your extensions AMO page
Best practices for collecting user data consents
Know your privacy settings
Get prepared
Create a privacy policy
Prompt after install
Determine your consent flow
Your consent dialogs
Build an accessible extension
Onboard, upboard, offboard users
Onboarding
Upboarding
Offboarding
User experience best practices
1. Keep it focused
2. Give users what they need, where they need it
3. Keep the user informed