What can be published today
Data-only packs — open
Ready profiles, action packs, icon packs and sound packs use the real moderation flow and can be published.
Executable plugin — closed
Public executable plugin upload is currently in the
503 PLUGIN_UPLOAD_NOT_READY state. For details see Distribution status.There is no separate publisher application. Anyone who is signed in can upload and submit to moderation; the only gate is moderation. Only the pack owner can submit a pack to moderation. The “Verified” badge exists only on official wraithesports content.
Prerequisites
Step 1 — Prepare the pack with the CLI
@evoxapp/plugin-cli (evox-plugin) validates the project, produces a bundle and packages an .evoxpack with the evox-archive-v1 policy.
The CLI
pack output is an executable pack carrying packageType: plugin. Because executable upload is closed, this pack gets 503 PLUGIN_UPLOAD_NOT_READY in Step 2 today. The data-only packs that can be published today are produced by the desktop app: Publish your own pack.Step 2 — Upload
The validated.evoxpack file is uploaded as multipart to the POST /packages/upload endpoint. The upload is accepted from any authenticated (signed-in) session; no separate publisher approval is needed.
The server first writes the file to secure quarantine, then scans it within the same request. If the scan passes, the upload response returns a draft (draft) version; if not, an error code is returned and no draft is created. The draft is not published yet: it is submitted separately with the Moderation submission step below.
Step 3 — Server security pipeline
Every uploaded pack goes through the following gates. This flow is server-authoritative; no client field can change the result.1
Quarantine
The file is SHA-256 hashed and written to an immutable private quarantine area. If the storage write fails, the draft is not created (fail-closed).
2
Static scan
Archive policy (zip bomb / path traversal / size), magic-byte match, SVG active content, secret leakage, forbidden extension and legacy identifier checks are performed.
3
Draft record
If the scan passes, the pack is recorded as a draft version atomically bound to the scan evidence (
policyVersion, scanDigest, findings).4
Moderation submission
The pack owner submits the version to moderation with
POST /submissions. The server verifies scanStatus: passed and scanDigest === fileHash again.5
Approval
A moderator reviews the scan evidence and approves/rejects. Approval publishes the pack on the Market.
Main content rejected by the scan
- Secret leakage: private keys, API tokens, JWTs or real credential values in config.
- Magic-byte mismatch: files whose extension does not match their real content type.
- Active SVG: SVG containing scripts, event handlers or external references.
- Forbidden extension (data-only):
.exe,.dll,.js,.batand similar executable/active files. - Legacy identifier: use of old StreamDock UUIDs.
- Local path leakage: absolute file paths inside the manifest or profile.
Upload error codes
When uploading a new version to an existing product, these codes can also be returned:
Moderation submission error codes
EXECUTABLE_PUBLISHER_APPROVAL_REQUIRED and PLUGIN_ID_ALREADY_CLAIMED are not upload or submission errors; they are returned from the request to claim an executable plugin identity. Because executable upload is closed, this step does not open a publication path today.