Developer Docs

Publish from your coding agent

Connect Claude Code, Claude Desktop, Cursor or any other MCP client to Crela. Your agent prepares the listing, checks the build, submits it and reacts to review feedback - you only set the price and confirm.

Despite the name, the Crela MCP server @crela/mcp is not something you host. It is a small program that runs on your own computer. Your AI app - Claude Code, Claude Desktop, Cursor or VS Code - starts it in the background when needed. There is nothing to host and nothing to deploy.

Why local? Publishing means uploading your build ZIP and screenshots, and those live on your disk - a server on the internet cannot read them. Your API key is stored only on your machine and sent only to crela.io. The hosted search connector only finds software and cannot publish.

Overview

There are two ways to work with Crela programmatically:

Both use the same API key and run through the same review pipeline. Nothing goes live without passing the review.

MCP Setup

1

Connect Claude Code in one command

npx -y @crela/mcp setup

Your browser opens crela.io, you check the code and click Connect. The command then adds the server to Claude Code for all your projects, with a fresh API key it never shows you. Works in PowerShell, macOS and Linux terminals alike. Start a new Claude Code session afterwards.

2

Or set it up manually

Create an API key in your creator dashboard. The full key is shown once; it starts with crela_.

Claude Code, macOS, Linux and Git Bash:

claude mcp add crela --scope user --env CRELA_API_KEY=crela_... -- npx -y @crela/mcp

Windows PowerShell:

claude mcp add crela --scope user --env CRELA_API_KEY=crela_... '--' cmd /c npx -y @crela/mcp

--scope user makes the server available in all your projects. Check it with claude mcp list, then start a new session.

Other clients, one click:

  • Claude Desktop: open crela.mcpb or drag it into Settings → Extensions. If your system asks which app should open it, choose Claude. Claude asks for your API key and keeps it in your system keychain.
  • VS Code: asks for your API key as a password field during installation.
  • Cursor: installs with an empty key. Paste your key into CRELA_API_KEY under Cursor Settings → MCP; search works without it.

Cursor (~/.cursor/mcp.json), Claude Desktop without the extension (claude_desktop_config.json) and most other clients take the same JSON block:

{
  "mcpServers": {
    "crela": {
      "command": "npx",
      "args": ["-y", "@crela/mcp"],
      "env": { "CRELA_API_KEY": "crela_..." }
    }
  }
}
3

Ask your agent

Open your project and say something like "Publish this tool to Crela for 9.99 EUR". The agent reads the requirements, prepares the listing and shows you the draft before it submits.

Security: The key belongs in the MCP client config, never in the chat and never in source control. Prefer the user-level config over a project file that gets committed.

The discovery tools work without a key. CRELA_BASE_URL is optional and defaults to https://crela.io. The server runs locally over stdio and needs Node.js 18 or newer.

MCP Tools

Every key-authenticated API action has exactly one MCP tool. Tool inputs mirror the server-side rules, so invalid values are rejected before anything is uploaded.

Discovery (no API key)

search_softwareSearch approved marketplace software by query, category, language and sort order.
get_softwareFull public detail of one listing, looked up by slug.
get_submission_requirementsMachine-readable submission rules, K.O. criteria and live thresholds. Call it before every submission.

Publish (needs CRELA_API_KEY)

list_my_softwareEvery tool you own with id, slug, review status, unlisted flag, price and sales count.
precheck_buildDry run of the submit gate on a build ZIP: framework detection, bundle completeness, SDK marker and file limit. Returns a storage_path you can reuse.
preview_markerCompute the SDK marker (KO-10) for a planned slug, to embed in a paid build before the first submission.
get_sdk_markerFetch the SDK marker of an existing tool before building a new paid version.
submit_new_softwareCreate a brand-new listing from a build ZIP plus metadata and start its review.
update_softwareShip a new build of an existing tool (presign, direct upload, finalize). channel "demo" publishes a demo without touching the live listing.

Review (needs CRELA_API_KEY)

check_review_statusLightweight review progress, current sub-step and remaining update quota.
get_review_reportFull review report: pass or fail, rejection reasons and the findings to fix.

Manage listings (needs CRELA_API_KEY)

get_my_software_detailsFull metadata and media list (with ids) of one of your tools, in any status.
set_metadataChange metadata without a new build: texts, price, sales, trials, devices, tags, privacy policy, unlisted.
upload_screenshotUpload a screenshot or the logo from a local file (JPG, PNG, WebP or GIF, max 5 MB). An approved tool is listed only with at least 2 screenshots.
update_mediaChange the sort order of a media item or the URL of a video entry.
delete_mediaRemove a screenshot, logo or video entry from a listing.
delete_softwarePermanently delete a tool that was never sold. Sold tools are unlisted instead.

Publish Workflow

First submission

  1. 1

    get_submission_requirements - Learn the rules, required fields and K.O. criteria.

  2. 2

    precheck_build - Dry-run the submit gate and fix missing files or the marker before spending a review cycle.

  3. 3

    submit_new_software - Metadata plus the build. Pass the storage_path from the precheck so the ZIP travels only once.

  4. 4

    upload_screenshot - At least 2 screenshots (at least 640 x 360 px). The review approves the software on its own; the listing goes on the market once the screenshots are in. check_review_status attests the presentation level and lists what makes it ideal (logo, 4 screenshots in Full HD, video).

  5. 5

    check_review_status - Poll until the review completes, then read get_review_report, fix the findings and resubmit.

Shipping analytics or telemetry? Set privacy_policy, name the service in it and declare its server in the network list. The review lists trackers it finds as notes; the launcher only lets the app reach the declared servers.

New versions

Ship a new build with update_software (software id, build ZIP, version, os, arch). Versions are semver. A release build goes through the review again; channel: "demo" publishes a demo without touching the live listing. Paid tools embed the SDK marker from get_sdk_marker first (see Copy Protection). Lost a software id? list_my_software returns all of them.

Search Connector

Just want your assistant to find software on Crela? Add the hosted connector by URL. There is nothing to install and no API key - it works in the browser, on your phone and on the desktop.

https://crela.io/mcp

In Claude: Settings → Connectors → Add custom connector, then paste the URL. Other assistants that support remote MCP servers take the same URL.

It offers search_software and get_software, each result with a link to its Crela page, where you buy it. Publishing needs the local server from MCP Setup, because it reads your build files and uses your API key.

REST API

The MCP server is a thin client over these endpoints. Use them directly from CI/CD or your own scripts.

Base URL: https://crela.ioJSON responses unless noted (multipart for file uploads)

Authentication

All endpoints except GET /api/agent/requirements require a Bearer token.

Authorization: Bearer crela_<your-api-key>

Create keys in your creator dashboard. The full key is shown once on creation. Keys have the prefix crela_.

Security: Never commit your API key to source control. Use an environment variable: CRELA_API_KEY.

Quickstart

Submit your first tool in 5 steps:

1

Create an API key

Dashboard → API Keys → Create key. Copy it immediately - it's shown only once.

2

Read platform requirements

curl https://crela.io/api/agent/requirements
3

Submit software

# framework / entrypoint / install_type / platforms / license are
# detected by the server from the build ZIP. You only send marketing content
# plus the ZIP.
curl -X POST https://crela.io/api/agent/software \
  -H "Authorization: Bearer $CRELA_API_KEY" \
  -F "file=@dist/myapp-build.zip" \
  -F "title=My App" \
  -F "slug=my-app" \
  -F "description=A short description" \
  -F "long_description=Full markdown description" \
  -F 'categories=["tool"]' \
  -F "price_eur=0" \
  -F "version=1.0.0" \
  -F "system_requirements=Windows 10+"
4

Save the tool ID

# Response: { "id": "tool_abc123", "slug": "my-app", "status": "pending_review" }
TOOL_ID="tool_abc123"
5

Poll the review

# Repeat every 30 s until review_job_status != "running"
curl https://crela.io/api/agent/software/$TOOL_ID/review \
  -H "Authorization: Bearer $CRELA_API_KEY"

API Reference

Get Requirements

GET/api/agent/requirementsNo auth required

Machine-readable schema with submission constraints, K.O. criteria, quality guidelines, and content rules. Fetch before every submission.

{
  "schema_version": "1",
  "submission": { /* required/optional fields, types, constraints */ },
  "ko_rules": [ /* 12 hard-rejection rules (KO-01..KO-12) */ ],
  "quality_guidelines": { /* 5 scored evaluation categories */ },
  "content_rules": { /* allowed/blocked URLs */ }
}

Build format: portable builds only

Crela accepts portable builds only - no setup wizard, no installer. Windows and Linux builds (AppImage/ELF) get the full review including the test run. macOS builds are accepted, but get no test run.

Definition

Portable means: after extraction from the ZIP archive, the program runs without a setup wizard, without writing registry entries, without requiring administrator rights, and without a global installation in Program Files.

Rule: scripts must be compiled in

If the program logic resides in script files that an interpreter would have to load at runtime, those files must be compiled into the executable (AutoHotkey via Ahk2Exe, AutoIt via Aut2Exe, Python via PyInstaller). An interpreter plus loose script files is not accepted - this applies to all frameworks.

Allowed formats

  • ✦ZIP archive with EXE and dependencies (folder portable, Windows)
  • ✦Single EXE (PyInstaller onefile, Go static, Rust static)
  • ✦.NET single-file self-contained (AOT or JIT)
  • ✦Java fat JAR or JLink bundle
  • ✦Electron / asar as ZIP
  • ✦Tauri bundle as ZIP (Windows)
  • ✦AppImage (Linux - recommended, because the frontend is extracted alongside)
  • ✦Linux ELF + companion files as ZIP (limited - for Tauri or Electron builds the embedded frontend is brotli-compressed, so the pipeline cannot inspect it)

Automatically rejected

  • ✕NSIS installers (e.g. *Setup.exe, *-installer.exe)
  • ✕InnoSetup (*Setup.exe)
  • ✕MSI and MSIX
  • ✕WiX-generated installers
  • ✕Self-extracting setup wrappers - even if the result would be portable
  • ✕macOS .dmg images
  • ✕macOS .pkg packages (XAR)
  • ✕Linux .deb packages
  • ✕Linux .rpm packages

The rule applies to the program you submit: it must run directly without installation. Helper setups bundled next to it are allowed, for example the Microsoft Visual C++ runtime installer (vc_redist.exe) or an optional driver setup.

Supported frameworks

Electron / asarC++ / Qt native.NET (WPF, WinForms, single-file AOT, .NET Framework)Python (PyInstaller onedir or onefile)Java (fat JAR, JLink bundle)Go (statically linked single EXE)Rust (statically linked single EXE, incl. Tauri)NW.jsFlutter (Windows Desktop)wxWidgets / GTK nativePascal / Lazarus / DelphiAutoIt / AutoHotkey (compiled via Ahk2Exe/Aut2Exe only, no setup wrapper - interpreter + script file is rejected)

Your framework is not on the list? Contact support - we will review adding it. No automatic reject.

List Software

GET/api/agent/software

All tools you own with id, slug, status, version, price, unlisted flag and sales count, newest first. Optional query: status filter and limit (1 to 100, default 50).

Precheck Build

POST/api/agent/software/precheckmultipart/form-data

Dry run of the submit gate: framework detection, bundle completeness, SDK marker (KO-10) and file limit. Creates no listing and starts no review. Send file or a storage_path from Presign Upload, plus slug and price_eur; framework, entrypoint and platforms are optional overrides. The upload stays available, so the same storage_path can go straight into submit or a build update.

Submit Software

POST/api/agent/softwaremultipart/form-data

Submit a new software listing.

Required fields

filebinaryBuild artifacts ZIP (.zip only). Max 2 GB, max 500 MB per file, max 200 executable files. The server detects framework / entrypoint / install_type / platforms from it.
titlestringDisplay name
slugstringURL-friendly unique identifier
descriptionstringShort description shown in listings
long_descriptionstringFull description, Markdown supported
categoriesJSON array"tool" | "game" | "finance" | "productivity" | "creative" | "other"
price_eurnumber0 for free, or ≥ 0.99
versionstringSemver, e.g. "1.0.0"
system_requirementsstringe.g. "Windows 10+, 4 GB RAM"
security_updates_untilYYYY-MM-DDDate until which you provide security updates, at least two years from today (five recommended); shown to buyers before they buy

Auto-detected fields (the server reads them from the ZIP, optional creator override possible)

frameworkstringelectron / tauri / dotnet / java / python / native. Detected from app.asar / *.jar / BSJB magic / PyInstaller cookie / Tauri bundle pattern.
entrypointstringPath to the main executable in the ZIP: the only executable that is not a helper library (e.g. *_lib.dll, *-helper.exe). If there are several, the API returns 400 with a candidate list. An installer found here (setup.exe, .msi, .dmg, .deb, .rpm) is rejected in the review as KO-12; .AppImage is allowed.
install_typestringinstaller / executable / script / zip / other. Only describes what the ZIP contains; which formats are allowed is listed under Build Format.
platformsJSON array"windows" / "macos" / "linux" / "cross". Detected from the PE / Mach-O / ELF magic of the binaries.
licensestringDefault: "Crela Standard EULA v1" (Steam model, same license for all tools).
symbolsin the ZIP.pdb (Windows), .debug (Linux) and .dSYM (macOS) files. Required for native builds and for Tauri builds for Windows; without them the upload is refused with a clear message. They are stored separately, kept for 30 days for crash analysis and never shipped to buyers.

Conditional fields

macos_notarized"1"|"0"Required "1" when the server finds Mach-O binaries in the ZIP: you confirm that you notarized the app with your Apple Developer account. Crela does not verify the notarization itself; it relies on your declaration.
requires_system_rights"1"|"0"Default "0". Apps that need system privileges (driver, service, UAC prompt) are not accepted at the moment.

Optional fields

tagsJSON arrayAdditional discovery tags
tool_languagesJSON arrayUI languages of the software as ISO 639-1 codes, e.g. ["en","de"] (not the programming language)
privacy_policystringPrivacy policy text, not a link - telemetry providers found in the build are checked against it and listed as notes
support_contactstringSupport email or URL
safety_notesstringWarnings and safety information buyers need, shown on the product page (max 2000 characters)
screenshot_0-4binaryUp to 5 screenshot files
coverbinaryCover image for marketplace cards (falls back to first screenshot if omitted)
launcher_coverbinarySeparate cover image for the launcher tile (optional, defaults to cover)
video_urlstringYouTube or Vimeo link

Response 201 Created

{
  "id": "tool_abc123",
  "slug": "my-app",
  "title": "My App",
  "created_at": "2025-01-01T00:00:00.000Z",
  "status": "pending_review"
}

Get Software

GET/api/agent/software/{id}

Fetch full metadata and media list for a tool you own, in any status.

{
  "tool": {
    "id": "tool_abc123",
    "slug": "my-app",
    "title": "My App",
    "status": "approved",
    "version": "1.0.0"
    /* ... all metadata fields */
  },
  "media": [
    { "id": "m1", "type": "screenshot", "url": "https://...", "sort_order": 0 }
  ]
}
DELETE/api/agent/software/{id}

Permanently delete a tool including builds and media. Only possible if it was never sold; otherwise 409 - unlist it with PATCH { "unlisted": true } instead, buyers keep their access.

Update Metadata

PATCH/api/agent/software/{id}application/json

Partial update of metadata. Changing brand fields (title, description, categories, age rating) on an approved tool, or raising the price from free to paid, automatically queues a re-review. The tool stays on sale with its current details until the review approves the change; until then the change is listed in pending_changes. A rejected change is discarded.

Patchable: title · description · long_description · categories · tags · price_eur · sale_price_eur · sale_ends_at · max_devices · system_requirements · license · tool_languages · platforms · install_type · privacy_policy · support_contact · security_updates_until · safety_notes · drm_mode · video_url · framework · requires_system_rights · unlisted · trial_enabled · trial_days · network_mode · network_hosts · age_rating · age_rating_source · age_rating_reasons · age_rating_questionnaire

// Request body (any subset)
{ "description": "Updated short description", "price_eur": 4.99 }

// Response
{
  "ok": true,
  "updated_fields": ["description", "price_eur"],
  "triggered_re_review": false,
  "new_status": "approved",
  "pending_changes": null
}

Update Build

POST/api/agent/software/{id}/buildmultipart/form-data

Upload a new build of an existing tool. The same gates as on submit run first (file limit, bundle completeness, SDK marker). The ZIP is then unpacked server-side, files are deduplicated by SHA-256, a signed manifest is stored and the review pipeline is triggered. A release build sends the tool back to status="pending" until approved. This is the endpoint behind the MCP tool update_software.

Max 2 GB per ZIP, max 500 MB per file, max 200 executable files. For large builds upload via Presign Upload and send storage_path instead of file. Automatically unpacked portable containers: .asar (Electron), .jar (Java), .AppImage (Linux), PyInstaller bundles. Plain binaries are scanned directly. Classic installers (NSIS, MSI, InnoSetup, DMG, PKG, deb, rpm) are hard-rejected by KO-12 - only portable builds are allowed.

Fields

filebinaryZIP of the build tree (executable + DLLs + assets). Or storage_path from a presign upload.
versionstringSemver, e.g. "1.1.0"
osstring"windows" | "macos" | "linux"
archstring"x86_64" | "aarch64" (aliases x64, amd64, arm64 accepted)
entrypointstringOptional. Path to the main binary in the ZIP. Detected automatically; on ambiguity 400 with a candidate list.
change_messagestringOptional. Short changelog for this version.
channelstringOptional. "release" (default) or "demo". Demo builds are reviewed like any build, never change tools.status, and after approval are delivered license-free to all signed-in users (?channel=demo on download/manifest).
curl -X POST https://crela.io/api/agent/software/$TOOL_ID/build \
  -H "Authorization: Bearer $CRELA_API_KEY" \
  -F "file=@dist/myapp-build.zip" \
  -F "version=1.1.0" \
  -F "os=windows" \
  -F "arch=x86_64"
# Optional: upload a demo build (does not change the live tool)
#   -F "channel=demo"

# Response
{
  "build_id": "3090e2f5-bdf1-4842-9dae-ab4f38d7acb1",
  "tool_review_id": "...",
  "manifest_sha": "6ebbf8ab...",
  "total_files": 12,
  "total_bytes": 9052672,
  "channel": "release",
  "status": "pending_review"
}

Build Distribution

What happens to your files, from your upload to the buyer's disk. Every file is identified by its SHA-256 hash, and the list of all files is signed, so nobody can swap a file on the way without it being noticed.

  1. Upload: You upload the build folder as a ZIP. The server computes the SHA-256 of every file, stores each file under its hash and writes a manifest (path, hash and size of every file) that it signs with Ed25519.
  2. Review: The review checks every file against that signed manifest and then runs the review process. Only the build that passed is released; a later upload never replaces it unreviewed.
  3. Delivery: The Crela launcher fetches the manifest, verifies its Ed25519 signature with the public key built into the launcher, downloads the files it does not have yet and checks each one against its hash before it assembles the folder.
  4. Updates: Files are stored once per hash. An update uploads and downloads only the files that changed; unchanged DLLs and assets are reused.
  5. Cleanup: A rejected build is kept for 90 days, so it can still be reviewed again, and removed after that. Approved builds are never deleted by this cleanup, so buyers keep what they paid for.

Presign Upload

POST/api/agent/software/presign

Signed URL for a direct upload to R2 - useful for large build ZIPs (over 100 MB). You PUT the ZIP to the returned upload_url and then pass storage_path instead of file to precheck, submit or a build update. Framework and entrypoint are detected from the uploaded ZIP as usual.

// Request
{ "filename": "myapp-1.0.0.zip", "file_size_bytes": 12345678 }

// Response
{
  "upload_url": "https://storage.crela.io/...",
  "storage_path": "uploads/abc123/myapp-1.0.0.zip",
  "expires_at": "2025-01-01T01:00:00.000Z",
  "method": "PUT",
  "headers": { "Content-Type": "application/zip", "Content-Length": "12345678" }
}

Review Results

GET/api/agent/software/{id}/review

Latest review result. Poll every 30 s while review_job_status is queued or running.

// Pending
{ "status": "pending", "review_job_status": "running", "retry_after_seconds": 30 }

// Approved
{ "status": "approved", "passed": true, "rejection_reason": null,
  "review_report": { /* structured feedback */ } }

// Rejected - use rejection_reason to fix and resubmit
{ "status": "rejected", "passed": false,
  "rejection_reason": "Binary triggers K.O. rule: missing core functionality",
  "review_report": { /* detailed feedback */ } }

Quick Status

GET/api/agent/software/{id}/status

Lightweight status check including rate-limit quota.

{
  "tool_id": "tool_abc123",
  "tool_status": "approved",
  "version": "1.1.0",
  "review_job_status": "completed",
  "review_sub_step": "completed",
  "review_passed": true,
  "rate_limit": {
    "updates_used_today": 2,
    "updates_remaining_today": 3,
    "window_resets_at": "2025-01-02T00:00:00.000Z"
  }
}

Media Management

POST
/api/agent/software/{id}/media

Upload a screenshot or the logo. Fields: file (binary), type ("screenshot" | "logo"). Logo: square, at least 256 x 256 px. Screenshot: at least 640 x 360 px. Returns missing (what the listing still needs to go live) and went_live.

PATCH
/api/agent/software/{id}/media/{mediaId}

Update sort_order or swap a video URL. The first screenshot is the cover.

DELETE
/api/agent/software/{id}/media/{mediaId}

Remove a media item. Screenshot files are deleted from storage. 409 MEDIA_REQUIRED if a live listing would drop below 2 screenshots.

API Keys

POST
/api/agent/keys

Create a new API key. Returns the full key once - copy immediately. No limit on active keys.

PATCH
/api/agent/keys/{id}

Rename a key. Body: { "name": "New name" }.

DELETE
/api/agent/keys/{id}

Revoke a key. Takes effect immediately.

Rate Limits

Build updates and metadata PATCH (shared counter)5 / tool / 24 h
Build updates (all creators)Global daily review budget
Agent API calls30 req / 60 s per IP
Checkout10 req / 60 s per IP

Exceeded limits return 429 Too Many Requests with a Retry-After header. Check GET .../status for remaining update quota.

Review Process

Every new tool and every build update goes through the same review in 12 phases before it reaches buyers. It looks for malware, known vulnerabilities, hidden tracking and the K.O. rules, starts the program in a test run, and ends with a report that tells you what to fix. Each phase is summed up in one or two sentences below; open "Technical details" for tools, rule sets and limits.

Duration

A few minutes up to about half an hour. Most of the time goes to the test run.

Decision

Installers (KO-12) and incomplete bundles are rejected automatically. Every other result is decided by a Crela reviewer.

Progress

Live in your creator dashboard, by email when the review is done, and through the API or check_review_status.

The 12 phases

  1. 1
    Loadingdownloading

    We fetch every file of your build from storage, exactly as you uploaded it.

    Technical details

    Downloads every file of the build tree, including debug symbols if bundled.

  2. 2
    File checkextracting

    We unpack portable containers (Electron, Java, PyInstaller, AppImage, .NET single-file, Tauri) so the later checks see the actual code, not just the wrapper around it.

    Technical details

    Bundle auto-extract for portable containers: asar (Electron), jar (Java), PyInstaller, AppImage, .NET single-file bundles (also compressed), Tauri frontends. Classic installers (NSIS/MSI/DMG/PKG/deb/rpm) are hard-blocked as KO-12 in pre_scan.

  3. 3
    File integrity checkmanifest_consistencyCan block approval

    Every file is compared with the signed manifest made at upload, so nothing was swapped, lost or added on the way. Blocks if a file is missing, extra or changed, or if a file your program needs to start is missing.

    Technical details

    SHA-256 of every file against the signed build manifest. Findings: MISSING-FILE, EXTRA-FILE, SHA256-MISMATCH, ENTRYPOINT-MISSING, plus the bundle check for files the program needs to start, such as startup DLLs (BUNDLE-INCOMPLETE). All of them block approval.

  4. 4
    Static checkpre_scanCan block approval

    We pick the files to check and detect installer formats by their magic bytes. Blocks if the submitted program itself is a classic installer (KO-12); bundled helper setups such as runtimes or drivers are only listed.

    Technical details

    Selects the check targets (entry point, executable files, scripts, possible installer files) and detects installer formats (KO-12: NSIS/MSI/InnoSetup/Squirrel/Velopack/DMG/PKG/deb/rpm and more). If the submitted program itself is an installer: blocks_approval=true, severity=critical; bundled helper setups (runtime, driver) are only listed. The KO pattern search runs once, in source_pattern.

  5. 5
    Binary inspectionstatic_binary_analysisNever blocks on its own

    Every executable is matched against about 2,000 YARA rules for known malware, without starting it. A hit never blocks on its own: the AI review weighs it, because generic rules also match harmless code.

    Technical details

    PE header parse per file (imports, sections, subsystem) - Windows binaries only. YARA scan across all executable files against the malware-family rules of signature-base and elastic/protections-artifacts (about 1000 rule files). A YARA match is a finding for the review, not a rejection on its own.

  6. 6
    Security scanvirus_scanCan block approval

    Every executable is scanned with ClamAV on our own server and its hash and URLs are looked up in MalwareBazaar and URLhaus. Blocks on any detection.

    Technical details

    ClamAV INSTREAM for all executable files. In parallel: threat intel via MalwareBazaar + URLhaus (abuse.ch) for the file hash and the URLs found in the build. If ClamAV cannot scan a file, the build is not passed.

  7. 7
    Dependency mapsbom_generation

    We list the libraries and packages in your build, like an ingredient list. It is a tool for our vulnerability check, not your SBOM, and only you can read it.

    Technical details

    Syft produces a CycloneDX SBOM over the entire build tree and stores it with the build. It feeds the vulnerability check and the daily re-check, and only the creator can read it.

  8. 8
    Vulnerability checkcve_scanCan block approval

    Each library is checked against OSV.dev for known vulnerabilities. Only a high or critical one you can fix blocks: a fixed version exists for your platform and the affected file is really in your build. Everything else is a warning.

    Technical details

    OSV.dev scan against the SBOM from phase 7 - also works for pure binaries. KO-06 only for vulnerabilities from HIGH upwards with a fixed version in the ecosystem of the build (for Debian/Ubuntu the release, compared like dpkg; release unknown: every affected release needs a fix) and, for distro packages, when the vulnerability text names a file the build ships from that package (Syft locations). Everything else is a warning with the reason.

  9. 9
    Test runsandboxNever blocks on its own

    When a Crela review machine is available, we start your program in disposable VMs without network, check that it starts and opens a window, and click through it. Otherwise this phase is skipped and run later. Its observations never block on their own.

    Technical details

    Test run of the entrypoint on a Crela review PC. Windows builds get a deep run on up to 6 Hyper-V Windows test VMs in parallel (each reset to a clean snapshot); a manual short test run uses one of them. If the test VMs are busy, the run waits for them; if they are not set up or out of disk space, Windows builds get no test run. Linux builds get the deep run in a Hyper-V VM reset to a clean snapshot. All without network and with the build mapped read-only, started like the Crela Launcher (license, working directory). Checks at 8 s and 60 s: started, still running, main window, error dialogs, crash exit code, license failure; afterwards new files and registry entries (Windows: AppData, ProgramData, HKCU, Run and Uninstall keys; Linux: the home folder including autostart entries, shell startup files and the user crontab). Only what belongs to the app counts: caches that Windows, graphics drivers or shared libraries write for every app are left out. Links it hands to the system (browser, store protocols such as ms-windows-store:) go to a recorder and are never opened; requested servers are recorded by a local proxy that refuses every connection; the window text comes from UI Automation (Windows) or AT-SPI (Linux). Once the app has started, it clicks through the app (menus, buttons, tabs, list items via UI Automation or AT-SPI) and builds an app tree of the screens it reaches, with the click path to every store link; it never clicks elements named like delete, buy, sign out or uninstall and stops at login screens. The deep run has a time limit: on the test VMs the machines share a queue of click paths and the run ends after at most 9 minutes, with no new paths handed out close to the end; otherwise one machine clicks through for at most 5 minutes. Large apps are therefore covered only in part. Window text, opened links, requested servers and the Procmon log of the app process tree (Windows only) are combined from all machines, and admins get an app map with screenshots of the screens it reached. Linux packages (.AppImage/.deb/.rpm/.sh) are also unpacked and their scripts inspected in a hardened container (--network=none, --cap-drop=ALL, read-only); a .deb or .rpm submitted as the program itself is still rejected as an installer (KO-12). The pipeline waits as long as the review PC is working on the run, at most 20 minutes; if the review PC is offline, the phase is skipped and the run is queued for later. Observations from the test VMs never block approval on their own; only a malicious script inside a Linux package does (KO-01). macOS builds are skipped (no VM backend).

  10. 10
    Pattern analysissource_patternCan block approval

    Every text file and script of the unpacked build is read in full for trackers, ads, payment prompts, hidden crypto-mining and leaked secrets. Blocks on a verified secret or a Tauri frontend we cannot unpack; other hits go to the AI review.

    Technical details

    Pattern scan against the KO criteria over every text file of the unpacked bundle and loose scripts, each file in full (large files in overlapping blocks, no size cap), including containers nested in containers (e.g. app.asar or a Tauri frontend inside an AppImage), plus TruffleHog. For verified secrets, blocks_approval=true. KO-08 only flags hidden crypto-mining code (mining pool address, xmrig, coinhive). Hits inside bundled framework runtimes (Chromium, Qt, ICU, CPython, .NET ...) are recorded as runtime hits and never block.

  11. 11
    AI reviewagentCan block approval

    An AI (Claude) reads your description and all findings so far and judges the K.O. rules KO-01 to KO-10, for example whether the description matches the program and whether a paid tool has the Crela SDK marker.

    Technical details

    A deterministic pre-decision runs first: clean non-binaries are approved and clear pattern hits are rejected without an LLM call; KO-10 (SDK marker in paid tools) and the KO-07 description mismatch below the similarity threshold are decided deterministically. Everything else goes to an LLM agent (Claude; the model is configurable, a larger one is used when there are blocking findings or app-own hits for KO-03/04/05) that evaluates all preceding phase results. Content taken from the build is fenced as data. The agent may tighten a verdict, never loosen it: every blocking finding from the scan phases forces a reject. KO-09 (undisclosed telemetry) never blocks and is reported as a note, because the launcher enforces the declared servers at runtime. KO-11 (self-updater) and KO-12 (installer format) are already detected in the scan phases - KO-12 hard-blocks (pre_scan, magic bytes).

  12. 12
    Final reportbuilding_report

    All results are combined into one report. Any blocking finding from an earlier phase turns the result into reject, even if the AI recommended approval.

    Technical details

    Aggregates the agent verdict with a blocking override: every blocking finding from the scan phases (medium severity or higher) forces reject, even on agent approve. The structured report is returned as review_report by the review endpoint.

What we never do

  • We never change your build: no patching, repacking or injecting. The SDK marker is something you build in yourself.
  • Your program only runs in disposable virtual machines, reset to a clean snapshot for every run, with no network and your build mounted read-only.
  • Links your program opens are written down and never opened. Every connection it attempts is refused and only recorded.
  • The dependency list we create from your build is readable only by you.

Limits

  • A passed review lowers the risk, but it is not a guarantee. Scanners recognize known malware and known patterns; something entirely new can slip through.
  • The test run needs an available review machine. Otherwise it is skipped and done later. macOS builds get no test run.
  • The test run clicks through the app within a time limit, so large apps are covered only in part. It is a test run, not a full behavioral analysis.

Result and next steps

approveNo blocking finding. A Crela reviewer confirms the result, then the release goes live.
rejectAt least one blocking finding. Fix what the report lists and upload a new build with update_software (or POST .../build). Each upload counts toward the daily update limit.

We only reject what is certain and what you can fix yourself. A vulnerability blocks only when a fixed version exists, observations from the test run never block on their own, and generic YARA hits go to the AI review instead of rejecting you. Every finding in the report names the file and a suggested fix, and a rejection always comes with the full reasons by email.

Read the report with Review Results or the MCP tool get_review_report. Uploads per day are listed under Rate Limits.

The full K.O. rule list and machine-readable quality criteria are available at GET /api/agent/requirements. Fetch it before every submission so the agent uses the latest thresholds.

Copy Protection

Paid tools check at startup that the buyer has a license. You build it in yourself with the Crela SDK; Crela never changes your build. Two parts work together:

  • License check: The Crela launcher hands your app a license token signed by Crela. The SDK verifies it offline against an Ed25519 public key and exits if it is missing or meant for another tool. No license key prompt, no network call.
  • Marker: A per-tool string (HMAC-SHA256 over your tool slug) that you build in together with the SDK. The review looks for it in paid builds (KO-10); without it a paid tool does not go live.

Limits: This makes passing the files to someone else useless, because the copy will not start without a license. Like every copy protection that runs on the buyer's machine, it cannot stop someone who takes your binary apart and patches the check out.

Fetch the marker

Via MCP: preview_marker for a planned slug before the first submission, get_sdk_marker for an existing tool. Via REST:

GET/api/agent/software/{id}/sdk-marker
{
  "tool_id": "tool_abc123",
  "slug": "my-app",
  "marker": "CRELA_SDKv2_abc123...",
  "notes": "Embed via CRELA_SDK_MARKER env var before build"
}

Embed in your build

For Node.js / Electron projects use the init CLI - it fetches the marker, injects the SDK call, and patches your bundler config automatically:

cd your-tool/
npx @crela/init

For CI/CD pipelines or other runtimes (Rust, .NET, C++) fetch and embed manually:

# Fetch marker and inject before build
export CRELA_SDK_MARKER="$(curl -s https://crela.io/api/agent/software/$TOOL_ID/sdk-marker \
  -H "Authorization: Bearer $CRELA_API_KEY" | jq -r '.marker')"

npm run build   # Your build reads CRELA_SDK_MARKER at compile time

For integration examples - Node.js/Electron and Rust/Tauri, plus how other languages embed the marker without an SDK - see the Creator Guidelines.