Mod Release And Submission Guide
This guide is the operational playbook for shipping Nimi desktop mods and handling third-party listing requests.
Chinese mirror: release_cn.md
For the maintainer-facing step-by-step workflow for official mods that live in nimi-mods/, see nimi-mods/RELEASE.md in the repo root.
Normative behavior still lives in:
spec/desktop/mod-hub.mdspec/desktop/kernel/mod-governance-contract.mdapps/desktop/docs/mod-runtime-layout-contract.mdRELEASE.md
Relevant Desktop kernel anchors for this guide:
D-MOD-016— catalog release visibility and source-of-truth boundaryD-MOD-017— third-party package ownership boundaryD-MOD-018— trust tier semanticsD-MOD-019— re-review triggers and risk handling
What ships where
nimi-mods/is the source workspace for official Nimi-maintained mods.- Third-party mods do not get merged into
nimi-mods/by default. - Desktop distribution truth comes from the standalone catalog repo, not from scanning source trees.
- GitHub Release assets hold immutable package artifacts.
- Catalog JSON decides whether a package is listed, installable, blocked, yanked, or quarantined.
Trust tiers
official: Nimi-owned package, built fromnimi-mods/, signed by Nimi, listed by default.verified: third-party package, still owned by the third party, but publisher identity and signer chain have been reviewed by Nimi.community: third-party package that passes structural and safety review for listing, but is not identity-verified by Nimi.
Only official mods belong in nimi-mods/. verified does not mean source transfer or ownership transfer.
Required release artifacts
Every cataloged mod release must publish:
- one prebuilt
.zippackage - one sidecar
release.manifest.json - a stable public release URL for both files
The sidecar release manifest must include:
packageType=desktop-modfor Nimi v1 installable modspackageIdversionchannelartifactUrlsha256signaturesignerIdminDesktopVersionminHookApiVersioncapabilitiespublishersourcestate
nimi-app entries may exist in the catalog schema, but desktop v1 does not install them.
Official mod release boundary
Official first-party mods are released from the nimi-mods/ source workspace, but they are still listed through the platform catalog flow.
Boundary split:
- maintainer runbook:
nimi-mods/RELEASE.md - platform governance and Desktop visibility rules: this document
Platform-level rules to keep in mind:
- GitHub Release assets are immutable package artifacts, not listing truth by themselves.
- Desktop users only see a release after the catalog PR merges and the catalog host serves updated
index/v1/**. - official release automation still runs from the main repo because it needs both
nimi-mods/sources and catalog update scripts.
Third-party listing model
Third-party mods follow a listing model, not a source merge model.
Default rule:
- third-party source stays in the author's own repository
- the author publishes their own release assets
- catalog inclusion happens through the catalog repo and Nimi review
Possible outcomes:
- listed as
community - listed as
verified - rejected
- deferred until missing requirements are fixed
Third-party author checklist
Before requesting listing, the author must provide:
- a public source repository
- a public GitHub Release or equivalent static host for the
.zip - a public
release.manifest.json - a stable
packageId - explicit capabilities with justification
- tested desktop compatibility information
- maintainer contact and update owner
- license and attribution clarity
Strongly recommended:
- use the scaffold in
examples/mod-template - run
pnpm build,pnpm doctor, andpnpm packin the mod repo before submission - keep release assets immutable after publication
Third-party submission flow
Step 1. Submit intake
Open the Mod submission issue in this repository and provide:
- package id
- version
- source repository
- zip artifact URL
release.manifest.jsonURL- capability justification
- tested desktop compatibility
- requested trust tier
- maintainer contact
The issue is intake for review. It is not listing by itself.
Step 2. Triage
Maintainers perform a fast intake check:
- artifact URLs are reachable
release.manifest.jsonparsespackageTypeis acceptablepackageIddoes not conflict with an existing owner- capability claims are understandable
- the package is not asking for unsupported install semantics
Typical triage outcomes:
needs-info: missing metadata or broken linksunder-review: review startedrejected: hard policy or safety failureready-for-catalog-pr: metadata is sufficient for listing work
Step 3. Technical review
Maintainers then verify:
- digest matches the downloadable artifact
- signature format and signer identity are coherent
minDesktopVersionandminHookApiVersionare realistic- manifest capabilities match the stated behavior
- the mod does not bypass
nimi-hook - the package is installable as a prebuilt archive
- there is no obvious path traversal, broken archive layout, or malformed metadata
For verified, maintainers additionally verify:
- publisher identity
- signer ownership and public key continuity
- package ownership continuity across releases
Step 4. Trust-tier decision
Decision rules:
official: only Nimi-owned mods fromnimi-mods/verified: third-party package passed identity and signer reviewcommunity: third-party package passed listing review but not full identity verificationreject: insufficient safety, ownership, or package quality
Step 5. Catalog update
Once approved:
- the release is added to the catalog repo
packages/<packageId>.jsonis created or updatedreleases/<packageId>/<version>.jsonis addedpackages.jsonsummary is updated- signers, revocations, and advisories are reviewed as needed
- the catalog PR is opened and must pass validation
The source repository remains the package owner of record.
Step 6. Merge and visibility
After the catalog PR merges:
- the package becomes visible through the hosted catalog
- desktop can discover it
- install policy follows the assigned trust tier
Step 7. Future updates
For later versions, the author does not re-submit source code into nimi-mods/.
Instead they:
- publish a new immutable release in their own repo
- keep
packageIdownership unchanged - update
release.manifest.json - request catalog update for the new version
Re-review is required when:
- signer changes
- publisher ownership changes
- capability set expands materially
- trust tier upgrade is requested
Maintainer handling checklist
Use this checklist when processing a third-party request.
Intake checklist
- links resolve
release.manifest.jsonis public- zip artifact is public
packageIdis not squatting on an official package namespace- package description is understandable
Technical checklist
- artifact digest matches
- signature/signer fields are present
- package layout is valid
- capabilities are justified
minDesktopVersionis not below the supported floor- no runtime/SDK boundary bypass
Governance checklist
- trust tier selected explicitly
- publisher display name is acceptable
- signer registry entry exists or is proposed
- no open revocation or blocking advisory conflict
- support owner is known
Merge checklist
- catalog diff only touches intended package files
- release record stays immutable
- channel pointer is correct
- Pages/raw hosting path will expose the new files after merge
Rejection and escalation rules
Reject or hold a request when:
- artifact and manifest do not match
- package ownership is ambiguous
- signature or signer history is missing for a
verifiedrequest - capabilities look excessive or unjustified
- package tries to depend on unsupported install-time compilation
- artifact layout is malformed or unsafe
Escalate to security or governance review when:
- a previously listed package changes signer unexpectedly
- package ownership is disputed
- a listed package appears malicious or compromised
- the requested trust tier does not match available evidence
Yank, quarantine, revoke, and block
Use the catalog overlays instead of rewriting release history.
yank: keep release history visible, but stop recommending or auto-updating to that releasequarantine: treat the package as high-risk and prevent normal install flowrevocation: invalidate a package, release, or signer identity- advisory
block: hard-stop install and update in desktop
When a listed third-party package becomes unsafe:
- open an urgent catalog PR
- update
revocations.jsonand/oradvisories.json - move package state if needed
- notify the author through the submission issue or repository contact
Recommended repository split
Keep these responsibilities separate:
- source repo: code, build, pack, GitHub Release assets
- catalog repo: listing, trust tier, revocation, advisory, search index
- desktop app: install, verify, update, rollback
That split is the core v1 policy and should not be collapsed back into nimi-mods as a source-scanning Mod Hub.