Publishing
Publishing submits a released build to a store. The platform holds the store credentials and runs the submission; you trigger it through any of three doors, and all three are the same submission underneath.
Three ways in
Console. The project's Stores tab submits a released build and follows each store's status. Store configuration lives in project settings.
Agent. With the MCP server configured, extension_submit sends a released build into a store's review queue, dry run by default, and extension_release_promote promotes a build to a channel first.
API. POST /api/cli/stores/submit and POST /api/cli/release/promote, authenticated with a project token. See the HTTP API.
Supported stores
| Store | Browser | Page |
|---|---|---|
| Chrome Web Store | Chrome | Chrome |
| Firefox Add-ons | Firefox | Firefox |
| Microsoft Edge Add-ons | Edge | Edge |
| App Store | Safari | Safari |
A build can also ship outside every store as a standalone launcher. See Executables.
Credentials
Credentials are project store settings, entered once and reused by every submission. The platform holds them as secrets, never in a database, and never returns them. The secret names are exact:
| Store | Secrets |
|---|---|
| Chrome | STORE_CHROME_CLIENT_ID, STORE_CHROME_CLIENT_SECRET, STORE_CHROME_REFRESH_TOKEN, or STORE_CHROME_SERVICE_ACCOUNT_JSON alone |
| Edge | STORE_EDGE_CLIENT_ID, STORE_EDGE_CLIENT_SECRET |
| Firefox | STORE_FIREFOX_API_KEY, STORE_FIREFOX_API_SECRET |
| Safari | Nine secrets covering the App Store Connect key and signing assets, listed on the Safari page |
Add them from Stores, New in the console.
Credential health
Credential health is probed per store at stores/test/{store} and checked again at submit preflight. A submission does not start against a store whose credentials fail the probe.
Dry runs
dryRun: true on POST /api/cli/stores/submit runs the preflight, and an agent's extension_submit defaults to it. The response returns a verdict per store and dispatches nothing:
| Field | Meaning |
|---|---|
configured | The store has credentials |
healthy | The credentials pass the health probe |
ok | The store would accept this submission |
reason | Why a blocked store is blocked |
consoleUrl | The exact console page that fixes that store |
Safe and broad
Every submission mode is classified safe or broad. Safe modes upload a draft and submit nothing for review. Broad modes reach store review or the public. Draft-only safe mode is a per-store setting, and agents default to safe.
Submission notes
A STORE.md in the project root is parsed automatically. Firefox reviewer notes and release notes, and Edge certification notes, ride along with the submission.
Watching
The Stores tab follows a submission to a terminal state, and GET /api/projects/{id}/stores/status returns the same. The states are in_review, processing, published, rejected, failed.
When it fails
- Run the preflight first. The
reasonsays why a store is blocked and theconsoleUrlnames the console page that fixes it. - A store failing the
stores/test/{store}probe means its credentials, not your build. Rotate the secret named in the verdict from the project's store settings. - The API and agent doors need a project token. Without one, submit from the console.
- Submissions read from a release channel. A build that was never promoted has nothing to submit. See Channels.
