Skip to main content

Component Manifest Schema

Every SDK component declares itself to the platform through a JSON manifest packaged with the component. The platform reads the manifest at load time, registers the component, and renders its setup form and operational dashboard directly from the manifest. No frontend code is written, shipped, or installed for a new component.

This page documents the JSON contract: the top-level structure, the JSON Schema body that defines the configuration form, and the full set of x- extension keys the platform interprets.

Manifest format is evolving

The Component Manifest contract is still maturing as the plugin surface area grows. Field names, accepted values, and x- extension keys may change between releases, sometimes in ways that require plugin authors to update their manifests. To stay ahead of breakage: pin the SDK version your plugins build against, watch each release's migration note for manifest changes, and treat any net-new field documented here as potentially unavailable on older platform versions.


Schema-Driven Architecture

The platform is split across three responsibilities, all of which agree on the manifest as the contract.

ResponsibilityWhat it owns
Plugin componentAuthors the manifest. Declares the component's identity, its configuration JSON Schema, and any operational dashboard layout.
OrchestratorValidates the manifest at install time (a plugin upload containing a component manifest that cannot be parsed is rejected, naming the failing component), serves it to the Portal on request, and uses it to extract operational metadata (such as which fields hold network ports).
PortalReads the manifest and renders the setup wizard, the configuration form, and the operational dashboard. The Portal knows nothing about the component beyond what the manifest declares.

Because the contract is the manifest itself, a developer adding a new component writes only Java (the runtime) and JSON (the manifest). There is no frontend code to build, ship, or version separately.

Visual rendering is owned by the Portal

The schema is declarative. The exact visual layout, spacing, typography, and rendering of these components are managed by the Portal and are subject to change in future platform updates. Do not attempt to hack the schema for pixel-perfect layouts. Components that rely on undocumented Portal rendering behavior will break across upgrades. Treat the extension keys below as semantic intent (for example, "this is the primary section header"), not as direct visual instructions.


Top-level manifest

FieldTypeRequiredDescription
idstringYesUnique identifier for the component inside its owning plugin (for example, tag-count-processor). This is the runtime dispatch key. The platform resolves a route step to its component by calling the owning plugin's createComponent(id, ...), so this value must match the type id the plugin registers in its SimpleComponentRegistry. A mismatch fails the route with No plugin found that handles component type: <id>.
pluginIdstringNoInformational only. The owning plugin's identity is taken from the plugin package at index time, not from this field, so it may be omitted.
functionalTypestringNoA classifying label the Orchestrator uses to group and filter component definitions in the catalog. It is not the runtime dispatch key: dispatch is on id. Defaults to a placeholder when omitted; conventionally set equal to id.
displayNamestringYesHuman-readable label shown in the Portal's component list.
descriptionstringNoShort human-readable summary of the component. Shipped by nearly every component and shown alongside the display name.
categoryenumYesOne of the values listed below. Decides where the component appears in the Pipeline Designer.
compatibilityobjectNoDeclares which protocols the component works with (protocols, an array) and its data-flow direction (direction, default BOTH). Used by the Orchestrator to group and filter the catalog.
configurationobjectYesJSON Schema (Draft 07) that defines the setup form for this component. See Configuration schema.
uiobjectNoOperational dashboard configuration. See Dashboard configuration.

category values

ValueUsed when the component is
CONNECTORA source or target that owns an external session.
TRANSFORMERA pipeline stage that mutates the message in flight.
PROCESSORA pipeline stage that produces a side effect (such as dispatch).
CONDITIONA predicate that gates whether a route runs for a given message.
ERROR_HANDLERA terminal handler for the route's error chain.
ERROR_PROCESSORA processor that participates in the error chain (for example, retry plus DLQ escalation).

Configuration schema

The configuration block is a JSON Schema Draft 07 document. The platform reads it at load time and renders form fields, validation, tooltips, and defaults directly from the schema.

Schema wrapper

KeyExpected value
$schemahttp://json-schema.org/draft-07/schema#
typeobject
titleA short human-readable title for the form section.
propertiesStandard JSON Schema property definitions.
x-orderArray of property keys in the order the form should render them. Optional; keys not listed are appended after the ordered ones.

Standard Draft 07 validators (minimum, maximum, pattern, enum, minLength, maxLength, required, default) apply unchanged. The platform enforces them before the configuration is saved. Only type: object and properties are load-bearing: the platform validates against Draft 07 regardless of the $schema value, so $schema and title are recommended but not enforced.

{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"title": "Tag Count Settings",
"x-order": ["headerName"],
"properties": {
"headerName": { "type": "string", "title": "Output Header Name" }
}
}

Supported schema shapes

The setup form renders the following property shapes. Anything outside this list renders as a visible "not editable here" notice in the form, so operators and manifest authors see the gap instead of a silent blank.

ShapeRenders as
string, number, integer, booleanThe matching input control (see x-widget for overrides).
enumRadio group (fewer than four options) or dropdown.
object with propertiesA nested form section.
object with additionalProperties of a primitive typeA key/value map editor with add and remove controls.
array of objectsA managed list with a full-screen item editor.
array of primitivesA managed list with inline inputs per row.
oneOf / anyOf without a typeThe form renders the first branch it can render; the other branches remain accepted by server-side validation. Prefer a single concrete shape in new manifests.

$ref is not resolved, and composition keywords (allOf, if/then) are validated server-side only: the form does not change what it shows based on them.


Extension reference

The platform interprets the following x- keys in addition to standard Draft 07. Every extension is optional.

Layout extensions

ExtensionApplies toWhat it does
x-orderObject schemaOrdered list of property keys. Sets the render order; keys not listed are appended after the ordered ones (they are not hidden). Recommended, not required.
x-section-titlePropertyMarks a property as the first field under a new section. Properties below it (until the next section title) are grouped under the same heading.
x-advancedPropertyMoves the field into a collapsed Advanced area, keeping it out of the primary form.
x-col-spanPropertyHow many columns the field spans in the form's two-column grid. Accepts 1 (the default, half width) or 2 (full width); full is an accepted synonym for 2.
{
"type": "object",
"x-order": ["host", "port", "tlsEnabled", "ciphers"],
"properties": {
"host": { "type": "string", "title": "Host", "x-col-span": 2 },
"port": { "type": "integer", "title": "Port" },
"tlsEnabled": { "type": "boolean", "title": "TLS Enabled", "x-section-title": "Security" },
"ciphers": { "type": "string", "title": "Cipher Suite", "x-advanced": true }
}
}

UX extensions

ExtensionApplies toWhat it does
x-placeholderPropertyPlaceholder text shown when the field is empty.
x-tooltipPropertyHelp text shown on hover. Used only when the property has no description; when both are set, the description is shown.
x-widgetPropertyOverrides the default control the platform infers from the property's type. See the widget table below.
x-ui-disabledPropertyDisables the input control for the field while still rendering its current value. Use for fields whose value is owned by an upstream system.
{
"type": "object",
"properties": {
"mappingTemplate": {
"type": "string",
"title": "Mapping Template",
"x-widget": "textarea",
"x-placeholder": "One source-to-target field mapping per line",
"x-tooltip": "Applied to every outbound message on this route."
}
}
}

x-widget values

The x-widget key accepts the following values. Use one only when the platform's default control for the field's type does not fit the data.

ValueRenders asWhen to use
textSingle-line text input.Default for string. Set explicitly only to override another widget further up the schema.
textareaMulti-line text input.Free-text fields that may contain more than a short line (descriptions, inline templates, pasted payloads).
passwordMasked text input.Rarely. It masks the input box and nothing else: the value is stored, exported, and displayed like any other. It is not a security control, and a credential field holds an ${env:VAR_NAME} reference rather than a secret, which is easier to check when it is visible.
selectDropdown of static options.Default for a string with enum and four or more options.
radioRadio-button group.Default for a string with enum and fewer than four options.
checkboxSingle checkbox.A boolean rendered inline with its label.
switchOn / off toggle.A boolean that reads more clearly as a switch than a checkbox.
dynamic-selectDropdown populated at form-render time.Fields whose valid options come from a platform resource computed at load time. Pair with x-resource, x-label-key, and x-value-key.

Dynamic-data extensions

These keys are used together with "x-widget": "dynamic-select" to populate a dropdown from a platform-provided resource list at form render time.

ExtensionApplies toWhat it does
x-resourcePropertyNames the platform resource to fetch (for example, the catalog of uploaded artifacts).
x-filterPropertyOptional filter object passed to the resource so the dropdown shows a subset.
x-label-keyPropertyThe field on each resource entry to use as the visible label. Defaults to name.
x-value-keyPropertyThe field on each resource entry to use as the persisted value. Defaults to id.
x-item-labelArray itemTemplate used to render each item's summary line in array editors.
x-component-propsPropertyFree-form bag of widget-specific options. Only used by widgets that explicitly document a key inside it.
{
"type": "object",
"properties": {
"dictionaryArtifactId": {
"type": "string",
"title": "Data Dictionary",
"x-widget": "dynamic-select",
"x-resource": "artifacts",
"x-filter": { "type": "fix-data-dictionary" },
"x-label-key": "name",
"x-value-key": "id"
},
"sessions": {
"type": "array",
"items": {
"type": "object",
"x-item-label": "{SenderCompID} → {TargetCompID}",
"properties": {
"SenderCompID": { "type": "string", "title": "Sender CompID" },
"TargetCompID": { "type": "string", "title": "Target CompID" }
}
}
}
}
}

Operational metadata extensions

These keys are read by the Orchestrator (not the form renderer) to drive cross-cutting platform behavior.

ExtensionApplies toWhat it does
x-is-portPropertyMarks a field whose value is a network port that the platform must reserve, expose, and surface in deployment manifests. The platform reads every x-is-port: true field at deploy time and turns the values into Kubernetes Service ports.
{
"type": "object",
"properties": {
"SocketAcceptPort": {
"type": "integer",
"title": "Listen Port",
"minimum": 1,
"maximum": 65535,
"x-is-port": true
}
}
}

Dashboard configuration

The optional ui block defines the operational dashboard for the component. It is organized into pages and widgets. Omit it when the component has no custom dashboard.

Widget categoryRenders
Data CardsSingle-value displays or lists of status values pulled from a component-provided API.
Action WidgetsButtons that trigger an operation on the component (for example, Reset Statistics, Flush Cache).
Custom ComponentsLinks to pre-built UI components for richer views such as message logs or charts.

Authoring guidance

  1. Operator-friendly names. Use labels operators recognize (Heartbeat Interval) instead of internal field keys (hb_int_ms). The schema's title and description are what appears in the form.
  2. Sensible defaults. Provide default values on every non-required field. A form that arrives pre-filled is a form operators can reason about.
  3. Validate in the schema. Use Draft 07 validators (minimum, maximum, pattern, enum) so the platform rejects invalid input before it leaves the form. Deferring validation to runtime forces operators to discover errors after deployment.
  4. Group with sections and the advanced area. Put the two or three fields operators touch most often first. Move everything else under x-advanced or below a later x-section-title. Do not present ten fields at the same level of emphasis.
  5. Mark every port. Any field whose value is a network port must carry "x-is-port": true. Skipping this leaves the platform unable to surface the port in deployment manifests.
  6. Treat extensions as semantic, not visual. The platform owns the rendering. Express intent (x-section-title, x-advanced, x-is-port) and let the renderer evolve.