Browser extension
The extension is the same app as the web build, packaged as a new-tab override (Manifest V3). It requests no permissions and has no content scripts.
Build and load
npm run build:extension # writes dist-extension/
- Chrome / Edge: open
chrome://extensionsoredge://extensions, turn on Developer mode, select Load unpacked and pickdist-extension/. - Firefox: open
about:debugging#/runtime/this-firefox, select Load Temporary Add-on and pickdist-extension/manifest.json.
Package
npm run deploy:dry # writes dist-extension.zip, files at the archive root
The ZIP is built in-process; no shell, PowerShell or zip binary is needed.
Store screenshots
STORE_SCREENSHOTS=1 npx playwright test tests/e2e/screenshots.spec.ts --project=chromium
This regenerates the eight 1280×800 screenshots and the four promotional tiles from the current app, with fixed demo data for charts and feeds (link cards load the real site favicons).
Publish
Releases run in one manual workflow: Actions → Release → Run workflow.
Enter the new version (X.Y.Z, higher than both the latest
v* tag and the version in package.json on main) and pick
the stores. The workflow sets the version, builds, pushes tag vX.Y.Z (main
itself is not changed),
creates the GitHub Release, and then publishes the same build to each selected
store in parallel. A failed store can be retried with Re-run failed jobs.
Locally, npm run deploy (or deploy:chrome, deploy:edge, deploy:firefox)
uploads the ZIP with the credentials in chrome.env, edge.env and
firefox.env. The full release guide, including the one-time store setup and
the required secrets, is in
extension/EXTENSION.md.
Store copy and reviewer notes:
extension/STORE_LISTING.md.