English | 简体中文
The public, data-only registry behind the Motrix plugin directory. Entries
merged here are aggregated into a single plugins.json and served at:
https://dl.motrix.app/registry/plugins.json
Two peer consumers read that file: the motrix.app/plugins directory and the in-app marketplace of Motrix itself. New plugins go live for both the moment the publish workflow finishes — no website or app release required.
- Fork this repo and add one file:
plugins/<your.plugin-id>.json. The filename must equal the pluginid. Start from an existing entry or the annotated schema inschema/registry.ts. - Community entries must include a
packageblock — anhttpsURL to a GitHub release asset (or dl.motrix.app), itssha256, andsize. Motrix verifies the hash before unpacking and refuses mismatches. - Icons/screenshots are optional. Put files under
assets/<your.plugin-id>/and reference them by their published URL:https://dl.motrix.app/registry/assets/<your.plugin-id>/<file>. - Open a PR. CI runs
pnpm validate(schema + policy: id namespace, package allowlist, registered categories, asset prefixes). A maintainer review is the trust gate — the registry pins your package hash, so any new release needs a version-bump PR.
Rules enforced by CI:
idis dot-namespaced lowercase (author.plugin-name);motrix.*is reserved for builtin plugins.name/descriptioncarry at least English; addzhif you can — consumers fall back toenautomatically.categoriesmust be registered inschema/registry.ts(PR a new slug first if none fits).- Permission fields are a preview for the install consent screen; the actual grants always come from the manifest inside your package, and the app rejects packages whose manifest disagrees with the registry entry.
Merges to main trigger .github/workflows/publish.yml:
validate → aggregate (dist/plugins.json, stamped with generatedAt) →
upload to the motrix-registry R2 bucket, together with assets/.
Consumers cache the file with ETags and keep a last-good copy, so a bad
deploy can never blank the directory.
The wire schema in schema/registry.ts is the source of truth;
consumers vendor byte-identical copies of the schema and of
schema/registry.fixture.json. Changing the wire shape means updating
every consumer in the same PR cycle, and evolution is additive-only:
never rename, retype, or remove a published field.
pnpm install
pnpm test # fixture lockstep + entry policy tests
pnpm validate # what CI runs against plugins/
pnpm aggregate # build dist/plugins.json locally