Skip to main content
This page documents the complete plugin.toml manifest schema. For conceptual information, see Plugin Configuration.

Full example

[plugin]
name = "my-plugin"
version = "0.1.0"
description = "My analysis plugin"
authors = ["Your Name"]
type = "guest"                        # or "host"
binary = "my-plugin.exe"              # optional, defaults to directory name

[runtime]
state = "ephemeral"                   # or "persistent", "scoped"
execution = "exclusive"               # or "sequential", "parallel", "unrestricted"
port = 50051                          # gRPC listen port (default: 50051)
log_filter = "info"                   # tracing filter (default: "info")
analysis_timeout = 300                # max analysis time in seconds (default: 300)

[runtime.paths]
sample_dir       = "C:\\malbox\\samples"
artifact_dir     = "C:\\malbox\\artifacts"
stash_dir        = "C:\\malbox\\stash"
log_dir          = "C:\\malbox\\logs"
external_log_dir = "C:\\malbox\\ext-logs"

[runtime.stash]
threshold_bytes = 1048576
ttl_secs = 120

[runtime.auto_collect.artifacts]
enabled  = true
include  = ["**/*"]
exclude  = []
max_file_size = 52428800

[runtime.auto_collect.external_logs]
enabled  = true
include  = ["**/*"]
exclude  = []
max_file_size = 52428800

[events]
subscribe = ["string-extractor", "network-analyzer"]

[events.filters.PluginResultAvailable]
from_plugins = ["string-extractor"]

[scope]
plugins = ["related-plugin"]
task_types = ["full-analysis"]

[results.my_result]
description = "What this result contains"
user_visible = true
display_name = "My Result"
render = "json"

[plugin]

Core plugin identity. This section is required.
FieldTypeRequiredDescription
namestringYesUnique plugin name. Must be alphanumeric, -, or _ only.
versionstringYesSemantic version (e.g. "0.1.0"). Must be valid semver.
descriptionstringNoHuman-readable description.
authorsstring[]NoList of author names.
typestringYesPlugin type: "host" or "guest".
binarystringNoExecutable filename. Defaults to the plugin directory name. Relevant for Python plugins ("main.py").

[runtime]

Controls how the plugin runtime behaves. For guest plugins, the build process bakes these values into the plugin binary. For host plugins, the daemon reads them at registry scan time.
FieldTypeRequiredDefaultDescription
statestringYes-Plugin state management mode ("ephemeral", "persistent", or "scoped").
executionstringYes-Execution context ("exclusive", "sequential", "parallel", or "unrestricted").
portu16No50051gRPC listen port. Must be >= 1024. Guest plugins only.
log_filterstringNo"info"Tracing directive string (same syntax as tracing_subscriber::EnvFilter). Examples: "info", "debug", "info,hyper=warn".
analysis_timeoutintegerNo300Maximum analysis time in seconds. Must be >= 1. The daemon wraps this with an additional grace period for result flushing.

Plugin types

TypeDescription
"guest"Executes inside a sandboxed VM. Communicates via gRPC. Terminated with the sandbox after task completion.
"host"Executes directly on the host system via iceoryx2 IPC. Can persist across multiple tasks.

Execution contexts

ValueDescription
"exclusive"Only one instance runs at a time across the entire daemon.
"sequential"Tasks are dispatched one at a time, in order.
"parallel"Multiple tasks may run concurrently.
"unrestricted"No constraints on concurrency or ordering.

State management

ValueDescription
"persistent"Stays running between tasks. Host plugins only.
"ephemeral"Spun up per task and torn down immediately after.
"scoped"Lives for the duration of an analysis scope (e.g. a batch). Requires a [scope] section.
"scoped" state is not yet implemented. Plugins configured with state = "scoped" will fail to start.

[runtime.paths]

All paths must be absolute. Guest plugins may use Windows-style absolute paths (e.g. C:\malbox\samples).
FieldTypeDefault (unix)Default (windows)Description
sample_dirstring/tmp/malbox/samplesC:\malbox\samplesWhere the daemon pushes the sample for analysis.
artifact_dirstring/tmp/malbox/artifactsC:\malbox\artifactsWhere the plugin writes output artifacts. Auto-collected after task execution.
stash_dirstring/tmp/malbox/stashC:\malbox\stashInternal result stash spillover directory.
log_dirstring/tmp/malbox/logsC:\malbox\logsSDK-internal log overflow files directory.
external_log_dirstring/tmp/malbox/ext-logsC:\malbox\ext-logsExternal log files from kernel drivers or other tools. Auto-collected after task execution.

[runtime.stash]

FieldTypeDefaultDescription
threshold_bytesinteger1048576 (1 MiB)Result payloads larger than this are spilled to disk via the result stash. Must be >= 4096.
ttl_secsinteger120How long stashed result entries are kept before TTL sweep reclaims them. Must be >= 1.

[runtime.auto_collect]

Controls automatic file collection from artifact_dir and external_log_dir after each task completes. The runtime streams files in these directories back to the daemon as results, so your plugin does not need to send them explicitly.
For artifacts, the runtime skips files you already sent explicitly (via ctx.results().push(PluginResult::file(...))) or marked with ctx.mark_collected() to avoid duplicates. External logs are always collected without deduplication.

[runtime.auto_collect.artifacts]

FieldTypeDefaultDescription
enabledbooltrueWhether to auto-collect files from artifact_dir.
includestring[]["**/*"]Glob patterns for files to include.
excludestring[][]Glob patterns for files to exclude.
max_file_sizeinteger52428800 (50 MiB)Files larger than this are skipped.

[runtime.auto_collect.external_logs]

FieldTypeDefaultDescription
enabledbooltrueWhether to auto-collect files from external_log_dir.
includestring[]["**/*"]Glob patterns for files to include.
excludestring[][]Glob patterns for files to exclude.
max_file_sizeinteger52428800 (50 MiB)Files larger than this are skipped.

[events]

Configures event subscriptions for host plugins. Guest plugins do not support event hooks.
FieldTypeRequiredDescription
subscribestring[]NoList of plugin names to subscribe to. Your plugin will receive events from these plugins’ event channels.

[events.filters.<EventName>]

Per-event-type filters. <EventName> is the event variant name (e.g. PluginResultAvailable).
FieldTypeRequiredDescription
from_pluginsstring[]NoOnly deliver this event type when it originates from one of these plugins.

[scope]

Required when state = "scoped". Defines the scope boundary for the plugin’s lifetime.
FieldTypeRequiredDescription
pluginsstring[]NoPlugins that share this scope.
task_typesstring[]NoTask types that share this scope.

[results.<name>]

Declares result entries that this plugin may produce. Each key under [results] is a result name that matches what you pass to PluginResult::json("name", ...), PluginResult::bytes("name", ...), or PluginResult::file("name", ...).
FieldTypeRequiredDescription
descriptionstringNoWhat this result contains.
user_visibleboolNoWhether this result should be shown in the frontend UI.
display_namestringNoHuman-readable name for display in the UI.
renderstringNoRendering hint for the frontend (e.g. "json").

Validation

The daemon validates the manifest when scanning plugin directories. It marks plugins with invalid manifests as Invalid in the registry and does not start them. The daemon enforces the following constraints:
ConstraintRule
Plugin nameMust be non-empty. Only alphanumeric characters, -, and _ allowed.
VersionMust be valid semver.
PortMust be >= 1024.
All pathsMust be absolute (unix-style or Windows-style for guest plugins).
threshold_bytesMust be >= 4096.
ttl_secsMust be >= 1.
analysis_timeoutMust be >= 1.
log_filterMust be a valid tracing_subscriber::EnvFilter directive.
Scoped stateRequires a [scope] section.
Changing any runtime setting requires rebuilding the plugin (for guest plugins) or restarting the daemon (for host plugins).