Multi-extension monorepo for cross-browser extensions.
whyEXT is a local-first, privacy-first monorepo for browser extensions.
Each extension is developed as an independent module under extensions/<name>,
with shared build tooling, docs, and release workflow in one repository.
Design goals:
- Ship focused utilities that solve one job well
- Keep permissions minimal and behavior transparent
- Support both Chrome-based browsers and Firefox from the same codebase
- Product context:
PRODUCT_CONTEXT.md - Tech stack decision:
TECH_STACK.md - Roadmap:
ROADMAP.md - Change history:
CHANGELOG.md - Contributing guide:
CONTRIBUTING.md - Security policy:
SECURITY.md - Code of conduct:
CODE_OF_CONDUCT.md - Disclaimer:
DISCLAIMER.md - License:
LICENSE - Release readiness:
RELEASE_CHECKLIST.md
- Main guide:
README.md - Product context:
PRODUCT_CONTEXT.md - Tech stack decision:
TECH_STACK.md - Roadmap:
ROADMAP.md - Changelog:
CHANGELOG.md - Contributing:
CONTRIBUTING.md - Security:
SECURITY.md - Code of Conduct:
CODE_OF_CONDUCT.md - Disclaimer:
DISCLAIMER.md - License:
LICENSE - Release readiness:
RELEASE_CHECKLIST.md - Extension docs:
extensions/dark-mode/README.md - Extension docs:
extensions/image-quick-save/README.md - Extension docs:
extensions/youtube-subbar/README.md - Extension template:
extensions/_template/README.md - Shared package docs:
packages/shared/README.md - PR template:
.github/PULL_REQUEST_TEMPLATE.md - Issue template (bug):
.github/ISSUE_TEMPLATE/bug_report.md - Issue template (feature):
.github/ISSUE_TEMPLATE/feature_request.md - Release notes template:
.github/RELEASE_NOTES_TEMPLATE.md
extensions/<extension-name>/src: source filesextensions/<extension-name>/dist: build outputextensions/_template: starter template for new extensionspackages/shared: common helpers/types for multi-extension reusescripts/build.js: generic builder for Chrome and Firefox
Current extensions:
extensions/dark-mode: simple per-domain dark mode toggleextensions/image-quick-save: hover-to-save images quicklyextensions/youtube-subbar: enhanced horizontal subscriptions bar for YouTube
npm run buildPer-extension commands:
npm run build:dark-mode
npm run build:dark-mode:chrome
npm run build:dark-mode:firefox
npm run build:image-quick-save
npm run build:image-quick-save:chrome
npm run build:image-quick-save:firefox
npm run build:youtube-subbar
npm run build:youtube-subbar:chrome
npm run build:youtube-subbar:firefox
npm run typecheck
npm run testScaffold a new extension:
npm run scaffold:extension -- my-extension- Open
chrome://extensions - Enable Developer mode
- Click "Load unpacked"
- Select one extension folder:
extensions/dark-mode/dist/chromeextensions/image-quick-save/dist/chromeextensions/youtube-subbar/dist/chrome
- Open
about:debugging#/runtime/this-firefox - Click "Load Temporary Add-on..."
- Select one extension manifest:
extensions/dark-mode/dist/firefox/manifest.jsonextensions/image-quick-save/dist/firefox/manifest.jsonextensions/youtube-subbar/dist/firefox/manifest.json
- This repo is optimized for local-first development.
- End users install only the specific extension folder they need.
- Each extension can later be published independently to stores.