Community-maintained plugin index for PenMods.
This repository only contains the registry/index source and the static website. The PenMods installer plugin lives in a separate repository: https://github.com/grayawa/PenModsPluginInstaller
- Developers submit a pull request to the
registrybranch with a plugin metadata file inplugins/. - GitHub Actions validates all YAML entries against the registry schema.
- The build step aggregates plugin metadata into machine-readable JSON files.
- GitHub Pages serves a searchable static site from the generated output.
npm install
npm run validate
npm run buildGenerated artifacts:
dist/data/plugins.json: complete registry payloaddist/data/index.json: lightweight listing for the websitedist/data/stats.json: aggregate stats
This repository separates site code from registry data.
maincontains the static website, schema, and build scripts.registrycontains the community-maintainedplugins/metadata files.- GitHub Actions checks out both branches and builds a static
dist/output. - GitHub Pages deploys the generated artifact directly from Actions.
This keeps plugin submissions away from website code while still deploying one static site.
Each project is declared in its own YAML file under plugins/ on the
registry branch. The canonical schema lives in schema/plugin.schema.json on
main.
Compatibility supports both version gates and capability declarations:
compatibility:
penmods: ">=1.3.0"
capabilities:
requires:
- capability:editor.commands
conflicts:
- capability:runtime.legacy-hooks
optional:
- capability:network.fetchProjects may also declare capabilities they provide to the ecosystem:
provides:
- capability:panel.git-tools
- capability:export.markdownPlugin-to-plugin relationships can be categorized too:
dependencies:
required:
- id: penmods.core-ui
optional:
- id: penmods.theme-hooks
peer:
- id: penmods.git-core
incompatible:
- id: penmods.legacy-panelUse kind for project type, category for one stable primary bucket, and tags for flexible discovery metadata.
When a real plugin package already has a native metadata.json, prefer using that package id as the registry id.
Closed-source or restricted-distribution projects can still be indexed. Use source_available, visibility, and distribution to describe how users obtain them.
See CONTRIBUTING.md and copy templates/plugin.template.yaml when submitting
a new plugin to the registry branch.