Skip to content

Security Scanning

Every module submitted through Studio undergoes automated security scanning prior to persistent storage. This automated gate ensures that buyers receive verified, policy-compliant components and maintains marketplace integrity.

Upload Verification Lifecycle

When you submit in Studio, Code SCE creates an isolated staging environment and runs the multi-scanner pipeline:

  1. Asset Validation: Verifies that visual previews are valid images (.png, .jpg, .jpeg, .gif, .webp, .svg), the README is valid markdown, and no prohibited executables or raw ZIP archives are present.
  2. Analysis Execution: Scanners execute concurrently across code demos, text documentation, and visual screenshots.
  3. Policy Evaluation: The pipeline aggregates scanner verdicts into an overall score and categorical decisions: published, hold, or reject.
  4. Storage or Cleanup: If the submission passes or is held, assets are stored in Cloudflare R2 and recorded in PostgreSQL. If rejected, files are instantly wiped from disk and an explanatory notification is dispatched to the author.

Scanner Modules

1. Static Analysis & Code Quality

ScannerPurpose
SemgrepDetects insecure coding patterns, prototype pollution, dangerous DOM sinks, and injection vulnerabilities.
ESLintEnforces JavaScript/TypeScript correctness, syntax integrity, and best practices.
Dependency AuditScans embedded dependencies for known CVEs and vulnerable packages.
Code DuplicationDetects excessive internal code cloning and boilerplate repetition.

2. Policy & Content Moderation

ScannerPurpose
Environment DetectorEnforces frontend-only modules. Uploads containing server-side runtimes (e.g. Node.js backend listeners, arbitrary child processes) are automatically rejected (backend_module_rejected).
Keyword FilterInspects text metadata and documentation for prohibited, malicious, or abusive keywords (content_rejected).
NSFW Image ModerationAnalyzes uploaded screenshots and visual proofs to ensure visual content is free from explicit or adult imagery (adult_content_rejected).

3. Simhash & Fingerprint Deduplication

To prevent spam and listing plagiarism, the platform computes Simhash & content fingerprints for uploaded assets:

  • Exact duplicates: Identical asset hashes already registered on the platform are blocked.
  • Near-duplicates: High Jaccard similarity (≥ 85%) against existing listings triggers a hold status for manual review rather than automatic publishing.

Decision Outcomes

                 ┌─────────── Reject  (Files purged, 422 error + notification)

Submission ──▶ Pipeline ─┼─────────── Hold    (Stored as Draft for manual review)

                 └─────────── Pass    (Published live or saved as Draft per author choice)

✅ Published (Pass)

The upload satisfies all security thresholds with no policy flags. If the author selected "Save & Finish", the listing goes live immediately on the marketplace.

⏸️ Hold (Manual Review)

The submission contains borderline signals (e.g., high similarity to an existing listing, minor accessibility flags, or unrecognized structures). The module is safely saved as a private draft under the author's account pending human moderator review.

❌ Rejected

The upload violates core platform security rules (such as backend code execution, prohibited keywords, or NSFW imagery).

  • Files are immediately discarded from staging and are never written to object storage.
  • An HTTP 422 Unprocessable Entity response is returned with the exact error code (backend_module_rejected, content_rejected, adult_content_rejected, or security_rejected).
  • An in-app notification with the rejection reason is sent to the author's dashboard.

Rejections are Actionable

A rejection does not penalize your account. Simply address the flagged issue — such as replacing an invalid screenshot or removing server-side code — and resubmit.

Next Step

Learn how your listing is displayed to developers: Publish a Module →.

Built for developers who ship.