Publishing
Submit a repository, publish many plugins from one repository, update a listing by pushing, and remove a listing.
This page walks through listing your plugins in the marketplace, keeping them up to date and taking them down. The marketplace reads plugins straight from a public GitHub repository, so most of the work happens in your repository.
Before you submit
Check these points first:
- Each plugin is a folder with a
PLUGIN.md. Every file its frontmatter names, intools/,widgets/orscreens/, is committed. See the manifest reference and Declarative plugins. - For a remote plugin, which is a Model Context Protocol (MCP) server, the server is deployed over
HTTPS, or you document how to host it yourself. The server's
nameequals the plugin'sid. You can start fromtemplates/remote-plugin. - The repository is public on github.com.
- The plugins follow the review rules. In short, they never ask for campus passwords, they declare their effects honestly, their tools return data rather than instructions, and they disclose any cloud use.
Submitting a repository
- Open /marketplace/submit. Paste
owner/repo, a repository URL or a folder URL, such ashttps://github.com/owner/repo/tree/main/plugins. - Fix every error the preview shows. After each push, run the check again. Results are cached for about a minute.
- Click Submit for listing. This opens an issue in
pkuinfo/pkuharness-websitewith the details filled in and theplugin-submissionlabel. - A GitHub Action scans the repository again and posts the report as a comment on the issue. If
the scan passes, it opens a pull request that adds the repository to
data/sources.json. If you edit the issue, the Action runs again. - A maintainer merges the pull request. The plugins appear in the marketplace with the next deploy of the site.
You can also scan and add the repository on your own machine, then open the pull request yourself:
bun scripts/marketplace.ts scan owner/repo # print the report (exit 1 on errors)
bun scripts/marketplace.ts add owner/repo # scan, then add it to data/sources.jsonWithout a token, the GitHub API allows 60 requests per hour. Set GITHUB_TOKEN, for example
GITHUB_TOKEN=$(gh auth token), to raise this to 5000.
Many plugins in one repository
A repository can hold any number of plugins, and you don't need to do anything special. The
scanner finds every PLUGIN.md in the repository. Each plugin gets its own handle,
owner/repo/<folder>, and its own install link.
The scanner skips dependency, test and fixture folders, such as node_modules, tests,
fixtures and e2e. A PLUGIN.md that you keep there for testing is therefore never listed. The
manifest reference has the full list.
In a large monorepo, you can also add a pku-harness.json at the root that lists the plugin
folders. The scanner then checks only those folders, in that order, which makes scans faster and
keeps any other manifests out:
{ "plugins": ["services/canteen", "services/library-seat", "services/bus"] }Updating a plugin
To update a plugin, push to the default branch. The marketplace scans listed repositories again about once an hour. Adding a plugin folder lists the new plugin, and deleting a folder removes it.
Phones that installed a PLUGIN.md plugin download it again from its link. If the declarations
haven't changed, the app applies the update without asking. If the plugin now asks for more, the
update waits until the user accepts it. "More" means a new campus service, host or ability, or a
tool whose effect is stronger than before.
Keep each plugin's id the same across versions. Users' installs, widgets and scheduled checks
refer to the plugin by its id.
If a push introduces an error, only the plugin with the error drops out of the marketplace. The repository's page shows the problem the scanner found, so you can fix it.
Removing a listing
Removing your own plugins. Delete the PLUGIN.md files, delete the repository, or make it
private. The listing disappears at the next scan. To remove the repository entry as well, open a
pull request that deletes it from data/sources.json.
Removal by maintainers. If a plugin breaks the review rules,
maintainers remove the repository from data/sources.json. They may also block the author from
submitting again.
Manifest reference
How the marketplace reads PLUGIN.md (plugin language v1), where the scanner looks and what it checks, and the pku-harness.plugin.json format for remote MCP servers.
Review policy & safety
The rules every listed plugin follows, what maintainers check before marking a plugin verified, and how to report a plugin.