Publish to the Market
The Module Market is a GitHub-backed catalog of community JS/CSS extension modules. There is no backend — the app fetches catalog files straight from this repository, so contributing is a normal pull-request flow.
Canonical rules
The authoritative submission rules, field schemas, reviewer checklist, and CI validation live in modules/README.md. This page is a quick start.
Catalog layout
modules/
├── registry.json # app-facing catalog
├── submissions.json # CI-generated PR / contributor metadata
├── README.md # contributor guide
└── <module-folder>/ # each moduleThe app fetches both registry.json and submissions.json and only shows modules present in both, keeping the in-app catalog aligned with actually-merged PRs.
Add a module
Create a kebab-case folder under
modules/:modules/my-module/ ├── module.json # required ├── main.js # required ├── style.css # optional └── icon.png # optional, ≤256KBAdd an entry to
registry.json:json{ "id": "my-module", "path": "my-module", "name": "My Module", "description": "What it does", "icon": "star", "category": "CONTENT_ENHANCE", "tags": ["demo"], "version": "1.0.0", "author": { "name": "You" }, "runAt": "DOCUMENT_END", "permissions": ["DOM_ACCESS"], "urlMatches": [{ "pattern": "*://example.com/*" }], "hasCss": false }Note: in
registry.json,versionis a semver string (unlikemodule.json, where it's an object), and there are two extra fields —pathandhasCss.Keep
registry.jsonandmodule.jsonconsistent —id,name,version,runAt, andpermissionsmust agree. CI enforces this.Open a pull request. CI runs the validator automatically.
What CI validates
python3 .github/scripts/ci/validate_modules.py checks:
- JSON validity and required fields
- Allowed enum values (
category,runAt,permissions,configItems.type) registry.json↔module.jsonconsistency- kebab-case folder names; no orphan or ghost entries; no duplicate
id/path - Required files present;
hasCssagrees with the presence ofstyle.css iconUrlsize/extension limits- No top-level
returninmain.js getConfigkeys correspond to declaredconfigItems
Browser extensions are different
The community market carries only JS/CSS modules. MV3 browser extensions are not a community catalog — the Browser Extensions tab searches the Chrome Web Store live instead. See Chrome MV3 Extensions.
Mirrors
Catalog files and module icons route through a global mirror first, with raw.githubusercontent.com and jsDelivr as automatic fallbacks, so the store loads fast everywhere (including mainland China). The default client cache is one hour, so merged modules propagate without an app update.
