This repository publishes versioned launcher metadata as ordinary static JSON files. It does not run a dedicated API process. The Git repository is the source of truth and GitHub Raw is the API transport. Developer trust and plugin discovery are published together in one market document.
Canonical client endpoints:
https://raw.githubusercontent.com/PCL-Nex-Developer/Nex_Server/refs/heads/main/apiv2/plugin-index.json(自动生成的插件市场预索引)https://raw.githubusercontent.com/PCL-Nex-Developer/Nex_Server/refs/heads/main/apiv2/plugin-market.json(官方附加数据源,保留 developers 白名单)https://raw.githubusercontent.com/PCL-Nex-Developer/Nex_Server/refs/heads/main/apiv2/releases.json(官网与客户端共用的 GitHub / ModelScope 下载清单)
HTTP headers are owned by the static host, not by files in this repository. GitHub Raw may serve the
valid UTF-8 JSON bytes as text/plain; charset=utf-8; clients must therefore validate and parse the
payload as JSON instead of requiring one exact raw-host media type. Cache invalidation is represented
by the content hashes in apiv2/cache.json; ETags and cache lifetimes remain host-managed.
Run all checks locally with:
python scripts/validate_static_api.py --write-cache
python -m unittest discover -s tests -v
plugin-market.json contains developers and supports direct manifests and inline plugins.
It must not contain topics: the launcher owns the hard-coded pclnexplugin GitHub Topic search,
while users can add multiple independent plugin-market JSON addresses. The official file currently
keeps manifests and plugins empty. EasyTier and ProfileUnlock
are intentionally not listed as direct manifests yet: their current files use the legacy
versions-only contract, which the launcher can safely normalize only when it has GitHub repository
metadata from Topic discovery. A direct manifests entry must use the current complete manifest
contract (id, name, author, description, repository, and platform downloads).
Download keys support both the legacy OS-neutral form (amd64, arm64, anycpu) and
OS-scoped groups (windows, linux, macos) containing those same architecture keys.
Clients select the current OS group first and fall back to legacy keys only when that OS
group is absent. This keeps existing manifests valid while allowing native packages for
Windows, Linux, and macOS on AMD64 and ARM64 to be published safely.
apiv2/plugin-index.json is generated by the index-plugin-market Action on the 20 * * * * cron:
the pclnexplugin topic repositories that pass the manifest contract are inlined into a static
pre-index, and the official developer whitelist is inherited from plugin-market.json. Each indexed
plugin also stores its direct manifest URL, resolved raw README URL, logo URL, manifest update time,
aggregate GitHub Release download count, repository status, release-note URLs, and package URLs. The
launcher therefore needs only this one document during normal marketplace discovery; direct GitHub
Topic, commit, release, and README-metadata requests are fallback/indexer responsibilities.
The update-sync Action validates the combined public registry before and after release synchronization,
rebuilds cache.json, and stages the registry together with the generated update feed. Publication
only happens after the complete unittest suite succeeds.
Launcher release assets use PCL2_Nex_<Release|Beta>_<runtime>.<extension>, where runtime is one of
win-x64, win-arm64, linux-x64, osx-x64, or osx-arm64. Windows keeps the legacy update JSON
filenames for existing clients; Linux and macOS use OS-qualified update documents such as
updates-fr-linux-x64.json and updates-fr-osx-arm64.json. Every published executable or package has
a matching detached GPG signature with the same filename plus the .asc suffix.
When SHA256SUMS is present in the corresponding ModelScope release directory, update documents put
the stable ModelScope resolve/master URL first and retain the GitHub Release URL as a fallback. The
public releases.json manifest exposes the same URLs by named source, so consumers never persist the
temporary signed CDN URL returned by ModelScope's redirect.
The same update-sync job mirrors the complete static/patch directory to
https://www.modelscope.cn/datasets/AnxunBCX/PCL_Nex/resolve/master/static/patch/ after generation and
validation but before committing the new update feed. Launcher patch downloads try this stable
ModelScope path first and fall back to the GitHub-hosted static file.