A monorepo of Chrome extensions, managed as a pnpm workspace.
Each extension lives in its own folder under extensions/:
extensions/
improve-am-web/ # Enhances the Apple Music web player
Every extension folder is self-contained (its own manifest.json, source files, package.json, and README.md) and follows the same structure. See each extension's own README for what it does, how to install it, and how to develop it.
There's no shared build step — extensions are plain JS/CSS loaded by Chrome as-is. pnpm workspaces here are just for consistent structure and tooling, not bundling.
- Create
extensions/<name>/with amanifest.json, source files, and a minimalpackage.json({ "name": "<name>", "private": true }) so pnpm picks it up as a workspace member. - The shared release workflow picks up any extension under
extensions/*automatically — no workflow changes needed.
All extensions share a single workflow, .github/workflows/release.yml:
- Trigger: a push to
mainthat changesextensions/<name>/manifest.jsonreleases just that extension (bump the version to trigger a release). It can also be run manually viaworkflow_dispatch, picking the extension by folder name. - Build: no build — the workflow zips the changed extension's folder and uploads it via
chrome-webstore-upload-cli, pinned to3.5.0(v4 requires a Publisher ID/Group Publishing that individual developer accounts don't have). - Secrets:
CHROME_EXTENSION_ID,CHROME_CLIENT_ID,CHROME_CLIENT_SECRET,CHROME_REFRESH_TOKENare plain repo secrets, unchanged from before — no new setup needed. Note these are shared across every extension in the matrix, soCHROME_EXTENSION_IDin particular only works cleanly while there's one extension; once a second one is added, its release will need a distinct extension ID (worth revisiting then — e.g. per-extension GitHub Environments).