This document is the authoritative map between Ghostify's shared source, browser packages, store listings, and release responsibilities.
| Channel | Runtime | Manifest source | Package command | Publication state |
|---|---|---|---|---|
| Chrome Web Store | Chromium MV3 service worker | dist/manifest.json |
npm run package:extension |
Published |
| Microsoft Edge Add-ons | Chromium MV3 service worker | dist/manifest.json |
npm run package:extension |
Published |
| Firefox Browser Add-ons (AMO) | Firefox MV3 background script | dist/manifest.json plus browser-targets/firefox/manifest.overlay.json |
npm run package:firefox |
Published |
Chrome Web Store and Microsoft Edge Add-ons use the same built package format, but they are independent listings. Their published versions, review states, release dates, and post-install verification evidence must be recorded separately. A release being live in one store does not prove it is live in the other.
src/ owns runtime behavior for every browser. build.js writes shared bundles
and package assets to dist/. Browser targets must not fork or copy runtime
modules. A browser-specific difference belongs in a manifest overlay, package
script, narrowly gated static behavior, validator, or release document.
dist/manifest.json remains the Chromium manifest. The Firefox manifest is
generated by combining it with browser-targets/firefox/manifest.overlay.json.
Never commit a generated Firefox manifest from tmp/firefox-extension/.
The Firefox package deliberately differs in these fields and behaviors:
background.scriptsloadsbackground.js; Firefox does not run the Chromiumbackground.service_workerdeclaration.browser_specific_settings.gecko.idis the permanent AMO identity:ghostify@ghostify-extension.vercel.app.strict_min_versionis Firefox 140. This covers Ghostify's requiredMAIN-world and origin-fallback support and Mozilla's built-in data declaration system.- The Android compatibility floor is Firefox 142 because Mozilla introduced the same data-declaration manifest field there later. The AMO package supports Firefox desktop and Firefox for Android from their respective minimum versions.
data_collection_permissions.requiredisnone.- The Firefox icon map intentionally keeps the compact
16and128entries. Chromium also declares a48entry, whose PNG dimensions are validated before packaging. - The Firefox package retains the Ghostify website host permission so its popup
uses the same dynamic
status.jsondate, color, and update title as Chromium. The display-only privileged request uses no credentials, custom headers, query parameters, or body. - The Firefox popup omits Chromium-specific store rating links. The shared Chromium popup routes ratings to the Chrome Web Store in Chrome and the Microsoft Edge Add-ons listing in Edge.
Changing the Gecko ID after the first AMO submission would create a different extension identity and is prohibited. Changes to the minimum version, data declaration, status behavior, host permissions, or background environment require compatibility and privacy review.
npm run build
npm run validate:extension
npm run validate:firefox
npm run lint:firefox
npm run test:packagePackage commands:
npm run package:extension
npm run package:firefoxThe Firefox command creates an AMO upload ZIP, reviewer source ZIP, and SHA-256 checksum for each. These files are release artifacts and must not be committed.
npm run ci is the combined local gate for all maintained browser targets.
npm run ci:chromium and npm run ci:firefox are independent channel gates.
The Chromium gate does not download or run Firefox tooling. CI runs the channel
gates and creates their artifacts in separate prerequisite and packaging jobs,
so a Firefox-only validation, lint, or packaging failure cannot suppress a
valid Chromium artifact.
- Chromium release preparation follows
RELEASE_CHECKLIST.md. - Firefox release preparation follows
docs/FIREFOX_RELEASE_CHECKLIST.md. docs/QA_FIXTURES.mdremains authoritative for live Meta smoke evidence.- Store upload, legal declarations, signing, and reviewer correspondence remain external/manual actions until explicitly performed by the maintainer.
- Public documentation must distinguish package readiness from an approved, live store listing.
The GitHub Release workflow remains gated on an approved Chrome Web Store version. A raw AMO upload ZIP is not a Mozilla-signed XPI and must not be presented as an installable public Firefox release.