Skip to content

Packaging & Deployment ​

A plugin package is a ZIP archive containing manifest.json, the entry-point artifact, and its runtime dependencies. Upload it through the Packaging API.

Package structure ​

text
my-plugin.zip
├── manifest.json
├── PluginExamples.dll or plugin.wasm
├── dependencies and required assets
├── README.md                 (optional)
└── samples/*.toml            (optional)

Place the manifest and entry-point artifact at the archive root. Include all non-system .NET dependencies needed by the plugin. A README and configuration samples are optional package documentation.

Manifest examples ​

Use type to select Indexing or Job. The manifest requires a non-empty capabilities array for both types. Replace the sample package ULID with your package's identity and keep it stable for updates.

json
{
  "id": "01J00000000000000000000000",
  "vendor": "Example Company",
  "version": "1.0.0",
  "description": "Example indexing plugin",
  "type": "Indexing",
  "runtime": "Dotnet",
  "entryPointAssembly": "PluginExamples.dll",
  "entryPoint": "BlueCurve.Examples.PlainTextIndexer",
  "capabilities": [
    ".txt",
    "text/plain"
  ]
}
json
{
  "id": "01J00000000000000000000000",
  "vendor": "Example Company",
  "version": "1.0.0",
  "description": "Example job plugin",
  "type": "Job",
  "runtime": "Dotnet",
  "entryPointAssembly": "PluginExamples.dll",
  "entryPoint": "BlueCurve.Examples.ExampleJob",
  "capabilities": [
    "example"
  ]
}
json
{
  "id": "01J00000000000000000000000",
  "vendor": "Example Company",
  "version": "1.0.0",
  "description": "Example indexing plugin",
  "type": "Indexing",
  "runtime": "Wasm",
  "entryPointAssembly": "plugin.wasm",
  "entryPoint": "index_file",
  "capabilities": [
    ".txt",
    "text/plain"
  ]
}
json
{
  "id": "01J00000000000000000000000",
  "vendor": "Example Company",
  "version": "1.0.0",
  "description": "Example job plugin",
  "type": "Job",
  "runtime": "Wasm",
  "entryPointAssembly": "plugin.wasm",
  "entryPoint": "start_job",
  "capabilities": [
    "example"
  ]
}

Download a manifest: .NET indexer, .NET job, WASM indexer, WASM job.

FieldTypeRequirement
idULID stringRequired package identity.
vendorstringRequired vendor name.
versionstringRequired semantic version.
descriptionstringRequired description.
typestringRequired: Indexing or Job.
runtimestringRequired: Dotnet or Wasm.
entryPointAssemblystringRequired artifact filename: DLL or WASM module.
entryPointstringRequired fully qualified .NET class name or exported WASM function name.
capabilitiesstring arrayRequired, at least one item. Indexers declare supported extensions or MIME types.

Validation rules ​

.NET assemblies must use an accepted architecture (Any CPU or Amd64). The current inspection minimum is .NET 9; the examples in this portal target .NET 10. Use the SDK and target framework supported by your deployment.

The current archive inspector allows up to 500 MB uncompressed and 1,000 entries. The upload byte limit is a separate deployment setting; see the Packaging API. Inspection rejects unsafe archive paths and excessive compression ratios.

WASM modules must export memory, alloc, dealloc, and their configured entry point. Only env and wasi_snapshot_preview1 imports are accepted. Compile Kotlin plugins as production executables and use a matching host/SDK ABI. See WASM Development for role-specific build commands.

Inspection Report & Error Codes ​

When a package is uploaded, the system generates an InspectionReport. This is a bitmask of flags representing any issues found during validation. If everything is valid, the report will be None (0).

Common Error Flags ​

FlagCategoryDescription
ManifestNotFoundManifestThe manifest.json file is missing from the root of the zip.
InvalidManifestManifestThe manifest JSON is malformed or missing required fields (id, vendor, etc.).
EntryPointNotFoundLogicThe specified class or function entry point could not be found in the assembly.
EntryPointAssemblyNotFoundLogicThe file specified in entryPointAssembly is missing from the package.
WasmMissingExportsWASMThe WASM module is missing required exports like memory, alloc, or dealloc.
WasmUnauthorizedImportsWASMThe module attempts to import functions from unauthorized host namespaces.
WasmInvalidModuleWASMThe WASM binary is malformed or could not be parsed.
MaxUncompressedSizeLimitsThe package exceeds the 500 MB uncompressed limit.
MaxFilesLimitsThe package exceeds the 1,000 file entries limit.
SecurityViolationSecurityDetected unsafe paths (e.g., ../) or other security risks.
CannotProcessPackageSystemAn internal error occurred during package inspection.

TIP

Since the report is a bitmask, multiple flags can be present simultaneously. For example, a value of 17 indicates both ManifestNotFound (1) and EntryPointAssemblyNotFound (16).

Deployment flow ​

  1. Build the plugin and package the matching manifest and artifacts.
  2. Upload the ZIP through REST or gRPC.
  3. Check the transport result and inspection/deployment result; an HTTP 200 alone does not establish successful inspection.
  4. Poll a returned task identifier to completion before using the package.
  5. Create a job with the package ID, or ingest a file handled by the installed indexer.

Next: Sandboxing & Security