Compile browser extension store listings from a single data source. Generates per-store submission copy for the Chrome Web Store, Edge Add-ons, and Firefox AMO that matches each store's submission flow exactly, so fields can be copy-pasted directly into the dashboard.
npm install --save-dev @gormanity/manifesto
Create listing.config.js at your project root:
/** @type {import('@gormanity/manifesto').Listing} */
export default {
meta: {
name: "My Extension",
officialUrl: "https://github.com/you/my-extension",
homepageUrl: "https://github.com/you/my-extension",
supportUrl: "https://github.com/you/my-extension/issues",
privacyPolicyUrl: "https://github.com/you/my-extension/blob/main/PRIVACY.md",
language: "English (en-US)",
supportEmail: null,
license: "MIT",
},
copy: {
shortDescription: "...",
detailedDescription: "...",
versionNotes: "...",
},
categories: { chrome: "Productivity", edge: "Productivity", firefox: ["Other"] },
reviewerNotes: { intro: "...", verification: ["..."], closingNote: "..." },
chrome: {
singlePurpose: "...",
remoteCodeJustification: "...",
permissionJustifications: [{ permission: "`storage`", justification: "..." }],
},
edge: { searchTerms: ["..."] },
firefox: {
reviewerVerification: ["..."],
knownLimitations: ["..."],
sourceBuildInstructions: "1. npm install\n2. npm run build",
},
};Then run:
npx manifesto build
This writes:
dist/store/chrome.md— Chrome Web Store dashboard flowdist/store/edge.md— Edge Add-ons partner center flowdist/store/firefox.md— Firefox AMO submission flow
manifesto build [options]
--config <path> Path to listing config (default: ./listing.config.js)
--manifest <path> Path to extension manifest.json (default: ./manifest.json)
--out <path> Output directory (default: ./dist/store)
import {
renderChrome,
renderEdge,
renderFirefox,
} from "@gormanity/manifesto";MIT