A CLI to publish browser extensions to web stores.
Chrome Web Store, Firefox Add-ons, and Edge Add-ons are supported.
wepub chrome ./my-extension.zip \
--publisher-id "..." \
--item-id "..." \
--client-id "..." \
--client-secret "..." \
--refresh-token "..."wepub firefox ./my-addon.zip \
--addon-id "..." \
--api-key "..." \
--api-secret "..." \
--channel listedwepub edge ./my-addon.zip \
--product-id "..." \
--client-id "..." \
--api-key "..."GitHub Actions, via setup-wepub:
uses: iorate/setup-wepub@v1Shell script (macOS / Linux):
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/iorate/wepub/releases/latest/download/wepub-installer.sh | shPowerShell (Windows):
powershell -ExecutionPolicy Bypass -c "irm https://github.com/iorate/wepub/releases/latest/download/wepub-installer.ps1 | iex"Homebrew:
brew install iorate/tap/wepubnpm:
npm install -g @iorate/wepubCargo (requires Rust 1.88+):
cargo install wepubPrebuilt binaries for macOS, Linux, and Windows are also on the release page.
Only existing items can be updated; the initial submission of a new extension still has to go through each store's web UI.
Follow Use the Chrome Web Store API to obtain an OAuth client ID, client secret, and refresh token.
Alternatively, pass a pre-fetched OAuth access token via --access-token instead of a refresh token. This is suitable for automated workflows that authenticate with a service account. The two authentication modes are mutually exclusive.
IDs and credentials are required and can be supplied via flags or environment variables:
| Flag | Environment variable |
|---|---|
--publisher-id |
WEPUB_CHROME_PUBLISHER_ID |
--item-id |
WEPUB_CHROME_ITEM_ID |
--client-id |
WEPUB_CHROME_CLIENT_ID |
--client-secret |
WEPUB_CHROME_CLIENT_SECRET |
--refresh-token |
WEPUB_CHROME_REFRESH_TOKEN |
--access-token |
WEPUB_CHROME_ACCESS_TOKEN |
Other flags:
| Flag | Description |
|---|---|
--publish-type |
Whether to publish immediately on approval (default) or stage for later publishing (staged). |
--deploy-percentage |
Initial deploy percentage (0-100). Omit to use the Developer Dashboard default. |
--skip-review |
Attempt to skip item review (true or false). |
Obtain an API key and an API secret from the API Credentials Management Page.
IDs and credentials are required and can be supplied via flags or environment variables:
| Flag | Environment variable |
|---|---|
--addon-id |
WEPUB_FIREFOX_ADDON_ID |
--api-key |
WEPUB_FIREFOX_API_KEY |
--api-secret |
WEPUB_FIREFOX_API_SECRET |
Other flags:
| Flag | Description |
|---|---|
--channel |
Required. Version channel (listed or unlisted). Determines visibility on the site. |
--compatibility |
Compatible applications, comma-separated (e.g. firefox,android). |
--approval-notes |
Information for Mozilla reviewers. Mutually exclusive with --approval-notes-file. |
--approval-notes-file |
Path to a file containing approval notes. Use - for stdin. |
--release-notes |
Release notes. Mutually exclusive with --release-notes-file. |
--release-notes-file |
Path to a file containing release notes. Use - for stdin. |
--release-notes-lang |
Locale code for the release notes (e.g. en-US, ja). Defaults to en-US. |
--source |
Path to a source archive to attach to the version. |
Obtain a client ID and an API key from the Publish API page of the Partner Center developer dashboard.
The product ID is the GUID shown on the Extension overview page in Partner Center.
IDs and credentials are required and can be supplied via flags or environment variables:
| Flag | Environment variable |
|---|---|
--product-id |
WEPUB_EDGE_PRODUCT_ID |
--client-id |
WEPUB_EDGE_CLIENT_ID |
--api-key |
WEPUB_EDGE_API_KEY |
Other flags:
| Flag | Description |
|---|---|
--notes |
Notes for certification. Mutually exclusive with --notes-file. |
--notes-file |
Path to a file containing notes for certification. Use - for stdin. |
wepub reads a .env file from the current working directory at startup, so the WEPUB_* variables above can live there. Existing shell environment values take precedence over .env entries.
| Flag | Log level |
|---|---|
| (none) | INFO |
-q / --quiet |
WARN |
-v / --verbose |
DEBUG |
RUST_LOG overrides the above (e.g. RUST_LOG=trace).
Licensed under either of MIT or Apache-2.0, at your option.