Tanit XBlox
Use this skill when composing .xblox block-tree command flows.
Invocation Rules
- Run flows with
tanit-cli.exe xblox run --src flow.xblox. tanit.exe xblox run --src flow.xbloxaccepts the same command, but prefertanit-cli.exewhen an agent needs stdout/stderr output.- Inspect machine-readable block metadata with
tanit-cli.exe xblox info --json. - XBlox command blocks that call custom commands must use exact IDs, for example
custom.mic-start, notmic-start.
Document Shape
{ "version": 1, "context": {}, "roots": [...] }
Calling Commands From XBlox
Use a command block with an exact custom command ID:
{ "kind": "command", "command": { "id": "custom.mic-start" } }
Inline CLI command payloads are also supported:
{ "kind": "command", "command": { "cliCommand": "audio", "args": ["record", "status"] } }
Blocks
AI
llmAgent - LLM Agent
Run an LLM agent turn in-process (tool loop included) and store the answer in PREVIOUS.
Params:
input
prompt(prompt, required, from PREVIOUS, resolve: variables+deep) - Instruction / question for the agent. Uses PREVIOUS when unset.system(string, default"", resolve: variables+deep) - Optional extra system-prompt text appended to the agent's system prompt.include(args_list, default[], resolve: variables+deep) - Files or folders to expose as selected context for the agent, like CLI --include. One path per row; supports ${variables}.embed(args_list, default[], resolve: variables+deep) - Text files to inline into the prompt before the agent turn, like CLI --embed. One file per row; supports ${variables}.cwd(dir_path, default"", resolve: variables) - Working folder the agent treats as context. Empty = the run's cwd.
options
preset(string, default"") - Chat provider preset name. Empty = the default preset from App Settings.tools(boolean, defaulttrue) - Allow the agent to call tools (filesystem, run, MCP, ...). Off = plain completion.
advanced
model(string, default"", resolve: variables+deep) - Model override. Empty = from App Settings.router(string, default"") - Provider router override. Empty = from App Settings.type(enum, default"completion", enum: completion|responses|realtime) - LLM API type. completion = POST /chat/completions; responses = OpenAI Responses API; realtime = experimental WebSocket (text-only).mcp(boolean, defaulttrue) - Allow MCP-backed tools this turn. Off forces MCP off regardless of the chat preset.skills(boolean, defaulttrue) - Allow agent skill discovery/injection. Off forces skills off regardless of the chat preset.planner(boolean, defaulttrue) - Allow the planner pre-pass. Off forces the planner off regardless of the chat preset.maxSteps(integer, 0-100, default0) - Tool-loop iteration cap. 0 = use the resolved default.timeoutMs(duration_ms, 0-3.6e+06, default0) - Per-LLM-call timeout in ms. 0 = use the resolved default.streamLog(boolean, defaultfalse) - Mirror streaming assistant text deltas to the trace log.json(boolean, defaultfalse) - Also emit the full agent transcript as atranscriptoutput (token-heavy).
output
usage(json_value) - Aggregated token usage / cost for the turn.transcript(json_value) - Full turn transcript (messages + summary). Populated whenjsonis on.storeAs(string, default"answer") - Variable to also store the result in (always sets PREVIOUS).
Features: background cancellable
Default block:
{
"embed": [],
"include": [],
"kind": "llmAgent",
"prompt": "",
"storeAs": "answer",
"tools": true
}
App
appActivate - App Activate
Bring a target window to the foreground.
Params:
input
title(string, default"") - Window-title substring.process(string, default"") - Process-name substring.pid(integer) - Exact process id.hwnd(integer) - Exact window handle.foreground(boolean, defaultfalse) - Target the current foreground window.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"kind": "appActivate",
"title": "Notepad"
}
appBatch - App Batch
Run a sequence of app_batch actions in one block.
Params:
input
steps(json_value, required) - Array of {action, ...} steps.
options
defaultDelayMs(integer, 0-60000, default50) - Delay between steps.continueOnError(boolean, defaultfalse) - Keep running steps after a failure.
advanced
defaultWaitTimeoutMs(integer, 0-600000, default5000) - Default wait timeout.defaultWaitIntervalMs(integer, 1-60000, default100) - Default wait poll interval.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"defaultDelayMs": 50,
"kind": "appBatch",
"steps": [
{
"action": "activate",
"title": "Notepad"
},
{
"action": "type",
"text": "Hello"
}
]
}
appClick - App Click
Click at (x,y) or (xw,yw) on a target window.
Params:
input
title(string, default"") - Window-title substring.process(string, default"") - Process-name substring.x(integer) - Absolute screen X.y(integer) - Absolute screen Y.xw(integer) - Window-relative X (preferred).yw(integer) - Window-relative Y.
options
button(string, default"left") - left | right | middle.count(integer, 1-10, default1) - Click count (2 = double).
advanced
virtual(boolean, defaultfalse) - PostMessage click; for background apps.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"button": "left",
"count": 1,
"kind": "appClick",
"title": "Notepad",
"xw": 100,
"yw": 100
}
appClose - App Close
Send WM_CLOSE (or TerminateProcess with force=true).
Params:
input
title(string, default"") - Window-title substring.process(string, default"") - Process-name substring.pid(integer) - Exact process id.hwnd(integer) - Exact window handle.foreground(boolean, defaultfalse) - Target the current foreground window.
options
force(boolean, defaultfalse) - TerminateProcess instead of WM_CLOSE.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"force": false,
"kind": "appClose",
"title": "Notepad"
}
appDrag - App Drag
Drag linear / polyline / arc with smooth pacing.
Params:
input
title(string, default"") - Window-title substring.process(string, default"") - Process-name substring.x(integer) - Start X (screen).y(integer) - Start Y (screen).xw(integer) - Start X (window-relative).yw(integer) - Start Y (window-relative).toX(integer) - End X (screen).toY(integer) - End Y (screen).toXw(integer) - End X (window-relative).toYw(integer) - End Y (window-relative).dx(integer) - Relative end X delta.dy(integer) - Relative end Y delta.path(json_value) - Polyline: [{x,y}|{xw,yw}, ...].arc(json_value) - {cx,cy,radius,startDeg,endDeg,segments}.
options
button(string, default"left") - left | right | middle.durationMs(integer, 0-30000, default250) - Drag duration.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"durationMs": 250,
"kind": "appDrag",
"title": "Notepad",
"toXw": 300,
"toYw": 200,
"xw": 100,
"yw": 100
}
appHotkey - App Hotkey
Send a key combination (e.g. ctrl+shift+t).
Params:
input
keys(string, required, default"ctrl+s") - Combo, e.g. ctrl+shift+t.title(string, default"") - Window-title substring.process(string, default"") - Process-name substring.foreground(boolean, defaultfalse) - Send to the foreground window.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"keys": "ctrl+s",
"kind": "appHotkey",
"title": "Notepad"
}
appInspectDump - App Inspect Dump
Dump UI Automation tree of matching windows.
Params:
input
title(string, default"") - Window-title substring.process(string, default"") - Process-name substring.foreground(boolean, defaultfalse) - Dump the foreground window.
options
format(enum, default"md", enum: md|json) - Output format.limit(integer, 1-5000, default160) - Max windows/elements.controls(string, default"buttons,menus,editable") - Control-type filter (md).textMaxChars(integer, 0-100000, default1200) - Truncate element text (md).
advanced
probeCells(boolean, defaultfalse) - Probe grid cells.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"format": "md",
"kind": "appInspectDump",
"title": "Notepad"
}
appInspectFind - App Inspect Find
Filter UIA elements by name/value/automationId/className.
Params:
input
title(string, default"") - Window-title substring.process(string, default"") - Process-name substring.foreground(boolean, defaultfalse) - Search the foreground window.name(string, default"") - Element name substring.value(string, default"") - Element value substring.automationId(string, default"") - AutomationId substring.className(string, default"") - ClassName substring.
options
nth(integer, default-1) - Select the nth match (-1 = all).
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"kind": "appInspectFind",
"name": "File",
"title": "Notepad"
}
appKey - App Key
Press one key with optional modifiers and hold duration.
Params:
input
key(string, required, default"a") - Single key to press.modifiers(json_value) - Modifier list: ctrl/shift/alt/win.title(string, default"") - Window-title substring.process(string, default"") - Process-name substring.foreground(boolean, defaultfalse) - Send to the foreground window.
options
holdMs(integer, 0-60000, default0) - Note-sustain for piano-style apps.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"holdMs": 100,
"key": "a",
"kind": "appKey"
}
appMouseMove - App Mouse Move
Smoothly move the cursor (auto-paced) or teleport.
Params:
input
title(string, default"") - Window-title substring.process(string, default"") - Process-name substring.x(integer) - Absolute screen X.y(integer) - Absolute screen Y.xw(integer) - Window-relative X.yw(integer) - Window-relative Y.
options
smooth(boolean, defaulttrue) - Smooth (auto-paced) move.durationMs(integer, default-1) - -1 = auto from distance, 0 = teleport.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"kind": "appMouseMove",
"smooth": true,
"title": "Notepad",
"xw": 200,
"yw": 200
}
appOpen - App Open
Launch an executable and (optionally) wait for its window.
Params:
input
exe(string, required, default"notepad.exe") - Executable to launch.args(string, default"") - Command-line arguments.cwd(string, default"") - Working directory.
options
x(integer) - Initial window X.y(integer) - Initial window Y.width(integer) - Initial window width.height(integer) - Initial window height.
advanced
waitMs(integer, 0-120000, default3000) - Wait this long for the main window.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"exe": "notepad.exe",
"kind": "appOpen",
"waitMs": 3000
}
appScreenshot - App Screenshot
Capture a window / element / explicit rect to a JPEG file.
Params:
input
outputPath(output_path, required, default"out/shot.jpg", constraints: writable+createParents) - JPEG output path.title(string, default"") - Window-title substring.process(string, default"") - Process-name substring.foreground(boolean, defaultfalse) - Capture the foreground window.
options
rect(string, default"") - Optional 'x,y,w,h' screen rect.elementIndex(integer) - Capture a specific UIA element rect.quality(integer, 1-100, default85) - JPEG quality.activate(boolean, defaulttrue) - Activate the window before capture.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"kind": "appScreenshot",
"outputPath": "out/shot.jpg",
"quality": 85,
"title": "Notepad"
}
appScroll - App Scroll
Wheel scroll (vertical or horizontal) at an optional point.
Params:
input
title(string, default"") - Window-title substring.process(string, default"") - Process-name substring.clicks(integer, required, default-3) - Wheel clicks; positive = up/right.x(integer) - Pre-target cursor X (optional).y(integer) - Pre-target cursor Y (optional).xw(integer) - Pre-target cursor X (window-relative).yw(integer) - Pre-target cursor Y (window-relative).
options
axis(string, default"vertical") - vertical | horizontal.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"clicks": -3,
"kind": "appScroll",
"title": "Notepad"
}
appType - App Type
Type a string into the activated window.
Params:
input
text(string, required, default"Hello") - Text to type.title(string, default"") - Window-title substring.process(string, default"") - Process-name substring.foreground(boolean, defaultfalse) - Type into the foreground window.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"kind": "appType",
"text": "Hello",
"title": "Notepad"
}
Audio
audioListDevices - List Microphones
List available microphone/input devices and store their names, channel counts, and default status.
Params:
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Features: non-blocking
Default block:
{
"kind": "audioListDevices",
"storeAs": "audioDevices"
}
audioModelControl - Unload Model
List or unload loaded local model instances for this xBlox process.
Params:
lifecycle
action(enum, default"List", enum: List|Unload) - List loaded models in this xBlox process, or unload one by key.key(string, default"vibevoice:tts") - Loaded model key to unload, e.g. llama:vlm, llama:text, vibevoice:tts, or an onnx:* key. Empty aliases use their group default.
output
storeAs(string, default"modelKey") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"action": "Unload",
"key": "vibevoice:tts",
"kind": "audioModelControl",
"storeAs": "modelKey"
}
audioPlay - Play Audio
Play an audio file (MP3, WAV, or FLAC). Uses PREVIOUS as the file path when path is empty.
Params:
input
path(audio_path, from PREVIOUS, default"") - Audio file to play. Leave empty to use PREVIOUS as the path.
device
outputDevice(device_name, default"") - Playback device. Empty = app setting, then system default.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"kind": "audioPlay",
"outputDevice": "",
"path": "",
"storeAs": ""
}
audioRecord - Record Audio
Record microphone audio to a WAV file. Stores the output path in PREVIOUS / storeAs.
Params:
input
durationMs(duration_ms, required, 100-3.6e+06, default3000) - Recording duration in milliseconds.
device
device(device_name, default"") - Microphone/input device. Empty = app setting, then system default.
output_file
outputPath(output_path, default"", constraints: writable+createParents) - Output WAV file path. Empty = create a temporary WAV file.
output
storeAs(string, default"audioPath") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"device": "",
"durationMs": 3000,
"kind": "audioRecord",
"outputPath": "",
"storeAs": "audioPath"
}
audioRecordStart - Start Recording
Start a microphone recording session and store its session id.
Params:
input
session(string, default"") - Optional session id. Empty = generate a unique id.
device
device(device_name, default"") - Microphone/input device. Empty = app setting, then system default.
output
storeAs(string, default"recordSession") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable non-blocking
Default block:
{
"device": "",
"kind": "audioRecordStart",
"session": "",
"storeAs": "recordSession"
}
audioRecordStop - Stop Recording
Stop a microphone recording session and write it to a WAV file.
Params:
input
session(string, required, default"") - Recording session id from audioRecordStart.
output_file
outputPath(output_path, default"", constraints: writable+createParents) - Output WAV file path. Empty = create a temporary WAV file.
output
storeAs(string, default"audioPath") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"kind": "audioRecordStop",
"outputPath": "",
"session": "",
"storeAs": "audioPath"
}
audioSpeak - Text to Speech
Convert text to speech via the configured TTS provider and play it through the speakers. Supports Pixlwiz, ElevenLabs, and local VibeVoice builds. Uses PREVIOUS string as text when text is empty. Stores output file path in PREVIOUS / storeAs when outputPath is set, otherwise stores the input text.
Params:
input
text(prompt, from PREVIOUS, default"") - Text to speak. Leave empty to use PREVIOUS (if it is a string).
voice_model
provider(string, default"") - Text-to-speech provider override. Empty = app settings.model(string, default"", resolve: variables+deep) - Model ID or GGUF path. For VibeVoice: path to vibevoice-realtime-.gguf or vibevoice-1.5B-.gguf.voice(string, default"") - Voice ID / UUID / GGUF path. For vibevoice 0.5B: path to voice-*.gguf. Leave empty when using refAudio.
vibevoice
tokenizer(string, default"") - Tokenizer GGUF path. Required when provider=vibevoice.refAudio(string, default"") - Reference WAV for voice cloning (vibevoice 1.5B only). ~5 s 24 kHz mono WAV of the target speaker. Leave empty when using a pre-baked voice gguf (0.5B).instance(string, default"") - Named cached instance: reuse the loaded vibevoice engine across loop passes. Empty = auto-key by model/tokenizer/voice args.
device
outputDevice(device_name, default"") - Playback device. Empty = app setting, then system default.
output_file
outputPath(output_path, default"", constraints: writable+createParents) - Optional path to save synthesized audio (.wav). Empty = play only.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"instance": "",
"kind": "audioSpeak",
"model": "",
"outputDevice": "",
"outputPath": "",
"provider": "",
"refAudio": "",
"storeAs": "",
"text": "",
"tokenizer": "",
"voice": ""
}
audioTranscribe - Speech to Text
Transcribe an audio file, or record from the microphone and transcribe speech to text. When 'input' is set, the file is transcribed directly (no microphone, no duration limit). When empty, records from the microphone for up to maxDurationMs ms with optional VAD silence-gate. Prefers local Whisper when selected/available, with Pixlwiz as a provider-backed fallback. Stores the transcript string in PREVIOUS / storeAs, or a structured STT payload when json is on.
Params:
input
input(audio_path, from PREVIOUS, default"") - Input audio file path (wav, mp3, ...). If set, transcribes this file instead of recording from the microphone.
recording
maxDurationMs(duration_ms, 500-120000, default30000) - Maximum microphone recording duration in milliseconds. Ignored when 'input' is set.silenceMs(duration_ms, 0-60000, default1500) - Stop recording after this many ms of silence following speech. 0 = disabled. Ignored when 'input' is set.
device
device(device_name, default"") - Microphone/input device. Empty = app setting, then system default. Ignored when 'input' is set.
speech_model
provider(string, default"") - Speech-to-text provider override. Empty = app settings.model(string, default"", resolve: variables+deep) - Speech-to-text model override. Empty = provider default or app settings.providerOptions(json_value, default{}) - Provider/model-specific STT options. Currently used for local whisper.cpp.
advanced
apiKey(string, default"") - API key override. Empty = from App Settings.
output
json(boolean, defaultfalse) - Store a structured STT payload in PREVIOUS / storeAs instead of only the transcript string.result(json_value) - Structured STT result when json is on: provider, model, transcript, duration, samples, and optional wav.storeAs(string, default"transcript") - Variable to also store the result in (always sets PREVIOUS).
debug_output
outputPath(output_path, default"", constraints: writable+createParents) - Optional path to save the captured WAV. Empty = temp (deleted after transcription).
Features: cancellable
Default block:
{
"device": "",
"input": "",
"json": false,
"kind": "audioTranscribe",
"maxDurationMs": 30000,
"model": "",
"outputPath": "",
"provider": "",
"providerOptions": {},
"silenceMs": 1500,
"storeAs": "transcript"
}
Bluetooth
bluetoothConnect - Bluetooth Connect
Connect a Bluetooth audio device (pairs if needed) and implicitly route audio to it. Uses PREVIOUS as the device id/name when 'id' is empty. Stores {ok,target,routed_to} in PREVIOUS / storeAs.
Params:
input
id(string, from PREVIOUS, default"") - Device address (AA:BB:CC:DD:EE:FF) or name substring. Empty = use PREVIOUS.
advanced
autoRoute(boolean, defaulttrue) - After connecting, set the device's audio endpoint as the default playback device.timeoutMs(duration_ms, 0-60000, default6000) - How long to wait (ms) for the audio endpoint to go ACTIVE.delayMs(duration_ms, 0-30000, default0) - Extra delay (ms) after connecting before the block returns. Use for AV receivers that need time to switch inputs or unmute (0 = none).
output
storeAs(string, default"bluetooth") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"autoRoute": true,
"delayMs": 0,
"id": "",
"kind": "bluetoothConnect",
"storeAs": "bluetooth",
"timeoutMs": 6000
}
bluetoothDisconnect - Bluetooth Disconnect
Disconnect a Bluetooth audio device (best-effort). Uses PREVIOUS when 'id' is empty.
Params:
input
id(string, from PREVIOUS, default"") - Device address or name substring. Empty = use PREVIOUS.
output
storeAs(string, default"bluetooth") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"id": "",
"kind": "bluetoothDisconnect",
"storeAs": "bluetooth"
}
bluetoothEndpoints - Audio Endpoints
List MMDevice audio endpoints (playback by default). Stores an array of {id,name,default,is_bluetooth,state,active,...} in PREVIOUS / storeAs. Set includeDisconnected to also list Bluetooth devices that are paired but not yet connected.
Params:
advanced
capture(boolean, defaultfalse) - List recording (capture) endpoints instead of playback.includeDisconnected(boolean, defaultfalse) - Also include UNPLUGGED endpoints (paired Bluetooth devices not yet connected).
output
storeAs(string, default"audioEndpoints") - Variable to also store the result in (always sets PREVIOUS).
Features: iterable pure non-blocking
Children:
- items (For each, role: body)
Default block:
{
"capture": false,
"includeDisconnected": false,
"kind": "bluetoothEndpoints",
"storeAs": "audioEndpoints"
}
bluetoothListDevices - Bluetooth Devices
List paired / connected Bluetooth devices. Stores an array of {id,name,address,paired,connected,is_audio_device,...} in PREVIOUS / storeAs. Set autoRoute to implicitly switch the default playback endpoint to a connected audio device.
Params:
advanced
nearby(boolean, defaultfalse) - Also issue an inquiry for nearby discoverable devices (slow).autoRoute(boolean, defaultfalse) - Implicitly route audio output to a connected Bluetooth audio device.
output
storeAs(string, default"bluetoothDevices") - Variable to also store the result in (always sets PREVIOUS).
Features: iterable non-blocking
Children:
- items (For each, role: body)
Default block:
{
"autoRoute": false,
"kind": "bluetoothListDevices",
"nearby": false,
"storeAs": "bluetoothDevices"
}
bluetoothPair - Bluetooth Pair
Pair a Bluetooth device (just-works / SSP). Uses PREVIOUS when 'id' is empty.
Params:
input
id(string, from PREVIOUS, default"") - Device address or name substring. Empty = use PREVIOUS.
output
storeAs(string, default"bluetooth") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"id": "",
"kind": "bluetoothPair",
"storeAs": "bluetooth"
}
bluetoothSetDefault - Set Default Endpoint
Set an MMDevice audio endpoint as the default device for all roles. Pass the endpoint id from bluetoothEndpoints (or PREVIOUS).
Params:
input
id(string, from PREVIOUS, default"") - MMDevice endpoint id (e.g. "{0.0.0.00000000}.{guid}"). Empty = use PREVIOUS.
output
storeAs(string, default"bluetooth") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"id": "",
"kind": "bluetoothSetDefault",
"storeAs": "bluetooth"
}
bluetoothUnpair - Bluetooth Unpair
Remove (unpair) a Bluetooth device. Uses PREVIOUS when 'id' is empty.
Params:
input
id(string, from PREVIOUS, default"") - Device address or name substring. Empty = use PREVIOUS.
output
storeAs(string, default"bluetooth") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"id": "",
"kind": "bluetoothUnpair",
"storeAs": "bluetooth"
}
Context
getVariable - Get Variable
Read a value from root scope.
Params:
name(variable_ref, required) - Variable name to read.target(string, default"PREVIOUS") - Variable to copy the value into. PREVIOUS updates the pipeline value only.
Features: pure
Default block:
{
"kind": "getVariable",
"name": "",
"target": "PREVIOUS"
}
log - Log
Log a message, expression, variable, or the whole scope.
Params:
input
level(enum, default"info", enum: trace|debug|info|warn|error) - Log level.message(string, from PREVIOUS, default"PREVIOUS") - Message or variable expression. Leave empty to log the whole scope.
query
input(string, default"PREVIOUS") - Optional context variable to query with jq. When set with filter/query, it replaces message output.filter(string, default".") - jq filter applied to input, e.g. .items[0].name.format(enum, default"auto", enum: auto|json) - auto prints scalars naturally and objects/arrays as JSON; json always emits compact JSON.
Features: pure
Default block:
{
"kind": "log",
"level": "info",
"message": "PREVIOUS"
}
saveState - Save State
Persist current scope values back into this XBlox document's context.
Params:
scope(enum, default"context", enum: context) - State area to persist. Currently only document context.mode(enum, default"existing", enum: existing|all) - existing = update keys already present in the file context. all = write the full current scope.keys(args_list, default[]) - Optional context keys to persist. Empty uses mode.
Features: cancellable
Default block:
{
"keys": [],
"kind": "saveState",
"mode": "existing",
"scope": "context"
}
setVariable - Set Variable
Write a value into root scope.
Params:
name(string, required) - Variable name to write.value(json_value) - Literal value (JSON). Leave empty to use expression.expression(expression) - Expression evaluated to the stored value. Overrides value when set.
Features: pure
Default block:
{
"kind": "setVariable",
"name": "value",
"value": null
}
stdin - Stdin
Read piped input from stdin (whole stream or one line) into PREVIOUS/storeAs.
Params:
input
mode(enum, default"all", enum: all|line) - all = read the entire stream to EOF; line = read the next line (streamable inside loops).parse(enum, default"text", enum: text|json|number|boolean|auto) - Result type for PREVIOUS/storeAs: text (string), json (object/array/scalar), number (int/float � usable in expressions), boolean, or auto (JSON-scalar detection with text fallback). Binary input (NUL bytes) is rejected.trim(boolean, defaulttrue) - Trim trailing whitespace/newlines before parsing.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"kind": "stdin",
"mode": "all",
"parse": "text",
"trim": true
}
stdout - Stdout
Write a message directly to stdout (pipe-friendly).
Params:
input
message(string, from PREVIOUS, default"PREVIOUS", resolve: variables+deep) - Message or variable expression. Leave empty to output the whole scope.newline(boolean, defaulttrue) - Append a newline.
query
input(string, default"PREVIOUS") - Optional context variable to query with jq. When set with filter/query, it replaces message output.filter(string, default".") - jq filter applied to input, e.g. .items[0].name.format(enum, default"auto", enum: auto|json) - auto prints scalars naturally and objects/arrays as JSON; json always emits compact JSON.
Features: pure
Default block:
{
"kind": "stdout",
"message": "PREVIOUS",
"newline": true
}
Data
Parse - Parse JSON
Parse PREVIOUS or named input with a jq filter expression.
Params:
options
parser(enum, default"jq", enum: jq|jsonpath) - Parser engine.
input
filter(string, required, default".") - jq filter expression (e.g. .items[] | select(.active)).input(string, default"PREVIOUS") - Input to parse. Leave as PREVIOUS to use the previous block's result.
output
storeAs(string, default"parsed") - Variable to also store the result in (always sets PREVIOUS).
Features: pure
Children:
- items (Then, role: body)
Default block:
{
"filter": ".",
"kind": "Parse",
"parser": "jq",
"storeAs": "parsed"
}
iterator - Iterator
Iterate over PREVIOUS or any named scope/context variable. Arrays fan out directly, objects become {key,value} entries, scalars run once.
Params:
options
parser(enum, default"jq", enum: jq|jsonpath) - Parser engine.
input
filter(string, required, default".") - jq filter expression to select the value to iterate.input(string, default"PREVIOUS") - Scope/context variable to iterate. Leave as PREVIOUS to use the previous block's result.
iteration
mode(enum, default"auto", enum: auto|array|objectEntries|objectValues|once) - How to normalize the selected value before fan-out.
output
storeAs(string, default"items") - Variable to also store the result in (always sets PREVIOUS).
Features: iterable pure
Children:
- items (For each, role: body)
Default block:
{
"filter": ".",
"input": "PREVIOUS",
"items": [],
"kind": "iterator",
"mode": "auto",
"parser": "jq",
"storeAs": "items"
}
Files
fsDelete - Delete Path
Delete a file or directory. Returns true if something was deleted.
Params:
input
path(file_path, required, from PREVIOUS, resolve: custom) - File or folder to delete. Leave empty to use PREVIOUS.
delete_options
recursive(boolean, defaultfalse) - Delete a directory and all of its contents.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"kind": "fsDelete",
"path": "",
"recursive": false,
"storeAs": ""
}
fsExists - Path Exists
Check whether a path exists. Stores a boolean in PREVIOUS / storeAs.
Params:
input
path(file_path, required, from PREVIOUS, resolve: custom) - File or folder to check. Leave empty to use PREVIOUS.
output
storeAs(string, default"exists") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"kind": "fsExists",
"path": "",
"storeAs": "exists"
}
fsHash - Hash File
Compute a file content hash. Stores the hex digest in PREVIOUS / storeAs.
Params:
input
path(file_path, required, from PREVIOUS, constraints: mustExist+readable, resolve: custom) - File to hash. Leave empty to use PREVIOUS as the path.
hash_options
algorithm(enum, default"sha256", enum: sha256) - Hash algorithm.prefixLength(integer, 0-64, default0) - Return only the first N hex characters. 0 returns the full digest.
output
storeAs(string, default"hash") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"algorithm": "sha256",
"kind": "fsHash",
"path": "",
"prefixLength": 0,
"storeAs": "hash"
}
fsList - List Files
List a directory or glob. Stores an array of {name, path, type, size} in PREVIOUS / storeAs.
Params:
input
path(dir_path, required, from PREVIOUS, resolve: variables+globs+custom) - Directory to list, or a glob pattern such as ${ENV}/*.png. Leave empty to use PREVIOUS.
list_options
only(enum, default"all", enum: all|dir|file) - Show all entries, only folders, or only files.
output
storeAs(string, default"entries") - Variable to also store the result in (always sets PREVIOUS).
Features: iterable
Children:
- items (For each, role: body)
Default block:
{
"kind": "fsList",
"only": "all",
"path": "",
"storeAs": "entries"
}
fsMkdir - Create Folder
Create a directory (and all parents). Stores the created path in PREVIOUS / storeAs.
Params:
input
path(dir_path, required, resolve: custom) - Folder path to create.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"kind": "fsMkdir",
"path": "",
"storeAs": ""
}
fsRead - Read File
Read a text or JSON file. Stores file content in PREVIOUS / storeAs.
Params:
input
path(file_path, required, from PREVIOUS, constraints: mustExist+readable, resolve: custom) - File to read. Leave empty to use PREVIOUS as the path.
read_options
encoding(enum, default"text", enum: text|json) - Read as plain text, or parse the file as JSON.
output
storeAs(string, default"fileContent") - Variable to also store the result in (always sets PREVIOUS).
Children:
- items (Then, role: body)
Default block:
{
"encoding": "text",
"kind": "fsRead",
"path": "",
"storeAs": "fileContent"
}
fsWrite - Write File
Write text from the content field or PREVIOUS to a file. Creates parent folders automatically.
Params:
input
path(output_path, required, constraints: writable+createParents, resolve: custom) - File to write.content(string, from PREVIOUS, default"") - Content to write. Leave empty to use PREVIOUS.
write_options
append(boolean, defaultfalse) - Append to the existing file instead of overwriting it.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Children:
- items (Then, role: body)
Default block:
{
"append": false,
"content": "",
"kind": "fsWrite",
"path": "",
"storeAs": ""
}
Flow
break - Break
Break out of the current loop.
Features: pure
Default block:
{
"kind": "break"
}
case - Case
One switch branch: runs when the switch value matches its expression.
Params:
comparator(string, default"===") - Comparison operator (===, !=, <, >, ...).expression(expression) - Value the switch variable is compared against.
Features: container
Children:
- consequent (Body, role: consequent)
Default block:
{
"comparator": "===",
"consequent": [],
"expression": "\"value\"",
"kind": "case"
}
else - Else
Runs when the preceding if/elseIf chain has not matched.
Features: container
Children:
- items (Body, role: body)
Default block:
{
"items": [],
"kind": "else"
}
elseIf - Else If
Runs when the preceding if/elseIf chain has not matched and its own condition is true.
Params:
condition(expression, required, default"true") - Condition expression.
Features: container
Children:
- items (Body, role: body)
Default block:
{
"condition": "true",
"items": [],
"kind": "elseIf"
}
exit - Exit
Stop the run immediately and set the process exit code.
Params:
code(integer, 0-255, default0) - Process exit code (0-255). Standard meanings: 0 = success, 1 = general error, 2 = misuse/invalid input, 126 = not executable, 127 = not found, 130 = interrupted (Ctrl+C). Any other value is allowed for app-specific signalling to pipelines.message(string, default"") - Optional message recorded on the exit event.
Features: pure
Default block:
{
"code": 0,
"kind": "exit"
}
for - For
Run child blocks over a numeric range.
Params:
initial(expression, required, default"0") - Loop counter initial value.comparator(enum, required, default"<", enum: <|<=|>|>=|!=|==)final(expression, required, default"3") - Loop bound expression.modifier(expression, required, default"+1") - Counter increment expression, e.g. +1 or *2.
Features: container cancellable
Children:
- items (Body, role: body)
Default block:
{
"comparator": "<",
"final": "3",
"initial": "0",
"items": [],
"kind": "for",
"modifier": "+1"
}
group - Group
Transparent container: runs its child blocks in the current scope.
Features: container
Children:
- items (Body, role: body)
Default block:
{
"items": [],
"kind": "group"
}
if - If
Run child blocks when the condition is true. Chain elseIf/else siblings after it.
Params:
condition(expression, required, default"true") - Condition expression.
Features: container
Children:
- consequent (Then, role: consequent)
Default block:
{
"condition": "true",
"consequent": [],
"kind": "if"
}
onStart - On Start
Run child blocks once when the document starts or ends.
Params:
event(enum, default"On Start", enum: On Start|On End) - Document lifecycle moment that runs this block's children once.
Features: container
Children:
- items (Body, role: body)
Default block:
{
"event": "On Start",
"items": [],
"kind": "onStart"
}
switch - Switch
Run the first matching case.
Params:
variable(variable_ref, required, default"mode") - Variable to switch on.
Features: container
Children:
- items (Cases, role: case) - accepts:
case,switchDefault
Default block:
{
"items": [],
"kind": "switch",
"variable": "mode"
}
switchDefault - Default
Fallback switch branch: runs when no case matches.
Features: container
Children:
- consequent (Body, role: consequent)
Default block:
{
"consequent": [],
"kind": "switchDefault"
}
wait - Wait
Sleep for a fixed number of milliseconds.
Params:
ms(duration_ms, required, 0-3.6e+06, default500) - Duration to sleep in milliseconds.
Default block:
{
"kind": "wait",
"ms": 500
}
while - While
Run child blocks while a condition is true.
Params:
input
condition(expression, required, default"false") - Loop condition expression.
advanced
loopLimit(integer, 1-1e+06, default10) - Maximum iterations (safety cap).
Features: container cancellable
Children:
- items (Body, role: body)
Default block:
{
"condition": "false",
"items": [],
"kind": "while",
"loopLimit": 10
}
Image
imageCreate - Create Image
Generate an image from a prompt using the same core create_image API as the CLI create command.
Params:
input
prompt(prompt, required) - Prompt for image generation/editing.
output_file
outputPath(output_path, default"", constraints: writable+createParents) - Output path. Empty = core default naming.
model
provider(string, default"") - Image generation provider. Empty = App Settings image provider.model(string, default"", resolve: variables+deep) - Image generation model. Empty = App Settings image model.replicateCollection(string, default"official") - Replicate collection for browsing models. Only relevant when provider = replicate.providerOptions(json_value, default{}) - Replicate model-specific input fields (seed, num_inference_steps, ...). Resolved per model via OpenAPI cache.
auth
apiKey(string, default"") - API key override. Empty = from App Settings.baseUrl(string, default"") - Provider base URL override. Empty = provider default/App Settings.
request
aspectRatio(enum, default"", enum: |1:1|16:9|9:16|4:3|3:4|21:9) - Aspect ratio shortcut - not all providers use this; for Replicate use providerOptions instead.imageSize(enum, default"", enum: |512|1K|2K|4K) - Size shortcut - not all providers use this; for Replicate use providerOptions instead.references(args_list, default[]) - Reference image paths (one per row). Each supports the file picker.
pre_resize
resizeFirst(boolean, defaultfalse) - Pre-resize input/reference raster before sending to the provider.resizeWidth(integer, 0-8192, default0) - Longest edge for pre-resize when resizeFirst is on. 0 = provider/default.preresizeRawOnly(boolean, defaultfalse) - When pre-resizing, only force RAW/HEIC rasters through the explicit long-edge resize.
output
storeAs(string, default"imagePath") - Variable to also store the result in (always sets PREVIOUS).
Features: background cancellable
Default block:
{
"apiKey": "",
"aspectRatio": "",
"baseUrl": "",
"imageSize": "",
"kind": "imageCreate",
"model": "",
"outputPath": "",
"preresizeRawOnly": false,
"prompt": "",
"provider": "",
"references": [],
"replicateCollection": "official",
"resizeFirst": false,
"resizeWidth": 0,
"storeAs": "imagePath"
}
imageModelControl - Unload Model
List or unload loaded local model instances for this xBlox process.
Params:
lifecycle
action(enum, default"List", enum: List|Unload) - List loaded models in this xBlox process, or unload one by key.key(string, default"llama:vlm") - Loaded model key to unload, e.g. llama:vlm, llama:text, vibevoice:tts, or an onnx:* key. Empty aliases use their group default.
output
storeAs(string, default"modelKey") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"action": "Unload",
"key": "llama:vlm",
"kind": "imageModelControl",
"storeAs": "modelKey"
}
imageResize - Resize Image
Resize/transform one or more image files using the same libvips pipeline as the resize CLI command.
Params:
input
input(image_path, required, from PREVIOUS, resolve: variables+globs) - Input image path or glob. Uses PREVIOUS when unset.
output_file
outputPath(output_path, default"", constraints: writable+createParents) - Output file, directory, or dst template. Empty = core default output path(s).suffix(string, default"") - Suffix for implicit output names, e.g. _small.
dimensions
maxWidth(integer, 0-100000, default0) - Target/max width. 0 = unconstrained.maxHeight(integer, 0-100000, default0) - Target/max height. 0 = unconstrained.allowEnlargement(boolean, defaultfalse) - Allow upscaling.
format
format(enum, default"", enum: |jpg|jpeg|png|webp|avif|tif|tiff|heic) - Output format. Empty = infer from output path/input.fit(enum, default"inside", enum: inside|cover|contain|fill|outside) - Resize fit mode, matching Sharp/libvips semantics.position(string, default"centre") - For cover: centre, attention, entropy, low, high, etc.kernel(enum, default"lanczos3", enum: nearest|cubic|mitchell|lanczos2|lanczos3) - Resize kernel.background(string, default"#ffffff") - Letterbox color for contain, e.g. #ffffff.
codec
quality(integer, 1-100, default85) - JPEG/WebP/AVIF quality.pngCompression(integer, 0-9, default6) - PNG DEFLATE compression level.stripMetadata(boolean, defaulttrue) - Strip metadata on output where supported.
transform
rotate(integer, 0-270, default0) - Rotate 0, 90, 180, or 270 degrees after autorotate.flip(boolean, defaultfalse) - Vertical flip.flop(boolean, defaultfalse) - Horizontal flop.autorotate(boolean, defaulttrue) - Apply EXIF orientation.
cache
cache(boolean, defaulttrue) - Enable resize output cache.cacheDir(dir_path, default"") - Cache directory. Empty = core default.
network
urlTimeoutSec(integer, 0-3600, default5) - HTTP(S) input timeout in seconds.urlMaxRedirects(integer, 0-100, default20) - Max HTTP redirects.
output
storeAs(string, default"imagePath") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"allowEnlargement": false,
"autorotate": true,
"background": "#ffffff",
"cache": true,
"cacheDir": "",
"fit": "inside",
"flip": false,
"flop": false,
"format": "",
"input": "",
"kernel": "lanczos3",
"kind": "imageResize",
"maxHeight": 0,
"maxWidth": 0,
"outputPath": "",
"pngCompression": 6,
"position": "centre",
"quality": 85,
"rotate": 0,
"storeAs": "imagePath",
"stripMetadata": true,
"suffix": "",
"urlMaxRedirects": 20,
"urlTimeoutSec": 5
}
imageTransform - Transform Image
Edit one or more images with an AI prompt using the same core transform_image API as the CLI transform command.
Params:
input
input(image_path, from PREVIOUS, default"", resolve: variables+globs) - Input image path or glob. Uses PREVIOUS when unset.prompt(prompt, required) - Prompt for image generation/editing.
output_file
outputPath(output_path, default"", constraints: writable+createParents) - Output path. Empty = core default naming.
model
provider(string, default"") - Image generation provider. Empty = App Settings image provider.model(string, default"", resolve: variables+deep) - Image generation model. Empty = App Settings image model.replicateCollection(string, default"official") - Replicate collection for browsing models. Only relevant when provider = replicate.providerOptions(json_value, default{}) - Replicate model-specific input fields (seed, num_inference_steps, ...). Resolved per model via OpenAPI cache.
auth
apiKey(string, default"") - API key override. Empty = from App Settings.baseUrl(string, default"") - Provider base URL override. Empty = provider default/App Settings.
request
aspectRatio(enum, default"", enum: |1:1|16:9|9:16|4:3|3:4|21:9) - Aspect ratio shortcut - not all providers use this; for Replicate use providerOptions instead.imageSize(enum, default"", enum: |512|1K|2K|4K) - Size shortcut - not all providers use this; for Replicate use providerOptions instead.references(args_list, default[]) - Reference image paths (one per row). Each supports the file picker.
pre_resize
resizeFirst(boolean, defaultfalse) - Pre-resize input/reference raster before sending to the provider.resizeWidth(integer, 0-8192, default0) - Longest edge for pre-resize when resizeFirst is on. 0 = provider/default.preresizeRawOnly(boolean, defaultfalse) - When pre-resizing, only force RAW/HEIC rasters through the explicit long-edge resize.
output
storeAs(string, default"imagePath") - Variable to also store the result in (always sets PREVIOUS).
Features: background cancellable
Default block:
{
"apiKey": "",
"aspectRatio": "",
"baseUrl": "",
"imageSize": "",
"input": "",
"kind": "imageTransform",
"model": "",
"outputPath": "",
"preresizeRawOnly": false,
"prompt": "",
"provider": "",
"references": [],
"replicateCollection": "official",
"resizeFirst": false,
"resizeWidth": 0,
"storeAs": "imagePath"
}
Input
keyEvent - Key Event
Sample a keyboard shortcut once and emit down/pressed/released/toggle state. Designed for document loops: run it each pass, then branch with if blocks.
Params:
input
keys(shortcut, default"F9") - Keyboard shortcut to sample, e.g. F9 or Ctrl+Shift+R. Ignored when anyKey is on.
options
anyKey(boolean, defaultfalse) - Match any key press instead of the configured shortcut.toggle(boolean, defaulttrue) - Flip the emitted toggle state on each press edge.
output
storeAs(string, default"key") - Variable to also store the result in (always sets PREVIOUS).
Features: pure
Default block:
{
"anyKey": false,
"keys": "F9",
"kind": "keyEvent",
"storeAs": "key",
"toggle": true
}
keyWait - Key Wait
Wait for a keyboard shortcut then run child blocks. on=pressed fires on key-down edge; on=released fires on key-up edge; on=held fires while the key is held; on=toggle starts children on the first press and cancels them on the second. repeat=true keeps listening across multiple events. Stores the fired key string in PREVIOUS / storeAs when the wait cycle completes.
Params:
input
keys(shortcut, default"F9") - Keyboard shortcut to listen for, e.g. F9 or Ctrl+Shift+R. Ignored when anyKey is on.on(enum, default"pressed", enum: pressed|held|released|toggle) - When to fire: pressed (leading edge), held (while down), released (trailing edge), or toggle (first press starts child blocks, second press cancels them).
options
repeat(boolean, defaultfalse) - Keep listening and fire on every matching event. Not applicable to toggle (which always re-arms after each cycle).anyKey(boolean, defaultfalse) - Match any key press instead of the configured shortcut. Stores the key name in PREVIOUS / storeAs.timeoutMs(duration_ms, default0) - Stop listening after this many milliseconds. 0 = wait forever.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Features: container cancellable
Children:
- items (Then, role: body)
Default block:
{
"anyKey": false,
"keys": "F9",
"kind": "keyWait",
"on": "pressed",
"repeat": false,
"storeAs": "",
"timeoutMs": 0
}
MQTT
mqttClient - MQTT Client
Connect to an MQTT broker and Publish, Subscribe, or RoundTrip a test message. For received messages, runs child items with PREVIOUS={topic,payload,host,port}.
Params:
mode
action(enum, default"RoundTrip", enum: Publish|Subscribe|RoundTrip) - Publish sends one message. Subscribe waits for one message. RoundTrip subscribes then publishes and waits for its echo.
input
host(string, default"127.0.0.1") - Broker host.port(integer, 1-65535, default1883) - Broker port.topic(string, default"xblox/smoke") - MQTT topic.payload(prompt, default"hello from xblox") - Payload to publish.
advanced
clientId(string, default"xblox-mqtt") - MQTT client id.qos(integer, 0-2, default0) - MQTT QoS level.
timeouts
timeoutMs(duration_ms, 1-60000, default5000) - Client operation timeout.
output
storeAs(string, default"mqtt") - Variable to also store the result in (always sets PREVIOUS).
Features: container cancellable
Children:
- items (On Message, role: body)
Default block:
{
"action": "RoundTrip",
"host": "127.0.0.1",
"items": [],
"kind": "mqttClient",
"payload": "hello from xblox",
"port": 1883,
"qos": 0,
"storeAs": "mqtt",
"timeoutMs": 5000,
"topic": "xblox/smoke"
}
mqttServer - MQTT Server
Start, stop, or inspect a named in-process MQTT broker instance.
Params:
server_lifecycle
action(enum, default"Start", enum: Start|Stop|Status) - Start a named MQTT broker, Stop it, or report Status.instance(string, default"default") - Named broker instance. Use the same name for Stop/Status.
network
bind(string, default"127.0.0.1") - Network interface to listen on.port(integer, 1-65535, default1883) - MQTT TCP port.
output
storeAs(string, default"mqttServer") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"action": "Start",
"bind": "127.0.0.1",
"instance": "default",
"kind": "mqttServer",
"port": 1883,
"storeAs": "mqttServer"
}
Modbus
modbusConnection - Modbus Connection
Start, stop, or inspect a named cached Modbus client connection for fast repeated reads/writes.
Params:
connection
action(enum, default"Start", enum: Start|Stop|Status) - Start/open a named connection, Stop/release it, or report Status.connection(string, default"default") - Named connection/pool key reused by read/write blocks.instance(string, default"") - Alias for connection.
input
url(string, default"tcp:127.0.0.1:15020") - Endpoint to connect to.
advanced
slave(integer, 0-255) - Unit/slave id.unitId(integer, 0-255) - Alias for slave.timeoutMs(duration_ms, 0-3.6e+06, default30000)reload(boolean, defaultfalse) - Force reconnect even if the named connection is already open.
output
storeAs(string, default"modbusConnection") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"action": "Start",
"connection": "default",
"kind": "modbusConnection",
"storeAs": "modbusConnection",
"url": "tcp:127.0.0.1:15020"
}
modbusRead - Modbus Read
Read coils, discrete inputs, holding registers, or input registers. ModbusPoll-style aliases: area/functionCode, address, count/regCount.
Params:
input
url(string, required, default"tcp:127.0.0.1:15020") - Endpoint to read from.area(enum, default"holdingRegisters", enum: holdingRegisters|inputRegisters|coils|discreteInputs) - Modbus table/function: holdingRegisters=FC03, inputRegisters=FC04, coils=FC01, discreteInputs=FC02.address(integer, 0-65535, default0) - Starting address. Zero-based by default; 40001/30001/10001 style addresses are also accepted.count(integer, 1-2000, default1) - Number of coils/registers to read.regCount(integer, 1-2000, default1) - Alias for count, matching ModbusPoll wording.
connection
connection(string, default"") - Optional named connection to reuse/open for fast repeated reads.instance(string, default"") - Alias for connection.reload(boolean, defaultfalse) - Force reconnect the named connection before this operation.
advanced
addressBase(string, default"zero") - zero (default), one, or modbus. one subtracts 1 from address.slave(integer, 0-255) - Unit/slave id.timeoutMs(duration_ms, 0-3.6e+06, default30000)waitTimeMs(duration_ms, 0-60000, default20) - Cancellable delay after a successful read before the next block. 0 = no delay.
output
storeAs(string, default"values") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"address": 0,
"area": "holdingRegisters",
"count": 3,
"kind": "modbusRead",
"storeAs": "values",
"url": "tcp:127.0.0.1:15020"
}
modbusReadCoils - Modbus Read Coils
Read coils (FC01).
Params:
input
url(string, required, default"tcp:127.0.0.1:15020") - Endpoint to read from.area(enum, default"holdingRegisters", enum: holdingRegisters|inputRegisters|coils|discreteInputs) - Modbus table/function: holdingRegisters=FC03, inputRegisters=FC04, coils=FC01, discreteInputs=FC02.address(integer, 0-65535, default0) - Starting address. Zero-based by default; 40001/30001/10001 style addresses are also accepted.count(integer, 1-2000, default1) - Number of coils/registers to read.regCount(integer, 1-2000, default1) - Alias for count, matching ModbusPoll wording.
connection
connection(string, default"") - Optional named connection to reuse/open for fast repeated reads.instance(string, default"") - Alias for connection.reload(boolean, defaultfalse) - Force reconnect the named connection before this operation.
advanced
addressBase(string, default"zero") - zero (default), one, or modbus. one subtracts 1 from address.slave(integer, 0-255) - Unit/slave id.timeoutMs(duration_ms, 0-3.6e+06, default30000)waitTimeMs(duration_ms, 0-60000, default20) - Cancellable delay after a successful read before the next block. 0 = no delay.
output
storeAs(string, default"values") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"address": 0,
"area": "coils",
"count": 8,
"kind": "modbusReadCoils",
"storeAs": "values",
"url": "tcp:127.0.0.1:15020"
}
modbusReadDiscreteInputs - Modbus Read Discrete Inputs
Read discrete inputs (FC02).
Params:
input
url(string, required, default"tcp:127.0.0.1:15020") - Endpoint to read from.area(enum, default"holdingRegisters", enum: holdingRegisters|inputRegisters|coils|discreteInputs) - Modbus table/function: holdingRegisters=FC03, inputRegisters=FC04, coils=FC01, discreteInputs=FC02.address(integer, 0-65535, default0) - Starting address. Zero-based by default; 40001/30001/10001 style addresses are also accepted.count(integer, 1-2000, default1) - Number of coils/registers to read.regCount(integer, 1-2000, default1) - Alias for count, matching ModbusPoll wording.
connection
connection(string, default"") - Optional named connection to reuse/open for fast repeated reads.instance(string, default"") - Alias for connection.reload(boolean, defaultfalse) - Force reconnect the named connection before this operation.
advanced
addressBase(string, default"zero") - zero (default), one, or modbus. one subtracts 1 from address.slave(integer, 0-255) - Unit/slave id.timeoutMs(duration_ms, 0-3.6e+06, default30000)waitTimeMs(duration_ms, 0-60000, default20) - Cancellable delay after a successful read before the next block. 0 = no delay.
output
storeAs(string, default"values") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"address": 0,
"area": "discreteInputs",
"count": 8,
"kind": "modbusReadDiscreteInputs",
"storeAs": "values",
"url": "tcp:127.0.0.1:15020"
}
modbusReadHoldingRegisters - Modbus Read Holding Registers
Read holding registers from a Modbus TCP/RTU endpoint.
Params:
input
url(string, required, default"tcp:127.0.0.1:15020") - Endpoint to read from.area(enum, default"holdingRegisters", enum: holdingRegisters|inputRegisters|coils|discreteInputs) - Modbus table/function: holdingRegisters=FC03, inputRegisters=FC04, coils=FC01, discreteInputs=FC02.address(integer, 0-65535, default0) - Starting address. Zero-based by default; 40001/30001/10001 style addresses are also accepted.count(integer, 1-2000, default1) - Number of coils/registers to read.regCount(integer, 1-2000, default1) - Alias for count, matching ModbusPoll wording.
connection
connection(string, default"") - Optional named connection to reuse/open for fast repeated reads.instance(string, default"") - Alias for connection.reload(boolean, defaultfalse) - Force reconnect the named connection before this operation.
advanced
addressBase(string, default"zero") - zero (default), one, or modbus. one subtracts 1 from address.slave(integer, 0-255) - Unit/slave id.timeoutMs(duration_ms, 0-3.6e+06, default30000)waitTimeMs(duration_ms, 0-60000, default20) - Cancellable delay after a successful read before the next block. 0 = no delay.
output
storeAs(string, default"values") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"address": 0,
"count": 3,
"kind": "modbusReadHoldingRegisters",
"storeAs": "values",
"url": "tcp:127.0.0.1:15020"
}
modbusReadInputRegisters - Modbus Read Input Registers
Read input registers (FC04).
Params:
input
url(string, required, default"tcp:127.0.0.1:15020") - Endpoint to read from.area(enum, default"holdingRegisters", enum: holdingRegisters|inputRegisters|coils|discreteInputs) - Modbus table/function: holdingRegisters=FC03, inputRegisters=FC04, coils=FC01, discreteInputs=FC02.address(integer, 0-65535, default0) - Starting address. Zero-based by default; 40001/30001/10001 style addresses are also accepted.count(integer, 1-2000, default1) - Number of coils/registers to read.regCount(integer, 1-2000, default1) - Alias for count, matching ModbusPoll wording.
connection
connection(string, default"") - Optional named connection to reuse/open for fast repeated reads.instance(string, default"") - Alias for connection.reload(boolean, defaultfalse) - Force reconnect the named connection before this operation.
advanced
addressBase(string, default"zero") - zero (default), one, or modbus. one subtracts 1 from address.slave(integer, 0-255) - Unit/slave id.timeoutMs(duration_ms, 0-3.6e+06, default30000)waitTimeMs(duration_ms, 0-60000, default20) - Cancellable delay after a successful read before the next block. 0 = no delay.
output
storeAs(string, default"values") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"address": 0,
"area": "inputRegisters",
"count": 3,
"kind": "modbusReadInputRegisters",
"storeAs": "values",
"url": "tcp:127.0.0.1:15020"
}
modbusServer - Modbus Server
Run a Modbus TCP server until cancelled, durationMs expires, or maxRequests is reached.
Params:
input
url(string, default"tcp:127.0.0.1:15020") - Listen endpoint, e.g. tcp:127.0.0.1:15020.holdingRegisters(json_value) - Initial holding-register values (integer array).inputRegisters(json_value) - Initial input-register values (integer array).
advanced
registerCount(integer, 0-65535, default128) - Number of holding registers to expose.inputRegisterCount(integer, 0-65535, default128) - Number of input registers to expose.coilCount(integer, 0-65535, default128) - Number of coils to expose.coils(json_value) - Initial coil values (boolean/integer array).discreteInputCount(integer, 0-65535, default128) - Number of discrete inputs to expose.discreteInputs(json_value) - Initial discrete-input values (boolean/integer array).durationMs(duration_ms, 0-3.6e+06, default0) - Auto-stop after this many ms. 0 = run until cancelled.maxRequests(integer, 0-1e+06, default0) - Auto-stop after this many requests. 0 = unlimited.unitId(integer, 0-255, default1) - Modbus unit/slave id.pollTimeoutMs(integer, 1-60000, default100) - Server poll timeout in ms.debug(boolean, defaultfalse) - Verbose server logging.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"coils": [
1,
0,
1
],
"discreteInputs": [
0,
1,
0
],
"durationMs": 3000,
"holdingRegisters": [
11,
22,
33
],
"inputRegisters": [
44,
55,
66
],
"kind": "modbusServer",
"url": "tcp:127.0.0.1:15020"
}
modbusWrite - Modbus Write
Write one or many holding registers/coils. Chooses FC06/FC16 or FC05/FC15 based on area and value count.
Params:
input
url(string, required, default"tcp:127.0.0.1:15020") - Endpoint to write to.area(enum, default"holdingRegisters", enum: holdingRegisters|coils) - Writable table/function: holdingRegisters=FC06/FC16, coils=FC05/FC15.address(integer, 0-65535, default0) - Starting address. Zero-based by default; 40001/00001 style addresses are also accepted.value(json_value) - Single 16-bit register value or coil boolean/0/1.values(json_value) - Multiple values. Arrays and comma-separated strings are accepted.
connection
connection(string, default"") - Optional named connection to reuse/open for fast repeated writes.instance(string, default"") - Alias for connection.reload(boolean, defaultfalse) - Force reconnect the named connection before this operation.
advanced
addressBase(string, default"zero") - zero (default), one, or modbus. one subtracts 1 from address.slave(integer, 0-255) - Unit/slave id.timeoutMs(duration_ms, 0-3.6e+06, default30000)waitTimeMs(duration_ms, 0-60000, default20) - Cancellable delay after a successful write before the next block. 0 = no delay.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"address": 0,
"area": "holdingRegisters",
"kind": "modbusWrite",
"url": "tcp:127.0.0.1:15020",
"values": [
101,
202
]
}
modbusWriteCoil - Modbus Write Coil
Write a single coil (FC05).
Params:
input
url(string, required, default"tcp:127.0.0.1:15020") - Endpoint to write to.area(enum, default"holdingRegisters", enum: holdingRegisters|coils) - Writable table/function: holdingRegisters=FC06/FC16, coils=FC05/FC15.address(integer, 0-65535, default0) - Starting address. Zero-based by default; 40001/00001 style addresses are also accepted.value(json_value) - Single 16-bit register value or coil boolean/0/1.values(json_value) - Multiple values. Arrays and comma-separated strings are accepted.
connection
connection(string, default"") - Optional named connection to reuse/open for fast repeated writes.instance(string, default"") - Alias for connection.reload(boolean, defaultfalse) - Force reconnect the named connection before this operation.
advanced
addressBase(string, default"zero") - zero (default), one, or modbus. one subtracts 1 from address.slave(integer, 0-255) - Unit/slave id.timeoutMs(duration_ms, 0-3.6e+06, default30000)waitTimeMs(duration_ms, 0-60000, default20) - Cancellable delay after a successful write before the next block. 0 = no delay.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"address": 0,
"area": "coils",
"kind": "modbusWriteCoil",
"url": "tcp:127.0.0.1:15020",
"value": 1
}
modbusWriteCoils - Modbus Write Coils
Write multiple coils (FC15).
Params:
input
url(string, required, default"tcp:127.0.0.1:15020") - Endpoint to write to.area(enum, default"holdingRegisters", enum: holdingRegisters|coils) - Writable table/function: holdingRegisters=FC06/FC16, coils=FC05/FC15.address(integer, 0-65535, default0) - Starting address. Zero-based by default; 40001/00001 style addresses are also accepted.value(json_value) - Single 16-bit register value or coil boolean/0/1.values(json_value) - Multiple values. Arrays and comma-separated strings are accepted.
connection
connection(string, default"") - Optional named connection to reuse/open for fast repeated writes.instance(string, default"") - Alias for connection.reload(boolean, defaultfalse) - Force reconnect the named connection before this operation.
advanced
addressBase(string, default"zero") - zero (default), one, or modbus. one subtracts 1 from address.slave(integer, 0-255) - Unit/slave id.timeoutMs(duration_ms, 0-3.6e+06, default30000)waitTimeMs(duration_ms, 0-60000, default20) - Cancellable delay after a successful write before the next block. 0 = no delay.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"address": 0,
"area": "coils",
"kind": "modbusWriteCoils",
"url": "tcp:127.0.0.1:15020",
"values": [
1,
0,
1
]
}
modbusWriteRegister - Modbus Write Register
Write a single holding register.
Params:
input
url(string, required, default"tcp:127.0.0.1:15020") - Endpoint to write to.area(enum, default"holdingRegisters", enum: holdingRegisters|coils) - Writable table/function: holdingRegisters=FC06/FC16, coils=FC05/FC15.address(integer, 0-65535, default0) - Starting address. Zero-based by default; 40001/00001 style addresses are also accepted.value(json_value) - Single 16-bit register value or coil boolean/0/1.values(json_value) - Multiple values. Arrays and comma-separated strings are accepted.
connection
connection(string, default"") - Optional named connection to reuse/open for fast repeated writes.instance(string, default"") - Alias for connection.reload(boolean, defaultfalse) - Force reconnect the named connection before this operation.
advanced
addressBase(string, default"zero") - zero (default), one, or modbus. one subtracts 1 from address.slave(integer, 0-255) - Unit/slave id.timeoutMs(duration_ms, 0-3.6e+06, default30000)waitTimeMs(duration_ms, 0-60000, default20) - Cancellable delay after a successful write before the next block. 0 = no delay.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"address": 0,
"kind": "modbusWriteRegister",
"url": "tcp:127.0.0.1:15020",
"value": 123
}
modbusWriteRegisters - Modbus Write Registers
Write multiple holding registers.
Params:
input
url(string, required, default"tcp:127.0.0.1:15020") - Endpoint to write to.area(enum, default"holdingRegisters", enum: holdingRegisters|coils) - Writable table/function: holdingRegisters=FC06/FC16, coils=FC05/FC15.address(integer, 0-65535, default0) - Starting address. Zero-based by default; 40001/00001 style addresses are also accepted.value(json_value) - Single 16-bit register value or coil boolean/0/1.values(json_value) - Multiple values. Arrays and comma-separated strings are accepted.
connection
connection(string, default"") - Optional named connection to reuse/open for fast repeated writes.instance(string, default"") - Alias for connection.reload(boolean, defaultfalse) - Force reconnect the named connection before this operation.
advanced
addressBase(string, default"zero") - zero (default), one, or modbus. one subtracts 1 from address.slave(integer, 0-255) - Unit/slave id.timeoutMs(duration_ms, 0-3.6e+06, default30000)waitTimeMs(duration_ms, 0-60000, default20) - Cancellable delay after a successful write before the next block. 0 = no delay.
output
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"address": 0,
"kind": "modbusWriteRegisters",
"url": "tcp:127.0.0.1:15020",
"values": [
101,
202
]
}
Models
modelControl - Model Control
List or unload loaded local model instances for this xBlox process.
Params:
lifecycle
action(enum, default"List", enum: List|Unload) - List loaded models in this xBlox process, or unload one by key.key(string, default"") - Loaded model key to unload, e.g. llama:vlm, llama:text, vibevoice:tts, or an onnx:* key. Empty aliases use their group default.
output
storeAs(string, default"models") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"action": "List",
"key": "",
"kind": "modelControl",
"storeAs": "models"
}
Network
fetch - Fetch
Fetch a URL. With decode:json + a JSON-array response, child blocks iterate over each element (PREVIOUS = element, index = i).
Params:
input
url(string, required, default"https://") - Request URL. Supports ${var} interpolation.
request
method(string, default"GET", enum: GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS) - HTTP method - GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, or any custom verb.queryParams(json_value) - Query-string parameters as a JSON object {"key":"value"}. Appended to the URL (percent-encoded). Merged with any params already in the URL.headers(string, default"") - Extra request headers - JSON object {"Name":"value"} or array of "Name: value" strings.
body
bodyType(enum, default"none", enum: none|raw|json|form|multipart) - Request body format. none = no body (GET / HEAD). raw = plain text body. json = serialize bodyJson + Content-Type: application/json. form = URL-encode bodyFields + Content-Type: application/x-www-form-urlencoded. multipart = curl_mime from bodyParts ("name=value" or "name@/path").body(prompt, default"") - Raw request body (used when bodyType is raw). Supports ${var} interpolation.bodyJson(json_value) - Body as a JSON value (object, array, string, ...). Serialized and sent with Content-Type: application/json. Used when bodyType is json.bodyFields(json_value) - Form fields as a JSON object {"key": "value"}. URL-encoded and sent with Content-Type: application/x-www-form-urlencoded. Used when bodyType is form.bodyParts(args_list) - Multipart form parts (bodyType: multipart). Each entry uses curl -F syntax: "name=value" for a text field, "name@/path/to/file" for a file part, or bare "/path/to/file" to use the filename as field name.
response
decode(enum, default"raw", enum: raw|json) - raw = body as a string. json = parse body as JSON and apply the parse selector.parse(string, default".") - Dotted-path selector applied after decode:json (e.g. .items[0].name). Default . = whole document.
auth
auth(enum, default"none", enum: none|bearer|basic|apikey) - Authentication mode. none = no auth header added.authToken(string, default"") - Bearer token or API key value.authUser(string, default"") - HTTP Basic auth username.authPass(string, default"") - HTTP Basic auth password.authHeader(string, default"X-Api-Key") - Header name used for apikey auth. Default: X-Api-Key.
download
downloadAs(output_path, default"") - Save the response body to this file path; the saved path is available as the savedPath output. decode/parse/storeAs still apply normally — result (PREVIOUS) is the decoded value, not the path. "auto" derives the filename from Content-Disposition or the URL and saves to Downloads.
cache
cache(boolean, defaultfalse) - Cache responses to disk. Sends ETag / Last-Modified revalidation on stale hits.cacheDir(string, default"") - Cache directory. Default: system cache dir / pixlwiz / net.cacheTtlMs(duration_ms, -1-8.64e+07, default3600000) - Cache TTL in ms. -1 = rely solely on server ETag / Last-Modified. Default: 1 h.
proxy
proxy(string, default"") - Proxy URL, e.g. http://proxy.corp:8080.proxyUser(string, default"") - Proxy username.proxyPass(string, default"") - Proxy password.
session
sessionId(string, default"") - Named persistent cookie jar. All requests sharing the same sessionId reuse cookies set by previous responses (login flows, OAuth redirects, CSRF tokens). Concurrent requests to the same session are serialized. Empty = no session.sessionDir(dir_path, default"") - Directory for session jar files. Default: system cache dir / pixlwiz / sessions.
ssl
insecure(boolean, defaultfalse) - Skip SSL peer and host verification. Implies verifyPeer=false + verifyHost=false.verifyPeer(boolean, defaulttrue) - Verify SSL certificate chain. Overridden to false by insecure:true.verifyHost(boolean, defaulttrue) - Verify SSL hostname. Overridden to false by insecure:true.
timeouts
timeoutMs(duration_ms, 0-300000, default30000) - Total transfer timeout in ms (0 = no limit).connectTimeoutMs(integer, 0-300000, default10000) - TCP connect timeout in ms.
redirects
followRedirects(boolean, defaulttrue) - Follow 3xx redirects automatically.maxRedirects(integer, 0-30, default5) - Maximum number of redirects to follow.
retry
retries(integer, 0-10, default2) - Maximum number of retries after a transient failure (curl error or 5xx / 408 / 429).retryDelayMs(integer, 0-60000, default250) - Base retry delay in ms. Each retry doubles the delay plus random jitter (exponential back-off).
output
statusCode(integer) - HTTP status code of the final response. 0 for file:// and transport errors.storeAs(string, default"response") - Variable to also store the result in (always sets PREVIOUS).
Features: iterable cancellable
Children:
- items (Body, role: body)
Default block:
{
"decode": "raw",
"followRedirects": true,
"kind": "fetch",
"method": "GET",
"storeAs": "response",
"timeoutMs": 30000,
"url": "https://"
}
ipcBroadcast - IPC Broadcast
Send a message to every live XBlox session.
Params:
input
from(string, default"xblox") - Sender identity stored with the message.message(string, default"") - Message text. Supports ${var} interpolation.data(json_value) - Optional structured payload attached as message.data.
timeouts
timeoutMs(duration_ms, 1-300000, default3000) - Per-session IPC request timeout.
output
storeAs(string, default"ipcBroadcast") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"data": null,
"from": "xblox",
"kind": "ipcBroadcast",
"message": "",
"storeAs": "ipcBroadcast"
}
ipcReceive - IPC Receive
Drain or wait for messages from a live XBlox session inbox. Child blocks iterate over received messages.
Params:
input
target(string, required) - Target session key, descriptor stem, or unambiguous key prefix.peek(boolean, defaultfalse) - Read without consuming messages.
wait
waitMs(duration_ms, 0-300000, default0) - Poll until messages arrive or this timeout elapses.pollMs(duration_ms, 10-60000, default100) - Polling interval while waiting.
timeouts
timeoutMs(duration_ms, 1-300000, default3000) - Per-IPC request timeout.
output
storeAs(string, default"messages") - Variable to also store the result in (always sets PREVIOUS).
Features: iterable cancellable
Children:
- items (For each, role: body)
Default block:
{
"items": [],
"kind": "ipcReceive",
"peek": false,
"pollMs": 100,
"storeAs": "messages",
"target": "",
"waitMs": 0
}
ipcSend - IPC Send
Send a message to a live XBlox session.
Params:
input
target(string, required) - Target session key, descriptor stem, or unambiguous key prefix.from(string, default"xblox") - Sender identity stored with the message.message(string, default"") - Message text. Supports ${var} interpolation.data(json_value) - Optional structured payload attached as message.data.
timeouts
timeoutMs(duration_ms, 1-300000, default3000) - IPC request timeout.
output
storeAs(string, default"ipcReply") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"data": null,
"from": "xblox",
"kind": "ipcSend",
"message": "",
"storeAs": "ipcReply",
"target": ""
}
ipcSendBatch - IPC Send Batch
Send many messages to a live XBlox session in one IPC frame.
Params:
input
target(string, required) - Target session key, descriptor stem, or unambiguous key prefix.from(string, default"xblox") - Sender identity stored with each message.message(string, default"") - Message text. Supports ${var} interpolation.count(integer, 0-10000, default1) - Number of messages to create when source is empty.source(string, default"") - Optional context array to send one message per element.data(json_value) - Optional shared structured payload when source is empty.
timeouts
timeoutMs(duration_ms, 1-300000, default3000) - IPC request timeout.
output
storeAs(string, default"ipcBatchReply") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"count": 1,
"data": null,
"from": "xblox",
"kind": "ipcSendBatch",
"message": "",
"source": "",
"storeAs": "ipcBatchReply",
"target": ""
}
ipcSession - IPC Session
Host a named XBlox IPC session for this run. Reuses the same session on later loop passes.
Params:
input
name(string, required) - Session name. Plain names are normalized to name:. label(string, default"") - Optional display label for the session.
output
storeAs(string, default"session") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"kind": "ipcSession",
"name": "ipc",
"storeAs": "session"
}
ipcSessions - IPC Sessions
List live XBlox sessions. Child blocks iterate over each session descriptor.
Params:
storeAs(string, default"sessions") - Variable to also store the result in (always sets PREVIOUS).
Features: iterable pure
Children:
- items (For each, role: body)
Default block:
{
"items": [],
"kind": "ipcSessions",
"storeAs": "sessions"
}
sshExec - SSH Exec
Run a command on a remote host over SSH using password or public-key authentication.
Params:
input
host(string, required) - SSH host name or IP address.port(integer, 1-65535, default22) - SSH port.username(string, default"") - SSH username. Empty lets libssh use the current user.password(string, default"") - Password authentication value. Empty tries public-key auth.privateKey(file_path, default"") - Optional private key file for public-key auth.passphrase(string, default"") - Optional private key passphrase.command(prompt, required) - Remote command to execute. Supports ${var} interpolation.
ssh
configFile(file_path, default"") - Optional SSH config file. Empty parses the OS user default ~/.ssh/config.knownHosts(file_path, default"") - Optional known_hosts file. Empty uses libssh defaults.verifyHost(boolean, defaulttrue) - Verify the server host key against known_hosts.acceptUnknownHost(boolean, defaultfalse) - Add an unknown host key to known_hosts when verifyHost is enabled.
timeouts
timeoutMs(duration_ms, 1-300000, default30000) - Connect and command timeout in ms.
output
exitStatus(integer) - Remote command exit status.storeAs(string, default"ssh") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"command": "",
"host": "",
"kind": "sshExec",
"port": 22,
"storeAs": "ssh",
"timeoutMs": 30000,
"username": ""
}
OCR
ocrModelControl - Unload Model
List or unload loaded local model instances for this xBlox process.
Params:
lifecycle
action(enum, default"List", enum: List|Unload) - List loaded models in this xBlox process, or unload one by key.key(string, default"llama:vlm") - Loaded model key to unload, e.g. llama:vlm, llama:text, vibevoice:tts, or an onnx:* key. Empty aliases use their group default.
output
storeAs(string, default"modelKey") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"action": "Unload",
"key": "llama:vlm",
"kind": "ocrModelControl",
"storeAs": "modelKey"
}
ocrText - OCR Text
Ready-to-go document OCR: PP-DocLayoutV3 detects layout, PaddleOCR-VL extracts text/tables, and child items can iterate documents.
Params:
source_model
input(image_path, required, from PREVIOUS, resolve: variables+globs) - Input image path or glob. Uses PREVIOUS when unset.provider(enum, default"auto", enum: auto|layout|table|text|vlm|paddle) - OCR runtime. auto/layout uses PP-DocLayoutV3 + PaddleOCR-VL; table/text force the VLM prompt; paddle is the raw ONNX fallback.mode(enum, default"layout", enum: layout|table|text) - layout detects tables first, table forces Table Recognition, text forces OCR text.model(string, default"", resolve: variables+deep) - Local OCR VLM model id/path. Empty = first OCR-slot VLM, typically PaddleOCR-VL.
vlm_prompt
prompt(prompt, default"OCR: Extract all text verbatim, preserving line breaks and spatial layout.") - Advanced prompt override for provider=vlm. The layout pipe chooses OCR: or Table Recognition: automatically.
output
json(boolean, defaulttrue) - When true, result is an iterable JSON array of OCR documents; when false, result is combined markdown.markdown(boolean, defaulttrue) - Include markdown on each JSON document for logging or downstream display.result(json_value) - OCR document array when json=true, markdown string when json=false.storeAs(string, default"ocr") - Variable to also store the result in (always sets PREVIOUS).
runtime
backend(enum, default"auto", enum: auto|cpu|gpu|cuda|coreml|metal) - ONNX Runtime execution provider for PP-DocLayoutV3 / raw PaddleOCR.threads(integer, 1-64, default4) - CPU thread count for ONNX or VLM inference.
layout_model
layoutModel(file_path, default"") - Advanced override: PP-DocLayoutV3.onnx path. Empty = discovered from models folders.layoutConf(float, 0-1, default0.5) - Minimum PP-DocLayoutV3 region confidence.
onnx_model_overrides
detModel(file_path, default"") - Advanced override: ONNX PaddleOCR detection model path.recModel(file_path, default"") - Advanced override: ONNX PaddleOCR recognition model path.dict(file_path, default"") - Advanced override: OCR character dictionary file (one character per line).
onnx_options
threshold(float, 0-1, default0.3) - ONNX detection threshold.recThreshold(float, 0-1, default0.5) - ONNX recognition confidence threshold.maxSize(integer, 32-4096, default960) - ONNX detector max image side after resize.
vlm_runtime
maxTokens(integer, 1-32768, default2048) - VLM max generated tokens.ctx(integer, 512-131072, default8192) - VLM context size.gpuLayers(integer, -1-999, default-1) - VLM GPU layer offload. -1 = all layers, 0 = CPU only. Uses CUDA/Vulkan/Metal per build.
Features: iterable background cancellable
Children:
- items (For each document, role: body)
Default block:
{
"backend": "auto",
"ctx": 8192,
"detModel": "",
"dict": "",
"gpuLayers": -1,
"input": "",
"items": [],
"json": true,
"kind": "ocrText",
"layoutConf": 0.5,
"layoutModel": "",
"markdown": true,
"maxSize": 960,
"maxTokens": 2048,
"mode": "layout",
"model": "",
"prompt": "",
"provider": "auto",
"recModel": "",
"recThreshold": 0.5,
"storeAs": "ocr",
"threads": 4,
"threshold": 0.3
}
Service
serviceFilesList - List Files
GET /api/vfs/ls/{mount}/{path} - list files in a VFS directory.
Params:
input
mount(string, default"home", resolve: variables+deep) - VFS mount name. Supports ${var} interpolation.path(string, default"", resolve: variables+deep) - Directory path within the mount (empty = root). Supports ${var} interpolation.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"fileList") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Children:
- items (Then, role: body)
Default block:
{
"auth": "auto",
"kind": "serviceFilesList",
"mount": "home",
"path": "",
"storeAs": "fileList"
}
serviceFilesRead - Read File
GET /api/vfs/read/{mount}/{path} - download a VFS file. Set downloadAs to save to disk (PREVIOUS = saved path); else PREVIOUS = body string.
Params:
input
mount(string, default"home", resolve: variables+deep) - VFS mount name. Supports ${var} interpolation.path(string, required, default"", resolve: variables+deep) - File path within the mount. Supports ${var} interpolation.
download
downloadAs(output_path, default"", constraints: writable+createParents, resolve: variables+custom+deep) - Save response body to this path. Supports ${var} interpolation. Parent directories are created automatically. Empty = return body as string.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"fileContent") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "serviceFilesRead",
"mount": "home",
"storeAs": "fileContent"
}
serviceFilesRemove - Remove File
DELETE /api/vfs/delete/{mount}/{path} - remove a file or folder from the VFS.
Params:
input
mount(string, default"home", resolve: variables+deep) - VFS mount name. Supports ${var} interpolation.path(string, required, default"", resolve: variables+deep) - File or folder path to remove. Supports ${var} interpolation.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"removeResult") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "serviceFilesRemove",
"mount": "home",
"storeAs": "removeResult"
}
serviceFilesSearch - Search Files (VFS)
GET /api/vfs/search/{mount}/{path}?q=...&type=...&maxResults=...&fts=1 - search VFS files by filename walk (default) or PostgreSQL FTS index (fts=1). FTS only reflects the last index run; fresh uploads may not appear until the index is rebuilt. PREVIOUS = {results:[...], total:N, truncated:bool}.
Params:
input
q(string, required, default"", resolve: variables+deep) - Search query (min 2 chars). Supports ${var} interpolation.mount(string, default"home", resolve: variables+deep) - VFS mount name (e.g. "home", "shared").path(string, default"", resolve: variables+deep) - Subpath to restrict search within (optional).
filter
type(enum, default"all", enum: all|file|dir) - Node type filter.maxResults(integer, 1-500, default200) - Max results (server cap: 500).fts(integer, 0-1, default0) - 1 = use PostgreSQL full-text index (fast, but stale for fresh uploads). 0 = live filesystem walk (slower, always current).
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"searchResult") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Children:
- items (Then, role: body)
Default block:
{
"auth": "auto",
"fts": 0,
"kind": "serviceFilesSearch",
"maxResults": 200,
"mount": "home",
"storeAs": "searchResult",
"type": "all"
}
serviceFilesUpload - Upload File
POST /api/vfs/upload/{mount}/{remotePath} - upload any file to the VFS.
Params:
input
file(file_path, required, default"", constraints: mustExist+readable, resolve: variables+custom+deep) - Local file path to upload. Supports ${var} interpolation.
vfs
mount(string, default"home", resolve: variables+deep) - VFS mount name (e.g. home). Supports ${var} interpolation.remotePath(string, default"", resolve: variables+deep) - Remote VFS path (relative to mount root). Supports ${var} interpolation. Empty = local filename.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"fileResult") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "serviceFilesUpload",
"mount": "home",
"storeAs": "fileResult"
}
serviceImagesUpload - Upload Image(s)
POST /api/images?forward=vfs&original=true - multipart upload one or more image files. PREVIOUS = array of per-file response objects.
Params:
input
file(file_path, default"", constraints: mustExist+readable, resolve: variables+custom+deep) - Single image file path to upload. Supports ${var} interpolation. Use 'files' for multiple.files(args_list, resolve: variables+custom+deep) - Multiple image file paths. Each is uploaded separately.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
failed(integer) - Number of files that failed to upload.storeAs(string, default"uploadResults") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "serviceImagesUpload",
"storeAs": "uploadResults"
}
servicePagesCreate - Create Page
POST /api/pages - create a CMS page. Provide slug + title + content, or a full body JSON object.
Params:
input
slug(string, default"", resolve: variables+deep) - Page slug (URL-safe identifier). Required unless 'body' is set. Supports ${var} interpolation.title(string, default"", resolve: variables+deep) - Page title. Supports ${var} interpolation.content(prompt, default"", resolve: variables+deep) - Page content (Markdown). Wrapped as a markdown-text widget. Supports ${var} interpolation.body(json_value) - Full POST body as JSON object - overrides all individual params.
meta
tags(string, default"", resolve: variables+deep) - Comma-separated tag list. Supports ${var} interpolation.visibility(enum, default"public", enum: public|listed|private) - Page visibility: public / listed / private.ownerId(string, default"", resolve: variables+deep) - Owner user UUID (default: from zitadel-oauth.json).
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"page") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "servicePagesCreate",
"storeAs": "page",
"visibility": "public"
}
servicePagesGet - Get Page
GET /api/user-page/{identifier}/{slug} - fetch a single page by pageId or ownerId/userId + slug.
Params:
input
pageId(string, default"", resolve: variables+deep) - Page UUID. If empty, slug lookup is used. Supports ${var} interpolation.slug(string, default"", resolve: variables+deep) - Page slug for lookup when pageId is empty. Supports ${var} interpolation.ownerId(string, default"", resolve: variables+deep) - Owner user UUID or username for slug lookup. Defaults to logged-in app user when empty.
lookup
userId(string, default"", resolve: variables+deep) - Alias/fallback for ownerId in slug lookup. Supports ${var} interpolation.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"page") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "servicePagesGet",
"storeAs": "page"
}
servicePagesList - List Pages
GET /api/pages?userId=...&page=...&limit=... - list pages.
Params:
input
userId(string, default"", resolve: variables+deep) - Filter by owner user UUID. Supports ${var} interpolation.
pagination
page(integer, 1-10000, default1) - Page number (1-based).limit(integer, 1-200, default20) - Results per page.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"pages") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Children:
- items (Then, role: body)
Default block:
{
"auth": "auto",
"kind": "servicePagesList",
"limit": 20,
"page": 1,
"storeAs": "pages"
}
servicePagesRemove - Remove Page
DELETE /api/pages/{pageId}; or resolve ownerId/userId + slug before deleting.
Params:
input
pageId(string, default"", resolve: variables+deep) - Page UUID. If empty, slug lookup is used. Supports ${var} interpolation.slug(string, default"", resolve: variables+deep) - Page slug for lookup when pageId is empty. Supports ${var} interpolation.ownerId(string, default"", resolve: variables+deep) - Owner user UUID or username for slug lookup. Defaults to logged-in app user when empty.
lookup
userId(string, default"", resolve: variables+deep) - Alias/fallback for ownerId in slug lookup. Supports ${var} interpolation.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"removeResult") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "servicePagesRemove",
"storeAs": "removeResult"
}
servicePagesUpdate - Update Page
PATCH /api/pages/{pageId}; or resolve ownerId/userId + slug before updating.
Params:
input
pageId(string, default"", resolve: variables+deep) - Page UUID. If empty, slug lookup is used. Supports ${var} interpolation.slug(string, default"", resolve: variables+deep) - Existing page slug for lookup when pageId is empty. Supports ${var} interpolation.ownerId(string, default"", resolve: variables+deep) - Owner user UUID or username for slug lookup. Defaults to logged-in app user when empty.content(prompt, default"", resolve: variables+deep) - Replacement page content (Markdown). Wrapped as a markdown-text layout. Supports ${var} interpolation.title(string, default"", resolve: variables+deep) - Optional replacement page title. Supports ${var} interpolation.newSlug(string, default"", resolve: variables+deep) - Optional replacement page slug. Supports ${var} interpolation.body(json_value) - Full PATCH body as JSON object - overrides individual update params.
lookup
userId(string, default"", resolve: variables+deep) - Alias/fallback for ownerId in slug lookup. Supports ${var} interpolation.
meta
tags(string, default"", resolve: variables+deep) - Comma-separated replacement tag list. Supports ${var} interpolation.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"page") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "servicePagesUpdate",
"storeAs": "page"
}
servicePicturesGet - Get Picture
GET /api/pictures/{pictureId} - fetch a picture record.
Params:
input
pictureId(string, required, default"", resolve: variables+deep) - Picture record ID. Supports ${var} interpolation.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"picture") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "servicePicturesGet",
"storeAs": "picture"
}
servicePicturesList - List Pictures
GET /api/pictures?userId=...&page=...&limit=... - list picture records.
Params:
input
userId(string, default"", resolve: variables+deep) - Filter by owner user UUID. Supports ${var} interpolation.
pagination
page(integer, 1-10000, default1) - Page number (1-based).limit(integer, 1-200, default20) - Results per page.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"pictures") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Children:
- items (Then, role: body)
Default block:
{
"auth": "auto",
"kind": "servicePicturesList",
"limit": 20,
"page": 1,
"storeAs": "pictures"
}
servicePicturesRemove - Remove Picture
DELETE /api/pictures/{pictureId} - remove a picture record.
Params:
input
pictureId(string, required, default"", resolve: variables+deep) - Picture record ID. Supports ${var} interpolation.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"removeResult") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "servicePicturesRemove",
"storeAs": "removeResult"
}
servicePostsCreate - Create Post
Full publish flow: POST /api/posts then upload each image via /api/images and attach via /api/pictures. PREVIOUS = {postId, pictureIds, post}.
Params:
input
title(string, default"", resolve: variables+deep) - Post title. Supports ${var} interpolation.description(string, default"", resolve: variables+deep) - Post description. Supports ${var} interpolation.
meta
visibility(enum, default"public", enum: public|listed|private) - Post visibility.ownerId(string, default"", resolve: variables+deep) - Owner user UUID.
images
file(file_path, default"", constraints: mustExist+readable, resolve: variables+custom+deep) - Single image file to upload and attach. Supports ${var} interpolation.files(args_list, resolve: variables+custom+deep) - Multiple image files to upload and attach (positional).
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"post") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "servicePostsCreate",
"storeAs": "post",
"visibility": "public"
}
servicePostsGet - Get Post
GET /api/posts/{postId} - fetch a post with its pictures.
Params:
input
postId(string, required, default"", resolve: variables+deep) - Post ID. Supports ${var} interpolation.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"post") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "servicePostsGet",
"storeAs": "post"
}
servicePostsList - List Posts
GET /api/posts?page=...&limit=...&userId=... - list posts.
Params:
input
userId(string, default"", resolve: variables+deep) - Filter by owner user UUID. Supports ${var} interpolation.
pagination
page(integer, 1-10000, default1) - Page number (1-based).limit(integer, 1-200, default20) - Results per page.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"posts") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Children:
- items (Then, role: body)
Default block:
{
"auth": "auto",
"kind": "servicePostsList",
"limit": 20,
"page": 1,
"storeAs": "posts"
}
servicePostsRemove - Remove Post
DELETE /api/posts/{postId} - remove a post.
Params:
input
postId(string, required, default"", resolve: variables+deep) - Post ID. Supports ${var} interpolation.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"removeResult") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"auth": "auto",
"kind": "servicePostsRemove",
"storeAs": "removeResult"
}
serviceSearch - Search
GET /api/search?q=...&type=...&limit=... - full-text search across pages, posts, pictures, VFS files and places. Auth is optional (unauthenticated calls see only public content). PREVIOUS = array of enriched FeedPost objects.
Params:
input
q(string, required, default"", resolve: variables+deep) - Search query. Supports ${var} interpolation.
filter
type(enum, default"all", enum: all|pages|posts|pictures|files|places) - Content type to search (default: all).limit(integer, 1-50, default20) - Max results (server cap: 50).sizes(string, default"", resolve: variables+deep) - Comma-separated image widths for responsive variants, e.g. "320,640,1024".formats(string, default"", resolve: variables+deep) - Comma-separated image formats, e.g. "avif,webp".visibilityFilter(enum, default"", enum: |invisible|private) - Visibility filter (requires auth). empty = no filter.
auth
serverUrl(string, default"", resolve: variables+deep) - Pixlwiz service base URL (e.g. https://pixlwiz.com). Supports ${var} / ${ENV} interpolation. Empty = resolved from SERVER_URL / VITE_SERVER_IMAGE_API_URL env vars.auth(enum, default"auto", enum: auto|bearer|none) - Auth mode. auto = bearerToken param if set, else zitadel-oauth.json (runpm-image loginfirst). bearer = explicit bearerToken only. none = unauthenticated.bearerToken(string, default"", resolve: variables+deep) - Explicit JWT bearer token. Supports ${var} interpolation.
timeouts
timeoutMs(duration_ms, 1000-300000, default30000) - HTTP timeout in ms.
output
storeAs(string, default"results") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Children:
- items (Then, role: body)
Default block:
{
"auth": "auto",
"kind": "serviceSearch",
"limit": 20,
"storeAs": "results",
"type": "all"
}
Shell
openPath - Open Path
Open a file or folder with the system default application.
Params:
input
path(file_path, required, resolve: variables+deep) - File or folder path to open with the system default application.
output
storeAs(string, default"openedPath") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"kind": "openPath",
"path": "",
"storeAs": "openedPath"
}
shell - Shell
Run a shell command through the native RunTool.
Params:
options
mode(enum, default"shell", enum: shell|powershell|cmd|bash|auto|argv) - Shell interpreter: shell|powershell|cmd|bash|auto|argv.
advanced
shell(enum, default"auto", enum: auto|cmd|powershell|bash|sh) - Shell binary override. auto = platform default.timeoutMs(duration_ms, 0-3.6e+06, default30000) - Maximum execution time in milliseconds. 0 = no timeout.log(boolean, defaultfalse) - Echo stdout/stderr to the host logger.stdout(enum, default"info", enum: trace|debug|info|warn|error|off) - Log level for stdout lines.stderr(enum, default"error", enum: trace|debug|info|warn|error|off) - Log level for stderr lines.
input
command(string, required, default"echo hello", resolve: variables+deep) - Command or script to execute.cwd(string, default"", resolve: variables+deep) - Working directory (supports ${var} interpolation). Empty = default.
output
storeAs(string, default"stdout") - Variable to also store the result in (always sets PREVIOUS).
Features: background cancellable
Default block:
{
"command": "echo hello",
"kind": "shell",
"log": false,
"mode": "shell",
"shell": "auto",
"stderr": "error",
"stdout": "info",
"storeAs": "stdout",
"timeoutMs": 30000
}
xbloxRun - XBlox Script
Run another XBlox document directly, with context overrides and optional document-loop controls.
Params:
lifecycle
action(enum, default"Run", enum: Run|Stop|Status) - Run the script, Stop a background run keyed by path, or report Status.
input
path(file_path, required, constraints: mustExist+readable) - XBlox document to run.context(json_value, default{}) - Context variables merged into the child script before it runs.
advanced
args(args_list, default[]) - Advanced CLI-style overrides, e.g. --CURRENT_FILE path or --name=value. Merged after context.reload(boolean, defaultfalse) - Reload the child script from disk before this run. Off reuses the run-scoped cached document.background(boolean, defaultfalse) - Start the child script on a detached background thread and return immediately.logLevel(enum, default"off", enum: off|trace|debug|info|warn|error) - Optional host log level for child-run summaries and collected child events.
loop
loop(boolean, defaultfalse) - Override the child document loop setting and run it as a document loop.loopIntervalMs(duration_ms, 0-8.64e+07, default100) - Loop interval override in milliseconds. 0 = as fast as possible.loopReset(boolean, defaultfalse) - Reset child scope every loop pass instead of persisting variables.
output
storeAs(string, default"xbloxResult") - Variable to also store the result in (always sets PREVIOUS).
Features: background cancellable
Children:
- items (Then, role: body)
Default block:
{
"action": "Run",
"args": [],
"background": false,
"context": {},
"items": [],
"kind": "xbloxRun",
"logLevel": "off",
"path": "",
"reload": false,
"storeAs": "xbloxResult"
}
Vector
vectorLocalAddDir - Index Directory into Local Vector Store
Recursively index all supported files (txt, md, docx, xlsx, pptx) in a directory. Already-indexed paths are skipped. PREVIOUS = {files:[{file,count,skipped}], totalChunks:N, storePath, docCount}.
Params:
input
dir(dir_path, required, default"", resolve: variables+deep) - Directory to index. Supports ${var}.storePath(string, required, default"", resolve: variables+deep) - Directory for the local vector store (created if absent). Supports ${var}.
filter
recursive(boolean, defaulttrue) - Descend into subdirectories.maxFiles(integer, 1-10000, default500) - Hard cap on files processed in one call.
chunking
chunkSize(integer, 50-4000, default500) - Max characters per chunk when splitting long text (approx 100-800 tokens).chunkOverlap(integer, 0-500, default100) - Overlap characters between adjacent chunks.
advanced
model(string, default"", resolve: variables+deep) - Path to GGUF embedding model. Empty = auto-discover (PM_EMBED_MODEL or dist/models/).threads(integer, 1-32, default4) - CPU threads for llama.cpp embedding inference.gpuLayers(integer, -1-999, default0) - GPU offload for embedding: 0 = CPU only, -1 = all layers on GPU, >0 = first N layers. Speeds up large ingests on CUDA/Metal/Vulkan builds.
output
storeAs(string, default"addDirResult") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"chunkOverlap": 100,
"chunkSize": 500,
"kind": "vectorLocalAddDir",
"maxFiles": 500,
"recursive": true,
"storeAs": "addDirResult"
}
vectorLocalAddFile - Add File to Local Vector Store
Read a text file, chunk it, embed each chunk with the local GGUF model, insert into the store. Binary/image files and files > 1 MiB are rejected. PREVIOUS = {ids:[...], count:N, file, storePath, docCount}.
Params:
input
file(file_path, required, default"", constraints: mustExist+readable, resolve: variables+custom+deep) - Path to a text file to embed and insert. Supports ${var}.source(string, default"file", resolve: variables+deep) - Source label (default: file). Supports ${var}.title(string, default"", resolve: variables+deep) - Override title (default: filename). Supports ${var}.tags(string, default"", resolve: variables+deep) - JSON array of tag strings. Supports ${var}.storePath(string, required, default"", resolve: variables+deep) - Directory for the local vector store (created if absent). Supports ${var}.
chunking
chunkSize(integer, 50-4000, default500) - Max characters per chunk when splitting long text (approx 100-800 tokens).chunkOverlap(integer, 0-500, default100) - Overlap characters between adjacent chunks.
advanced
model(string, default"", resolve: variables+deep) - Path to GGUF embedding model. Empty = auto-discover (PM_EMBED_MODEL or dist/models/).threads(integer, 1-32, default4) - CPU threads for llama.cpp embedding inference.gpuLayers(integer, -1-999, default0) - GPU offload for embedding: 0 = CPU only, -1 = all layers on GPU, >0 = first N layers. Speeds up large ingests on CUDA/Metal/Vulkan builds.
output
storeAs(string, default"addResult") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"chunkOverlap": 100,
"chunkSize": 500,
"kind": "vectorLocalAddFile",
"source": "file",
"storeAs": "addResult"
}
vectorLocalAddText - Add Text to Local Vector Store
Embed text locally (GGUF model), chunk if needed, insert into the store, and save. All embedding is offline - no network calls. PREVIOUS = {ids:[...], count:N, storePath, docCount}.
Params:
input
text(string, required, default"", resolve: variables+deep) - Text to embed and insert. Long text is chunked automatically. Supports ${var}.source(string, default"text", resolve: variables+deep) - Source label for the document (e.g. text, memory, note). Supports ${var}.path(string, default"", resolve: variables+deep) - Origin path or URI (optional). Supports ${var}.title(string, default"", resolve: variables+deep) - Human-readable title (optional). Supports ${var}.tags(string, default"", resolve: variables+deep) - JSON array of tag strings, e.g. ["docs","2026"]. Supports ${var}.storePath(string, required, default"", resolve: variables+deep) - Directory for the local vector store (created if absent). Supports ${var}.
chunking
chunkSize(integer, 50-4000, default500) - Max characters per chunk when splitting long text (approx 100-800 tokens).chunkOverlap(integer, 0-500, default100) - Overlap characters between adjacent chunks.
advanced
model(string, default"", resolve: variables+deep) - Path to GGUF embedding model. Empty = auto-discover (PM_EMBED_MODEL or dist/models/).threads(integer, 1-32, default4) - CPU threads for llama.cpp embedding inference.gpuLayers(integer, -1-999, default0) - GPU offload for embedding: 0 = CPU only, -1 = all layers on GPU, >0 = first N layers. Speeds up large ingests on CUDA/Metal/Vulkan builds.
output
storeAs(string, default"addResult") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"chunkOverlap": 100,
"chunkSize": 500,
"kind": "vectorLocalAddText",
"source": "text",
"storeAs": "addResult"
}
vectorLocalDelete - Delete from Local Vector Store by Path
Remove all chunks for a given source path from the store. PREVIOUS = {deleted:N, path, storePath, docCount}.
Params:
input
path(string, required, default"", resolve: variables+deep) - Exact source path to remove. Supports ${var}.storePath(string, required, default"", resolve: variables+deep) - Directory for the local vector store (created if absent). Supports ${var}.
advanced
model(string, default"", resolve: variables+deep) - Path to GGUF embedding model. Empty = auto-discover (PM_EMBED_MODEL or dist/models/).threads(integer, 1-32, default4) - CPU threads for llama.cpp embedding inference.gpuLayers(integer, -1-999, default0) - GPU offload for embedding: 0 = CPU only, -1 = all layers on GPU, >0 = first N layers. Speeds up large ingests on CUDA/Metal/Vulkan builds.
output
storeAs(string, default"deleteResult") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"kind": "vectorLocalDelete",
"storeAs": "deleteResult"
}
vectorLocalOpen - Open Local Vector Store
Open or create a local GGUF-backed vector store at storePath. Loads the embedding model once; subsequent blocks on the same path reuse it. Set gpuLayers to offload embedding to the GPU (-1 = all layers) for faster ingest. PREVIOUS = {docCount, dims, modelPath, gpu, gpuLayers}.
Params:
input
storePath(string, required, default"", resolve: variables+deep) - Directory for the local vector store (created if absent). Supports ${var}.
advanced
model(string, default"", resolve: variables+deep) - Path to GGUF embedding model. Empty = auto-discover (PM_EMBED_MODEL or dist/models/).threads(integer, 1-32, default4) - CPU threads for llama.cpp embedding inference.gpuLayers(integer, -1-999, default0) - GPU offload for embedding: 0 = CPU only, -1 = all layers on GPU, >0 = first N layers. Speeds up large ingests on CUDA/Metal/Vulkan builds.
output
storeAs(string, default"storeInfo") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"kind": "vectorLocalOpen",
"storeAs": "storeInfo"
}
vectorLocalSearch - Search Local Vector Store
Embed the query locally (GGUF model) and return top-k results by cosine similarity. Offline, no network. PREVIOUS = {hits:[{id,source,path,title,chunk,tags,score},...], count:N, query}.
Params:
input
query(string, required, default"", resolve: variables+deep) - Semantic search query. Supports ${var}.storePath(string, required, default"", resolve: variables+deep) - Directory for the local vector store (created if absent). Supports ${var}.
filter
topK(integer, 1-200, default10) - Maximum number of results to return.filterSource(string, default"", resolve: variables+deep) - Restrict to docs with this source label (empty = no filter).filterPath(string, default"", resolve: variables+deep) - Restrict to docs with this exact path (empty = no filter).
advanced
model(string, default"", resolve: variables+deep) - Path to GGUF embedding model. Empty = auto-discover (PM_EMBED_MODEL or dist/models/).threads(integer, 1-32, default4) - CPU threads for llama.cpp embedding inference.gpuLayers(integer, -1-999, default0) - GPU offload for embedding: 0 = CPU only, -1 = all layers on GPU, >0 = first N layers. Speeds up large ingests on CUDA/Metal/Vulkan builds.
output
storeAs(string, default"searchResult") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Children:
- items (Then, role: body)
Default block:
{
"kind": "vectorLocalSearch",
"storeAs": "searchResult",
"topK": 10
}
vectorLocalStats - Local Vector Store Stats
Return metadata about an open store: doc count, dims, model, index size. PREVIOUS = {docCount, dims, modelPath, storePath, indexSizeBytes}.
Params:
input
storePath(string, required, default"", resolve: variables+deep) - Directory for the local vector store (created if absent). Supports ${var}.
advanced
model(string, default"", resolve: variables+deep) - Path to GGUF embedding model. Empty = auto-discover (PM_EMBED_MODEL or dist/models/).threads(integer, 1-32, default4) - CPU threads for llama.cpp embedding inference.gpuLayers(integer, -1-999, default0) - GPU offload for embedding: 0 = CPU only, -1 = all layers on GPU, >0 = first N layers. Speeds up large ingests on CUDA/Metal/Vulkan builds.
output
storeAs(string, default"storeStats") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"kind": "vectorLocalStats",
"storeAs": "storeStats"
}
Video
pictureOut - Picture Out
Encode a frame handle (or pass-through image) to a file on disk. The exit from the in-memory filter pipeline. Stores the written path in PREVIOUS / storeAs.
Params:
input
input(image_path, from PREVIOUS, default"") - Frame handle (mem://...) from a previous filter, or an image path.outputPath(output_path, default"", constraints: writable+createParents) - Output file path (.jpg/.png/.bmp). Required.
advanced
quality(integer, 1-100, default90) - JPEG quality (1-100).
output
storeAs(string, default"imagePath") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"input": "",
"kind": "pictureOut",
"outputPath": "",
"quality": 90,
"storeAs": "imagePath"
}
videoCapture - Capture Image / Video
Capture a still image or record a camera, screen, or window source to MP4. Stores the output path in PREVIOUS / storeAs.
Params:
mode
action(enum, default"Still", enum: Still|Record|Start|Stop) - Still = one frame; Record = capture MP4 until duration/cancel; Start keeps recording under instance until Stop finalizes it.
input
input(video_input, default"") - Video source. Empty/default = preferred camera; camera name = webcam; screen/window specs use the screen picker.
recording
instance(string, default"") - Recording instance name for Start/Stop. Use the same name to stop and finalize the recording.fps(integer, 1-240, default30) - Recording frames per second for MP4 fallback capture.durationMs(duration_ms, 0-8.64e+07, default0) - Record action only: stop after this many ms. 0 = record until cancellation. Start ignores this and runs until Stop.
output_file
outputPath(output_path, default"", constraints: writable+createParents) - Output path (.jpg/.png for Still, .mp4 for Record/Start). Empty = auto temp file.
capture_options
includeCursor(boolean, defaulttrue) - Window fast recording: include the mouse cursor in the captured MP4 when supported.width(integer, 0-7680, default0) - Preferred width in pixels. 0 = device default.height(integer, 0-4320, default0) - Preferred height in pixels. 0 = device default.timeoutMs(duration_ms, 100-30000, default5000) - Max ms to wait for first frame.
output
storeAs(string, default"capturePath") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"action": "Still",
"device": "",
"durationMs": 0,
"fps": 30,
"height": 0,
"includeCursor": true,
"input": "",
"instance": "",
"kind": "videoCapture",
"outputPath": "",
"storeAs": "capturePath",
"timeoutMs": 5000,
"width": 0
}
videoColor - Color Adjust
Adjust brightness / contrast / saturation of a frame. Pipes a frame handle in/out.
Params:
input
input(image_path, from PREVIOUS, default"") - Frame handle (mem://...) from a previous filter, or an image path.
options
brightness(float, -1-1, default0.0) - Brightness offset. 0 = none; -1..1 maps to ±255.contrast(float, 0-3, default1.0) - Contrast multiplier around mid-gray. 1 = none.saturation(float, 0-3, default1.0) - Saturation. 1 = none; 0 = grayscale; >1 = more vivid.
advanced
outputPath(output_path, default"", constraints: writable+createParents) - Output file (.jpg/.png). Empty = keep in-memory (mem:// handle) for the next filter.
output
storeAs(string, default"imagePath") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"brightness": 0.0,
"contrast": 1.0,
"input": "",
"kind": "videoColor",
"outputPath": "",
"saturation": 1.0,
"storeAs": "imagePath"
}
videoCrop - Crop
Crop a rectangular region from a frame. Pipes a frame handle in/out.
Params:
input
input(image_path, from PREVIOUS, default"") - Frame handle (mem://...) from a previous filter, or an image path.
options
x(integer, 0-32768, default0) - Left edge (px).y(integer, 0-32768, default0) - Top edge (px).width(integer, 0-32768, default0) - Crop width (px). 0 = to right edge.height(integer, 0-32768, default0) - Crop height (px). 0 = to bottom edge.
advanced
outputPath(output_path, default"", constraints: writable+createParents) - Output file (.jpg/.png). Empty = keep in-memory (mem:// handle) for the next filter.
output
storeAs(string, default"imagePath") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"height": 0,
"input": "",
"kind": "videoCrop",
"outputPath": "",
"storeAs": "imagePath",
"width": 0,
"x": 0,
"y": 0
}
videoDetect - Detect Objects
Capture one frame (webcam or screen) and run a YOLO model. task = detect/obb/pose -> {boxes:[{x,y,w,h,conf,cls,label,angle?,keypoints?}]}; classify -> {classes:[{cls,score,label}]}. Stores {ok, image_w, image_h, infer_ms, task, ...} in PREVIOUS / storeAs.
Params:
source_model
model(file_path, required) - Path to a YOLO-format ONNX model (e.g. dist/models/yolov8n.onnx, yolo11n-obb.onnx, yolo11n-cls.onnx, yolo11n-pose.onnx).input(screen_input, default"") - Camera device name or screen spec ("screen:0", "screen:0:wintitle*"). Empty = default webcam.task(enum, default"auto", enum: auto|detect|classify|obb|pose|segment) - YOLO head to decode. auto = infer detect/classify/segment from the model; obb (oriented boxes) and pose (keypoints) must be selected explicitly. segment adds a mask polygon per box (contour, no OpenCV).
labels_filter
labels(file_path, default"") - Optional path to a YOLO labels YAML file. Overrides 'classes'. Defaults to built-in COCO-80.classes(string, default"") - Comma-separated class names (index -> label) for custom models. Ignored when 'labels' is set.filterClasses(string, default"") - Comma-separated class names to keep (case-insensitive). Empty = keep all detections.
thresholds
conf(float, 0-1, default0.25) - Confidence threshold (0-1). Default 0.25.nms(float, 0-1, default0.45) - IoU threshold for NMS (detect/obb/pose). Default 0.45.topK(integer, 1-100, default5) - classify task: number of top predictions to return. Default 5.
runtime
inputSize(integer, 0-4096, default0) - Model input size in pixels. 0 = derive from model metadata (detect 640, classify 224, obb 1024).threads(integer, 1-64, default4) - ONNX Runtime intra-op CPU thread count.provider(enum, default"gpu", enum: gpu|auto|cpu|cuda) - ONNX execution provider. gpu/cuda require CUDA and fail if unavailable; auto tries CUDA then falls back to CPU.gpuStats(boolean, defaultfalse) - Attach best-effort NVIDIA VRAM telemetry to the result when activeProvider is cuda.instance(string, default"") - Named cached instance: reuse the loaded model/session across loop passes. Empty = key by args. Released when the run ends (orxblox session stop).
visualization
visualize(boolean, defaultfalse) - Show a live detection window (Win32). screen:* -> transparent overlay over the captured region; otherwise a preview window. Persists across loop passes.visualizeMode(enum, default"auto", enum: auto|overlay|preview) - Window mode. auto = overlay for screen:* input, preview otherwise.visualizeStats(boolean, defaulttrue) - Show FPS / inference-time / class-count corner text in the window.visualizeLabels(boolean, defaulttrue) - Draw label + confidence above each box.
smoothing
smoothAlpha(float, 0-1, default0.35) - Temporal EMA factor for the overlay (0 = frozen, 1 = raw/no smoothing). Viz only.smoothAge(integer, 0-60, default4) - Frames a box persists in the overlay after it disappears (anti-flicker). Viz only.smoothMinHits(integer, 0-60, default0) - Frames a track must be seen before it is drawn (confirmation / "min age"; 0/1 = show at once). Suppresses one-frame ghosts. Viz only.
tracking
trackIds(boolean, defaultfalse) - Assign a stable track id per object; draw #id + a per-track color. Viz only.trackTwoStage(boolean, defaultfalse) - ByteTrack-style high/low association: match strong detections first, then recover lost tracks with leftover weak ones (fewer id switches). Viz only.trackConfHigh(float, 0-1, default0.5) - Confidence split for trackTwoStage (≥ = high pass, < = low recovery). Viz only.trackCenter(boolean, defaulttrue) - Center-distance fallback: match by nearest predicted center when IoU = 0 (recovers fast movers / large frame gaps). Viz only.trackCenterDist(float, 0-10, default1.2) - Center-distance gate as a multiple of the box mean side (w+h)/2. Larger tolerates bigger jumps. Viz only.trackVelBlend(float, 0-1, default0.7) - Velocity EMA for prediction during dropouts (higher = steadier but laggier). Viz only.
pose
kptMinScore(float, 0-1, default0.3) - Min pose keypoint score to update a joint; weaker joints freeze at their last good position (stops off-body snapping). Viz only.
output_recording
timeoutMs(duration_ms, 100-30000, default5000) - Webcam capture timeout in ms. Ignored for screen input.outputPath(output_path, default"", constraints: writable+createParents) - Optional path to write annotated output image (.jpg/.png). Works for webcam and screen input.recordPath(output_path, default"", constraints: writable+createParents) - Optional path to write an annotated burn-in video (.mp4, H.264). Across a --loop run, one file accumulates each captured+annotated frame; finalized when the run ends /xblox session stop. Win32 (Media Foundation).recordFps(integer, 1-240, default30) - Playback frame rate for the burn-in video (recordPath). Default 30.
output
storeAs(string, default"detections") - Variable to also store the result in (always sets PREVIOUS).
Features: container cancellable
Children:
- items (Then, role: body)
Default block:
{
"classes": "",
"conf": 0.25,
"filterClasses": "",
"gpuStats": false,
"input": "",
"inputSize": 0,
"instance": "",
"items": [],
"kind": "videoDetect",
"kptMinScore": 0.3,
"labels": "",
"model": "",
"nms": 0.45,
"outputPath": "",
"provider": "gpu",
"recordFps": 30,
"recordPath": "",
"smoothAge": 4,
"smoothAlpha": 0.35,
"smoothMinHits": 0,
"storeAs": "detections",
"task": "auto",
"threads": 4,
"timeoutMs": 5000,
"topK": 5,
"trackCenter": true,
"trackCenterDist": 1.2,
"trackConfHigh": 0.5,
"trackIds": false,
"trackTwoStage": false,
"trackVelBlend": 0.7,
"visualize": false,
"visualizeLabels": true,
"visualizeMode": "auto",
"visualizeStats": true
}
videoGrayscale - Grayscale
Convert a frame to grayscale (Rec.601 luma). Pipes a frame handle in/out.
Params:
input
input(image_path, from PREVIOUS, default"") - Frame handle (mem://...) from a previous filter, or an image path.
advanced
outputPath(output_path, default"", constraints: writable+createParents) - Output file (.jpg/.png). Empty = keep in-memory (mem:// handle) for the next filter.
output
storeAs(string, default"imagePath") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"input": "",
"kind": "videoGrayscale",
"outputPath": "",
"storeAs": "imagePath"
}
videoListDevices - Video Devices
List all available video capture (camera) devices.
Params:
storeAs(string, default"") - Variable to also store the result in (always sets PREVIOUS).
Features: non-blocking
Default block:
{
"kind": "videoListDevices",
"storeAs": "videoDevices"
}
videoListScreens - List Screens
Enumerate physical monitors and visible windows. Stores {monitors:[...], windows:[...]} in PREVIOUS / storeAs.
Params:
storeAs(string, default"screens") - Variable to also store the result in (always sets PREVIOUS).
Features: non-blocking
Default block:
{
"kind": "videoListScreens",
"storeAs": "screens"
}
videoModelControl - Unload Model
List or unload loaded local model instances for this xBlox process.
Params:
lifecycle
action(enum, default"List", enum: List|Unload) - List loaded models in this xBlox process, or unload one by key.key(string, default"") - Loaded model key to unload, e.g. llama:vlm, llama:text, vibevoice:tts, or an onnx:* key. Empty aliases use their group default.
output
storeAs(string, default"modelKey") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"action": "Unload",
"key": "",
"kind": "videoModelControl",
"storeAs": "modelKey"
}
videoResize - Resize
Resize / resample a frame (bilinear). A 0 dimension is derived from the other to keep aspect. Pipes a frame handle in/out.
Params:
input
input(image_path, from PREVIOUS, default"") - Frame handle (mem://...) from a previous filter, or an image path.
options
width(integer, 0-16384, default0) - Target width (px). 0 = keep aspect from height.height(integer, 0-16384, default0) - Target height (px). 0 = keep aspect from width.
advanced
outputPath(output_path, default"", constraints: writable+createParents) - Output file (.jpg/.png). Empty = keep in-memory (mem:// handle) for the next filter.
output
storeAs(string, default"imagePath") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"height": 0,
"input": "",
"kind": "videoResize",
"outputPath": "",
"storeAs": "imagePath",
"width": 0
}
videoScreenCapture - Screen Capture
Capture a single frame from a screen or window via GDI BitBlt. input: "screen:0", "screen:0:wintitle*". Stores output path in PREVIOUS / storeAs.
Params:
input
input(screen_input, default"screen:0") - Screen spec: "screen:N" (monitor) or "screen:N:wintitle=GLOB".
advanced
outputPath(output_path, default"", constraints: writable+createParents) - Output file path (.jpg/.png). Empty = auto temp file.
output
storeAs(string, default"imagePath") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"input": "screen:0",
"kind": "videoScreenCapture",
"outputPath": "",
"storeAs": "imagePath"
}
videoSource - Video Source
Pump frames from a webcam, screen/window, image, or video file. With child items it runs them once per frame (PREVIOUS = frame handle) - a flat pipe that transcodes a clip with no for/while and no storeAs. With no items it is a one-shot grabber emitting a handle/path in PREVIOUS / storeAs.
Params:
input
input(screen_input, default"") - Camera, screen/window spec, image, or video file. Empty = preferred camera. "screen:N[:wintitle=GLOB]" captures a screen/window; a video file (.mp4/.mov/.mkv/...) = decode every frame; an image (.png/.jpg/...) = one frame.
one_shot_output
emit(enum, default"both", enum: both|file|handle) - One-shot mode only (no child items): both = write file + cache frame; file = write only; handle = in-memory only (mem:// handle, no file).outputPath(output_path, default"", constraints: writable+createParents) - One-shot output file path (.jpg/.png) for emit=file/both. Empty = auto temp file.
pump_limits
frames(integer, 0-1e+06, default0) - Max frames to pump (0 = unbounded -> video files run to EOF; live sources run until durationMs/cancel). Use N for a fixed-length grab.durationMs(duration_ms, 0-8.64e+07, default0) - Live sources only: stop after this wall-clock budget (0 = no cap).progressEvery(integer, 0-100000, default60) - Pump mode: emit a progress event every N frames (child events are muted). 0 = only the final summary.
capture_options
fps(integer, 0-240, default0) - Preferred capture rate for live sources. 0 = source default.width(integer, 0-7680, default0) - Preferred width in pixels (live sources). 0 = source default.height(integer, 0-4320, default0) - Preferred height in pixels (live sources). 0 = source default.timeoutMs(duration_ms, 100-30000, default5000) - Max ms to wait for the first frame of a live source.
output
storeAs(string, default"imagePath") - Variable to also store the result in (always sets PREVIOUS).
Features: container cancellable
Children:
- items (Pipeline, role: body)
Default block:
{
"durationMs": 0,
"emit": "both",
"fps": 0,
"frames": 0,
"height": 0,
"input": "",
"items": [],
"kind": "videoSource",
"outputPath": "",
"progressEvery": 60,
"storeAs": "imagePath",
"timeoutMs": 5000,
"width": 0
}
videoStream - Remote Stream
Start, stop, or inspect a named remote video stream server for the mobile web remote. The current backend launches the same video stream server used by the CLI.
Params:
server_lifecycle
action(enum, default"Start", enum: Start|Stop|Status) - Start a named remote video stream server, Stop it, or report Status.instance(string, default"default") - Named stream instance. Use the same name for Stop/Status.open(boolean, defaultfalse) - Ask the stream server to open the local browser after starting.
input
input(screen_input, default"screen:0") - Camera or screen/window source for Start. Examples: screen:0, screen:0:hwnd=..., screen:0:wintitle=...:rrect=x,y,w,h.
network
bind(string, default"0.0.0.0") - Network interface to listen on. 0.0.0.0 allows LAN/mobile access; 127.0.0.1 is local only.port(integer, 1-65535, default8787) - TCP port for the stream server. Use a fixed port so Status can report a stable URL.
quality
fps(integer, 1-240, default30) - Target capture frame rate.bitrateKbps(integer, 1-100000, default8000) - Future WebRTC/video encoder bitrate hint.mjpegQuality(integer, 1-100, default85) - JPEG quality for the MJPEG fallback preview.encoder(string, default"auto") - Future encoder selector.
capture_options
includeCursor(boolean, defaulttrue) - Include the cursor in screen capture when supported.
access
token(string, default"") - Remote access token. Empty generates one for Start.
output
storeAs(string, default"stream") - Variable to also store the result in (always sets PREVIOUS).
Features: cancellable
Default block:
{
"action": "Start",
"bind": "0.0.0.0",
"bitrateKbps": 8000,
"encoder": "auto",
"fps": 30,
"includeCursor": true,
"input": "screen:0",
"instance": "default",
"kind": "videoStream",
"mjpegQuality": 85,
"open": false,
"port": 8787,
"storeAs": "stream",
"token": ""
}
videoWriter - Video Writer
Append a frame (handle or image path) to an .mp4. Stateful across loop iterations - drive it from a for/while loop or --loop run to build a video. Finalized when the run ends. Stores the output path in PREVIOUS / storeAs.
Params:
input
input(image_path, from PREVIOUS, default"") - Frame handle (mem://...) from a previous filter, or an image path.outputPath(output_path, default"", constraints: writable+createParents) - Output video path (.mp4). Required.
options
fps(integer, 0-240, default0) - Output frame rate. 0 = follow the source (videoSource's detected fps; 30 if unknown). Set a value to force constant-rate output.
advanced
instance(string, default"") - Optional writer id. Empty = keyed by output path. Use distinct ids for parallel writers.
output
storeAs(string, default"videoPath") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"fps": 0,
"input": "",
"instance": "",
"kind": "videoWriter",
"outputPath": "",
"storeAs": "videoPath"
}
Vision
visionAsk - Vision Ask
Ask a local MiniCPM-style VLM about one or more images.
Params:
input
input(image_path, from PREVIOUS, default"", resolve: variables+globs) - Image path, glob, or PREVIOUS. Glob arrays are passed as multiple images.
source_model
frames(json_value, default[]) - Additional image paths for multi-frame or comparison prompts.model(string, default"", resolve: variables+deep) - Local vision VLM model id/path. Empty = prefer MiniCPM-V from downloaded models.slot(enum, default"vision", enum: vision|image|video) - Local model catalog slot used for auto-selection.
prompt
prompt(prompt, default"Describe what you see in detail.") - Question or instruction for the vision model.
output
json(boolean, defaulttrue) - When true, result is structured JSON; when false, result is only generated text.includeRaw(boolean, defaultfalse) - Include rawText in JSON output for debugging before normalizers were applied.result(json_value) - Structured vision response when json=true.storeAs(string, default"vision") - Variable to also store the result in (always sets PREVIOUS).
output_normalization
normalizers(flags, default15) - Post-process generated text for common model-output artifacts.1Strip thinking - Remove reasoning sections such as... , including unclosed sections.2Strip fences - Unwrap a single outer Markdown/code fence around the whole answer.4Strip role labels - Remove common leading/trailing assistant role or template markers.8Trim output - Trim leading and trailing whitespace after other normalizers.
runtime
threads(integer, 1-64, default8) - CPU thread count for llama.cpp.gpuLayers(integer, -1-999, default-1) - GPU layers to offload. -1 = all available, 0 = CPU-only.ctx(integer, 1024-65536, default4096) - Context size. Use 8192+ for multi-frame prompts.maxTokens(integer, 1-8192, default512) - Maximum generated tokens.
Features: background cancellable
Children:
- items (Then, role: body)
Default block:
{
"ctx": 4096,
"frames": [],
"gpuLayers": -1,
"includeRaw": false,
"input": "",
"items": [],
"json": true,
"kind": "visionAsk",
"maxTokens": 512,
"model": "",
"normalizers": 15,
"prompt": "Describe what you see in detail.",
"slot": "vision",
"storeAs": "vision",
"threads": 8
}
visionModelControl - Unload Model
List or unload loaded local model instances for this xBlox process.
Params:
lifecycle
action(enum, default"List", enum: List|Unload) - List loaded models in this xBlox process, or unload one by key.key(string, default"llama:vlm") - Loaded model key to unload, e.g. llama:vlm, llama:text, vibevoice:tts, or an onnx:* key. Empty aliases use their group default.
output
storeAs(string, default"modelKey") - Variable to also store the result in (always sets PREVIOUS).
Default block:
{
"action": "Unload",
"key": "llama:vlm",
"kind": "visionModelControl",
"storeAs": "modelKey"
}
Supported Custom Commands
| Exact ID | Label | Action | Pre-configured Args |
|---|---|---|---|
group-assistant-bar |
Assistant Bar | metadata |
|
custom.assistant.realtime |
Live Voice | cli:llm |
agent --realtime |
custom.assistant.chat |
Chat | external |
--ui-preset chat |
custom.command-mq6okpfh-b145b |
Home | app:showhome |
|
custom.command-mpx9r1ur-8c6df |
Assistant | app:togglerealtime |
|
custom.command-mpxytlpz-bcde4 |
Launcher | app:togglelauncher |
|
custom.command-mpxzk7g4-67590 |
Voice Recorder | cli:audio |
record --dst ${KNOWNFOLDER}/last_mic.wav --text-out ${KNOWNFOLDER}/mic_last.md |
custom.command-mpxzlwc6-459a8 |
Video Recorder | cli:video |
record --dst C:\Users\zx\Desktop\1.mp4 |
custom.command-mpxzouxv-ab189 |
Screenshot | app:takescreenshot |
|
custom.command-mpx904lh-7da31 |
Explorer | external |
${CURRENT_FILE} |
custom.command-mq3i85bj-db474 |
Share | cli:service |
files upload ${CURRENT_FILE} |
custom.command-mq4800xa-1c3c9 |
xblox-detect | cli:xblox |
run --src C:\Users\zx\Desktop\pixlwiz\pixlwiz\tests\xblox\agent-args.xblox --type 2 --x 0 --ctx ${CURRENT_PATH} |
custom.command-mppft700-137e9 |
Planner Prompt | app:edit |
|
custom.command-mqauenwv-74ac8 |
Mic-Journal | cli:xblox |
run --src C:\Users\zx\Desktop\pixlwiz\pixlwiz\tests\xblox\stt-journal-ex.xblox --CURRENT_FILE ${CURRENT_FILE} |
custom.command-7049c0e7-674fe |
Play in VLC | external |
${CURRENT_FILE} |
custom.command-712fbd00-f9ac4 |
Product Shot | cli:transform |
--prompt render this as product shooting, white background, studio --json --reference ${CURRENT_FILE} |
custom.command-mpch9gdx-44982 |
AI:Illustration | cli:transform |
--src ${CURRENT_FILE} --prompt as technical illustration --provider replicate --model google/gemini-2.5-flash --job-ui |
custom.command-mq97rchy-5fcbf |
IllustrationX | cli:xblox |
run --src C:\Users\zx\Desktop\pixlwiz\pixlwiz\tests\xblox\image-pipe-blocks.xblox --CURRENT_FILE ${CURRENT_FILE} |
custom.command-mq9a0i3l-576f4 |
OCR - MD | cli:xblox |
run --src C:\Users\zx\Desktop\pixlwiz\pixlwiz\tests\xblox\ocr-pipe.xblox --CURRENT_FILE ${CURRENT_FILE} |
custom.command-mq9azo3w-5b894 |
OCR - CSV | cli:xblox |
run --src C:\Users\zx\Desktop\pixlwiz\pixlwiz\tests\xblox\ocr-pipe-csv.xblox --CURRENT_FILE ${CURRENT_FILE} |
custom.command-mq9b2upm-93cf4 |
Vision - CSV | cli:xblox |
run --src C:\Users\zx\Desktop\pixlwiz\pixlwiz\tests\xblox\vision-pipe.xblox --CURRENT_FILE ${CURRENT_FILE} |
custom.command-mqj3feqz-72a1a |
Resize -HD | cli:resize |
run --CURRENT_FILE ${CURRENT_FILE} --max-width 800 --src ${CURRENT_SELECTION} --format jpg --cache-dir ${ENV}/cache/images --dst ${SRC_DIR}/${SRC_NAME}_hd.jpg |
custom.command-mpohmxea-c64a1 |
Agent | metadata |
|
custom.command-mpi5stmy-8e9cb |
Assistant | cli:assistant |
|
custom.command-mpvpg0b7-81457 |
RT-Agent-On | app:realtimestart |
|
custom.command-mpvps7tt-3f40f |
RT-Agent-Off | app:realtimestop |
|
custom.command-mpohnfaf-26b0c |
TTS | app:setVariable |
|
custom.command-mpokt0hv-41237 |
Agent Type Funny | app:setVariable |
|
custom.command-mpokxo4w-0910a |
Agent Type Serious | app:setVariable |
|
custom.capture |
Capture | metadata |
|
custom.capture.screenshot |
Take screenshot | app:takescreenshot |
|
custom.command-mpx9ka63-c756f |
Picker | cli:assistant |
pick ${KNOWNFOLDER} |
custom.command-mpi5b1hw-8bdc2 |
browse | ribbon:appSettings |
|
custom.mic-start |
Mic Capture Start | cli:audio |
record --text-out ${KNOWNFOLDER}/last.md |
custom.mic-stop |
Mic Capture Stop | cli:audio |
record stop |
custom.video-start |
Video Capture Start | cli:video |
record --dst ${KNOWNFOLDER}/capture.avi |
custom.video-stop |
Video Capture Stop | cli:video |
record stop |
custom.video-status |
Video Capture Status | cli:video |
record status |
custom.tools |
Tools | metadata |
|
custom.tools.theme |
Toggle theme | ribbon:theme |
|
custom.tools.resetLayout |
Reset layout | ribbon:resetLayout |
|
custom.command-70c82b28-65412 |
Open in VSCode | external |
|
undefined-mpq42hgj-93f53 |
Open in Cursor(copy) | external |
|
custom.dropdown-mpqpdwuo-1affa |
Tests | metadata |
|
custom.command-75e6fd77-7c119 |
Open | external |
${CURRENT_FILE} |
custom.command-7122e2c3-65657 |
Render to STL | external |
-o ${CURRENT_PATH}${PATH_SEP}${SRC_NAME}.stl ${CURRENT_FILE} |
custom.command-7124c298-24a2a |
Open in FreeCAD | external |
${CURRENT_FILE} |
custom.command-70e693c3-290ff |
Open in Explorer | external |
/select ${CURRENT_FILE} |
custom.command-mpcmqepq-ee6f3 |
AI:Images List | cli:llm |
agent --prompt create directory listing, for images, in images.md |
custom.command-mpy7w3px-8a1e0 |
Log | app:togglelog |
|
custom.command-mqkxsx6y-56346 |
Center | app:togglecenterview |
|
custom.command-mpy7z14t-bcef8 |
Queue | app:togglequeue |
|
custom.command-mqkneqp7-3fcb0 |
Console | app:toggleconsole |
|
custom.command-mqj3lo3h-fed59 |
Register Explorer | cli:register-explorer |
|
custom.command-mqj4ixcu-3a87a |
Unregister Explorer (copy) | cli:register-explorer |
--unregister |
custom.command-70eabea6-957e6 |
Translate to Spanish | cli:llm |
agent --embed ${CURRENT_FILE} --prompt Translate to Spanish --no-mcp --preset quick --no-planner --no-tools --no-parallel-tools --dst ${SRC_DIR}/${SRC_NAME}_ex.${SRC_EXT} |