Step-by-step guide to set up Chrome Web Store publishing for the CD pipeline.
- Go to Chrome Web Store Developer Dashboard
- Sign in with your Google account
- Pay the one-time $5 registration fee
- Accept the Developer Agreement
The $5 fee is per Google account, one-time only. It covers all extensions you publish.
- In the Developer Dashboard, click New Item
- Upload your extension zip (
npm run build:chrometo generate) - Fill in the required fields:
- Name and Description
- Category (e.g., Productivity, Developer Tools)
- Language
- At least one screenshot (1280x800 or 640x400)
- Privacy policy URL (use
docs/PRIVACY_POLICY_TEMPLATE.mdas a starting point)
- Click Save Draft (do not publish yet)
- Note your Extension ID from the URL — it looks like
abcdefghijklmnopabcdefghijklmnop
Don't hand-make these. The template ships a Playwright generator that drives the built extension and captures store assets at the exact CWS dimensions:
npm run capture:install # one-time: download the Playwright Chromium
npm run capture:store # → store-assets/*.png (1280×800), promo tile (440×280),
# demo.webm, and description.md (copy/paste listing copy)- Edit which states get captured in
shotkit.config.js(thescenes), and the listing copy instore-assets/STORE_LISTING.md. - Because it loads the shipped bundle, a clean run also smoke-tests the build — a screenshot only appears if that feature actually rendered.
- Upload the generated PNGs as screenshots and the 440×280 PNG as the small promo
tile; paste
description.mdinto the Summary / Description / "What's new" fields. - CWS does not host video directly — upload
demo.webmto YouTube and paste the link in the listing's video field.
The CD pipeline uses the Chrome Web Store API, which requires OAuth2 credentials.
- Go to Google Cloud Console
- Click Select a project > New Project
- Name it something like
my-extension-deployand click Create
- Go to APIs & Services > Library
- Search for Chrome Web Store API
- Click Enable
- Go to APIs & Services > OAuth consent screen
- Select External and click Create
- Fill in the required fields:
- App name: e.g.,
My Extension Deploy - User support email: your email
- Developer contact email: your email
- App name: e.g.,
- Click Save and Continue through the remaining steps
- Under Test users, add your own Google email
- Click Save and Continue
- Go to APIs & Services > Credentials
- Click Create Credentials > OAuth client ID
- Application type: Web application
- Name: e.g.,
CWS Deploy - Under Authorized redirect URIs, add:
https://developers.google.com/oauthplayground - Click Create
- Note the Client ID and Client Secret
- Go to OAuth 2.0 Playground
- Click the gear icon (top right) and check Use your own OAuth credentials
- Enter your Client ID and Client Secret
- In the left panel under Step 1, find Chrome Web Store API v1.1 and select
https://www.googleapis.com/auth/chromewebstore - Click Authorize APIs and sign in with your Google account
- Click Exchange authorization code for tokens
- Copy the Refresh token
Go to your GitHub repo > Settings > Secrets and variables > Actions > New repository secret and add:
| Secret | Value | Where to find it |
|---|---|---|
CWS_EXTENSION_ID |
abcdefghij... |
Developer Dashboard URL |
CWS_CLIENT_ID |
123456...apps.googleusercontent.com |
Google Cloud Console > Credentials |
CWS_CLIENT_SECRET |
GOCSPX-... |
Google Cloud Console > Credentials |
CWS_REFRESH_TOKEN |
1//0e... |
OAuth Playground (Step 3.5) |
- Bump version:
npm run version:patch - Commit and push
- Go to Actions tab > Deploy to Chrome Web Store > Run workflow
- Choose publish target:
default— public listingtrustedTesters— only trusted testers can see it
- Click Run workflow
The workflow will build the zip, upload it to Chrome Web Store, and create a GitHub Release.
- Double-check your
CWS_EXTENSION_IDsecret matches the ID in the Developer Dashboard URL - Make sure you have saved a draft listing (Step 2)
- Verify the values in GitHub Secrets match exactly what Google Cloud Console shows
- Make sure the Chrome Web Store API is enabled (Step 3.2)
- Refresh tokens expire if the OAuth consent screen is in Testing mode and the token is older than 7 days
- To fix: go to OAuth consent screen > publish the app (or re-generate the refresh token in OAuth Playground)
- Make sure you added your email as a test user (Step 3.3)
- Bump the version in
manifest.jsonwithnpm run version:patch - The workflow checks for existing git tags to prevent duplicate deploys
- The CI pipeline enforces a 10 MB zip size limit
- Check that
node_modules/and other large directories are not included in the build - Review the
build:chromescript inpackage.json