extension.dev,
the sponsor of Extension.js, handles publishing, store submission, and sharing
from the same project. Its docs cover the steps after
extension build.Prerequisites
- Create a Firefox account and sign in at addons.mozilla.org.
- Accept the Firefox Add-on Distribution Agreement. The API key page stays locked behind this acceptance, even for accounts that have published add-ons through the web UI for years.
Generate the API credentials
- Open the AMO API key page.
- Generate new credentials.
- Copy the JWT issuer. Its shape is
user:12345678:987. This is the value most tools call the API key. - Copy the JWT secret immediately.
The add-on ID and the first submission
The add-on ID, which AMO calls the GUID, identifies your add-on across every submission. It is also the value that goes inbrowser_specific_settings.gecko.id. Extension.js reads that key when it is
present, and never writes one for you.
The rules depend on the release channel:
- Listed (public listing on AMO): an existing GUID is required. Do the first submission by hand in the Developer Hub, then automate updates.
- Unlisted (signed for self-distribution): leave the GUID empty on the first submission and AMO creates a new add-on, assigning a GUID.
listed
at submission time, which either fails (no GUID) or publishes a public
listing you may not have intended (GUID set).
Manifest requirement for new add-ons
New add-ons must declare data collection permissions in the manifest, or AMO rejects the submission:browser_specific_settings.gecko.data_collection_permissions.
Use ["none"] only when the extension transmits nothing. The declaration,
the privacy section of STORE.md, and the
code must agree. See
Firefox store readiness
for the full rules.
Source zip for bundled builds
AMO requires a source zip when the upload is minified or bundled, which an Extension.js production build is. Build it with:STORE.md.

