Skip to content

Action Reference ​

This reference is generated from Echo's frontend editor catalogue and Rust workflow engine. Editor labels and configuration are reconciled with executable behavior before publication.

Editor actions ​

Core ​

LLM Prompt ​

Runs an LLM prompt with the configured provider profile and publishes the returned text. It does not promise a fixed model.

Execution status: production_registered Fields: Custom Name (optional), Instructions Prompt (optional), Temperature (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{llm_result}} (string) Permission: None Runtime confirmation: No

Example: Summarize {{file_content}} in three bullet points, then use {{llm_result}} in a later step.


Paste ​

Interpolates the text, copies it to the system clipboard, then simulates the platform paste shortcut in the active app. Paste as a single line replaces line breaks with spaces first. In the macOS App Store build, the paste simulation is a no-op when Accessibility is unavailable.

Execution status: production_registered Fields: Custom Name (optional), Content to paste (required), Paste as a single line (optional) Control inputs: mainControl outputs: mainData output: None Permission: None Runtime confirmation: No

Example: Paste {{llm_result}} into the active document; enable single-line mode before pasting a multi-line value into a terminal.


Copy to clipboard ​

Put a string on the system clipboard. Supports {{variable}} interpolation.

Execution status: production_registered Fields: Custom Name (optional), Text to copy (required) Control inputs: mainControl outputs: mainData output: None Permission: clipboardwrite / low Runtime confirmation: No

Example: Copy {{formatted}} to the clipboard so the user can paste it manually at any time.


Keystroke ​

Simulate a key combination in the active app (e.g. cmd+s, enter, tab, escape). Keystroke simulation is a no-op in the macOS App Store build.

Execution status: production_registered Fields: Custom Name (optional), Press key stroke (required) Control inputs: mainControl outputs: mainData output: None Permission: inputsynthesis / medium Runtime confirmation: No

Example: Press cmd+s after a Paste step to save the document automatically.


Shell ​

Runs a shell command with the configured timeout and returns captured standard output without trimming it.

Execution status: production_registered Fields: Custom Name (optional), Shell Command (required), Timeout (seconds) (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{shell_out}} (string) Permission: shell / critical Runtime confirmation: Yes

Example: git log --oneline -10 → {{shell_out}} contains the last 10 commit messages.


Delay ​

Wait a fixed number of milliseconds before continuing. Useful between Keystroke steps when an app needs time to react.

Execution status: production_registered Fields: Custom Name (optional), Delay (milliseconds) (required) Control inputs: mainControl outputs: mainData output: None Permission: None Runtime confirmation: No

Example: Wait 300 ms after pressing cmd+t to ensure a new browser tab has opened before typing into it.


Set Variable ​

Interpolate literal text and {{expressions}}, then store the resulting string under the configured variable name.

Execution status: production_registered Fields: Custom Name (optional), Variable Name (required), Value (required) Control inputs: mainControl outputs: mainData output: {{value}} (string) Permission: None Runtime confirmation: No

Example: Store {{cleaned}}\n\n---\n\n{{summary}} as final_report.


Open App ​

Launch an application by its configured name using the platform launcher. On macOS, Echo resolves close or partial names against installed applications; application paths are not supported.

Execution status: production_registered Fields: Custom Name (optional), App path or name (required) Control inputs: mainControl outputs: mainData output: None Permission: shell / critical Runtime confirmation: Yes

Example: Open TextEdit before a Paste step.


Switch to App ​

Brings a running application to the foreground. When Launch if not running is enabled, it launches the application if activation does not find a running process. This action is a no-op in the macOS App Store build.

Execution status: production_registered Fields: Custom Name (optional), App name (required), Launch if not running (optional) Control inputs: mainControl outputs: mainData output: None Permission: appcontrol / medium Runtime confirmation: No

Example: Switch to Slack; disable Launch if not running when the workflow must only focus an existing process.


Run Workflow ​

Call another workflow as a sub-step and capture its output. Useful for composing big pipelines from small, reusable pieces.

Execution status: runtime_registered Fields: Custom Name (optional), Target Workflow (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{workflow_result}} (object) Permission: None Runtime confirmation: No

Example: Run a "Clean Grammar" sub-workflow on your transcription, then pass {{workflow_result}} to a Write File step.

File System ​

Read File ​

Read the entire contents of a file at a given path. The path supports {{variable}} interpolation.

Execution status: production_registered Fields: Custom Name (optional), File Path (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{file_content}} (string) Permission: fileread / medium Runtime confirmation: No

Example: /tmp/meeting-{{datetime}}.md → {{file_content}} contains the file text.


Write File ​

Write a string to a file, creating the file if it does not exist and overwriting it if it does. Path and content both support {{variable}} interpolation.

Execution status: production_registered Fields: Custom Name (optional), File Path (required), Content (required) Control inputs: mainControl outputs: mainData output: None Permission: filewrite / medium Runtime confirmation: No

Example: Write {{llm_result}} to /tmp/budgie/summary.md; missing parent directories are created.


Append to File ​

Append a string to the end of an existing file. Creates the file if it does not exist.

Execution status: production_registered Fields: Custom Name (optional), File Path (required), Content (required) Control inputs: mainControl outputs: mainData output: None Permission: filewrite / medium Runtime confirmation: No

Example: Append {{llm_result}}\n to /tmp/echo-runs.log. The parent directory must already exist.


List Files ​

List direct entries in a directory. The Glob Filter currently performs a filename substring check after trimming leading and trailing *; it is not a full glob implementation.

Execution status: production_registered Fields: Custom Name (optional), Directory (required), Glob Filter (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{file_list}} (array) Permission: fileread / medium Runtime confirmation: No

Example: Directory /tmp/reports with filter *.md returns entries whose names contain .md.


Move File ​

Move (rename) a file from one path to another.

Execution status: production_registered Fields: Custom Name (optional), Source Path (required), Destination Path (required) Control inputs: mainControl outputs: mainData output: None Permission: filewrite / medium Runtime confirmation: No

Example: Archive a processed file by moving it from /tmp/inbox/report.pdf to /tmp/archive/report.pdf.


Copy File ​

Duplicate a file to a new path.

Execution status: production_registered Fields: Custom Name (optional), Source Path (required), Destination Path (required) Control inputs: mainControl outputs: mainData output: None Permission: filewrite / medium Runtime confirmation: No

Example: Back up a config file before modifying it in a later step.


Delete File ​

Deletes the file at the specified path. Review the generated permission and runtime-confirmation lines before using it.

Execution status: production_registered Fields: Custom Name (optional), File Path (required) Control inputs: mainControl outputs: mainData output: None Permission: filedelete / high Runtime confirmation: Yes

Example: Delete /tmp/budgie-doc-contract.txt after the workflow no longer needs it.


File Exists ​

Check whether a file or directory exists at the given path. Feed the result into an If/Else step.

Execution status: production_registered Fields: Custom Name (optional), File Path (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{file_exists}} (boolean) Permission: fileread / medium Runtime confirmation: No

Example: /tmp/report.md → {{file_exists}} is true or false.


Get File Info ​

Return size, is_file, is_dir, readonly, name, extension, and, when available, modified_secs as integer seconds since the Unix epoch.

Execution status: production_registered Fields: Custom Name (optional), File Path (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{file_info}} (object) Permission: fileread / medium Runtime confirmation: No

Example: {{file_info}} includes values such as name: report.md, size: 4096, is_file: true, and modified_secs: 1780477200.


Create Directory ​

Create a directory (and all intermediate directories) at the given path. Does nothing if the directory already exists.

Execution status: production_registered Fields: Custom Name (optional), File Path (required) Control inputs: mainControl outputs: mainData output: None Permission: filewrite / medium Runtime confirmation: No

Example: Ensure /tmp/exports/{{datetime}}/ and any missing parent directories exist before writing files.

Text ​

Find & Replace ​

Replace all literal or regex matches in an input string. The current editor exposes find, replacement, and regex mode but no input field.

Execution status: production_registered Fields: Custom Name (optional), Find (required), Replace (optional), Use regex (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{replaced}} (string) Permission: None Runtime confirmation: No

Example: The runtime can replace every TODO: in an input string, but the current editor cannot configure that input.


Regex Extract ​

Return an array containing the selected capture group from every regex match. Group 0 returns each whole match. The current editor does not expose the input string.

Execution status: production_registered Fields: Custom Name (optional), Pattern (required), Capture Group (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{match}} (array) Permission: None Runtime confirmation: No

Example: The runtime can apply (PROJ-\d+) with group 1, but the current editor cannot configure the text to search.


Split ​

Split a string using the runtime delimiter and return an array. The current editor exposes the input value but no delimiter field, so editor-created steps serialize an empty delimiter.

Execution status: production_registered Fields: Custom Name (optional), Value (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{parts}} (array) Permission: None Runtime confirmation: No

Example: Use this action only where the workflow definition supplies a delimiter; the current editor cannot configure one.


Join ​

Join the values from a named array variable using the runtime delimiter. The current editor exposes only a generic value and does not expose a delimiter control.

Execution status: production_registered Fields: Custom Name (optional), Value (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{joined}} (string) Permission: None Runtime confirmation: No

Example: Use this action only where the workflow definition supplies the array variable and delimiter; the current editor cannot fully configure it.


Trim ​

Remove leading and trailing whitespace from a string.

Execution status: production_registered Fields: Custom Name (optional), Value (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{trimmed}} (string) Permission: None Runtime confirmation: No

Example: Trim {{shell_out}} to remove the trailing newline from a shell command's output.


Case Transform ​

Transform a string to upper case, lower case, title case, camel case, or snake case. The current editor exposes the mode but no input field.

Execution status: production_registered Fields: Custom Name (optional), Transform Mode (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{cased}} (string) Permission: None Runtime confirmation: No

Example: The runtime can transform report name to reportName in camel mode, but the current editor cannot configure the input.


Substring ​

Extract characters from a zero-based start index up to an optional end index. The current editor does not expose either index and serializes start 0 with no end.

Execution status: production_registered Fields: Custom Name (optional), Value (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{slice}} (string) Permission: None Runtime confirmation: No

Example: An editor-created step currently returns the full input because its start and end indices cannot be configured.


Contains ​

Check for a case-sensitive literal substring; regular expressions are not supported. The current editor does not expose the substring field and serializes an empty needle.

Execution status: production_registered Fields: Custom Name (optional), Value (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{contains}} (boolean) Permission: None Runtime confirmation: No

Example: Use this action only where the workflow definition supplies the literal needle; the current editor cannot configure it.


Word Count ​

Count the number of words in a string.

Execution status: production_registered Fields: Custom Name (optional), Value (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{word_count}} (number) Permission: None Runtime confirmation: No

Example: Gate a summary step on {{word_count}} > 50 using an If/Else block.


URL Encode ​

Percent-encode a string for a URL query parameter. The runtime can also decode, but the current editor exposes no mode and always serializes encode mode.

Execution status: production_registered Fields: Custom Name (optional), Value (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{encoded}} (string) Permission: None Runtime confirmation: No

Example: {{search_term}} → "hello%20world".


Base64 ​

Encode a string using Base64. The runtime can also decode, but the current editor exposes no mode and always serializes encode mode.

Execution status: production_registered Fields: Custom Name (optional), Value (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{b64}} (string) Permission: None Runtime confirmation: No

Example: Encode hello to aGVsbG8=.


Strip HTML ​

Remove all HTML tags from a string, leaving only the text content.

Execution status: production_registered Fields: Custom Name (optional), Value (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{plain}} (string) Permission: None Runtime confirmation: No

Example: Strip the HTML from a pasted web snippet before feeding it to LLM Prompt.


Scribe Cleanup ​

Clean up a transcript with BudgieScribe, the on-device model that removes fillers and false starts and restores punctuation. Leave the language blank to detect it on the text, or force fr/en. When the model for that language is not installed, Scribe is busy, or its guard rejects the result, the text passes through unchanged.

Execution status: production_registered Fields: Custom Name (optional), Text to clean up (required), Language (blank = detect) (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{cleaned}} (string) Permission: None Runtime confirmation: No

Example: Run {{transcription}} through Scribe Cleanup before an LLM prompt so the prompt reads a clean sentence instead of raw dictation.


Format Template ​

Interpolate Budgie {{expressions}} in a template string; this is not a Handlebars or Mustache renderer.

Execution status: production_registered Fields: Custom Name (optional), Template (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{formatted}} (string) Permission: None Runtime confirmation: No

Example: Template: Dear {{name}},\nYour order {{order_id}} has shipped. → personalised email body.

System ​

Get Clipboard ​

Read the system clipboard contents as a string at the moment the step runs.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{clipboard}} (string) Permission: clipboardread / low Runtime confirmation: No

Example: Use after a Keystroke cmd+c step to read whatever the user just copied.


List Running Apps ​

Returns the distinct process names reported by the operating system for currently running processes.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{apps}} (array) Permission: None Runtime confirmation: No

Example: Check whether Safari appears in {{apps}} before continuing.


Active Window ​

On macOS, return an object shaped as {app} with the frontmost application process name; it does not include a window title. Other platforms currently return an empty app string.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{window}} (object) Permission: None Runtime confirmation: No

Example: {{window}} can contain {"app":"Mail"} when Mail is frontmost.


Date / Time ​

Format the current local date and time with a chrono format string. The default is %Y-%m-%dT%H:%M:%S.

Execution status: production_registered Fields: Custom Name (optional), Format (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{datetime}} (string) Permission: None Runtime confirmation: No

Example: {{datetime}} → "2026-06-03T09:42:00" — use as a file name timestamp.


Get Env Variable ​

Read an environment variable by name, returning an empty string when it is absent.

Execution status: production_registered Fields: Custom Name (optional), Variable Name (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{env_value}} (string) Permission: envread / low Runtime confirmation: No

Example: Read HOME, then build a path such as {{env_value}}/Documents/example.md.


System Info ​

Return an object with os, hostname, cpu_count, total_memory_mb, and used_memory_mb.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{system_info}} (object) Permission: None Runtime confirmation: No

Example: Include {{system_info}} in a bug report workflow to attach context automatically.


Screenshot ​

Captures the current display to a PNG path on macOS. Any serialized region is ignored, and the editor does not expose region or output-path controls.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{screenshot_path}} (string) Permission: screencapture / medium Runtime confirmation: No

Example: Capture the current display and pass {{screenshot_path}} to a later step.


Check App Running ​

Check whether any running process name contains the configured text, case-insensitively.

Execution status: production_registered Fields: Custom Name (optional), App Name (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{app_running}} (boolean) Permission: appcontrol / medium Runtime confirmation: No

Example: Safari → {{app_running}} is true when a matching process is present.

App Control ​

Quit App ​

On macOS, ask an application to quit through AppleScript. On other supported platforms, terminate processes whose names contain the configured text.

Execution status: production_registered Fields: Custom Name (optional), App Name (required) Control inputs: mainControl outputs: mainData output: None Permission: appcontrol / medium Runtime confirmation: No

Example: Quit TextEdit after saving the file in a previous step.


Run AppleScript ​

On macOS, execute an interpolated AppleScript and return trimmed standard output as a string. Other platforms report an unsupported-platform error.

Execution status: production_registered Fields: Custom Name (optional), AppleScript (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{script_result}} (string) Permission: applescript / critical Runtime confirmation: Yes

Example:

applescript
tell application "Finder" to get name of front window

→ {{script_result}} is the name of the front Finder window.


Run Shortcut ​

On macOS, run a named Shortcut and publish its trimmed standard output. Other platforms report an unsupported-platform error.

Execution status: production_registered Fields: Custom Name (optional), Shortcut Name (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{shortcut_result}} (string) Permission: macosshortcut / high Runtime confirmation: Yes

Example: Run the “Send to Notes” shortcut, then use {{shortcut_result}} in the next step.

Network ​

HTTP Request ​

Send GET, POST, PUT, DELETE, or PATCH with an interpolated URL and optional body. The current editor exposes URL, method, and body only; it cannot configure request headers.

Execution status: production_registered Fields: Custom Name (optional), URL (required), Method (required), Request Body (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{http_response}} (object) Permission: network / medium Runtime confirmation: No

Example: POST {{llm_result}} to a webhook, then read {{http_response.status}}, {{http_response.body}}, or parsed {{http_response.json}}.


Download File ​

Downloads a URL to the configured local path. This action does not publish a data-output variable.

Execution status: production_registered Fields: Custom Name (optional), URL (required), Save To Path (required) Control inputs: mainControl outputs: mainData output: None Permission: filewrite / high Runtime confirmation: Yes

Example: Download https://example.com/report.pdf to /tmp/downloads/example.pdf; missing parent directories are created.


Check URL ​

Perform a HEAD request and return true when a response is received, regardless of HTTP status; transport errors return false.

Execution status: production_registered Fields: Custom Name (optional), URL (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{url_ok}} (boolean) Permission: network / medium Runtime confirmation: No

Example: Use {{url_ok}} to detect transport failures before a download; an HTTP error response such as 404 still produces true.

Math & Data ​

Math Expression ​

Evaluate a mathematical expression. Supports the standard arithmetic operators, parentheses, and {{variable}} values.

Execution status: production_registered Fields: Custom Name (optional), Expression (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{math_result}} (number) Permission: None Runtime confirmation: No

Example: ({{word_count}} / 250) * 60 → estimated reading time in seconds → {{math_result}}.


JSON Parse ​

Parse a JSON string into a structured value. Use dot notation to access fields in later steps: {{json_obj.name}}.

Execution status: production_registered Fields: Custom Name (optional), JSON Input (required), Output Variable (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{json_obj}} (any) Permission: None Runtime confirmation: No

Example: Parse {{http_response.body}}, then access a field such as {{json_obj.data[0].id}}.


JSON Stringify ​

Serialize a named workflow variable as JSON. The current editor exposes no input-variable or pretty-print control, so editor-created steps serialize an empty variable name in compact mode.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{json_str}} (string) Permission: None Runtime confirmation: No

Example: Use this action only where the workflow definition supplies the input variable; the current editor cannot configure it.


CSV Parse ​

Parse a CSV string (with header row) into an array of objects keyed by column name.

Execution status: production_registered Fields: Custom Name (optional), Value (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{csv_rows}} (array) Permission: None Runtime confirmation: No

Example: Parse {{file_content}} from a CSV file → {{csv_rows[0].email}} is the first row's email column.


Get Variable ​

Read a workflow-context variable by its exact configured name. Returns null when that name is absent.

Execution status: production_registered Fields: Custom Name (optional), Variable Name (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{var_value}} (any) Permission: None Runtime confirmation: No

Example: Variable name summary returns the current summary value.

Arrays ​

Create Array ​

Create an array from the runtime items list. The current editor exposes no items field, so editor-created steps produce an empty array.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{array}} (array) Permission: None Runtime confirmation: No

Example: An editor-created Create Array step publishes [] to its output variable.


Append to Array ​

Append one value to a named array variable, write the new array back, and return it. The current editor exposes the value but not the target array name.

Execution status: production_registered Fields: Custom Name (optional), Value (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{array}} (array) Permission: None Runtime confirmation: No

Example: The runtime can append the literal item done to summaries, but the current editor cannot configure summaries as the target.


Get By Index ​

Return an element from a named array using a zero-based index; negative indices count from the end. The current editor exposes neither the array name nor index.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{item}} (any) Permission: None Runtime confirmation: No

Example: The runtime can return index 0 from file_list, but the current editor cannot configure those parameters.


Filter Array ​

Filter a named array with a condition evaluated for each item/it. The current editor exposes neither the array name nor condition.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{filtered}} (array) Permission: None Runtime confirmation: No

Example: This action requires a workflow definition that supplies both array_var and condition; the current editor cannot configure them.


Map Array ​

Interpolate a template for each item/it in a named array and return the resulting strings. The current editor exposes neither the array name nor template.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{mapped}} (array) Permission: None Runtime confirmation: No

Example: This action requires a workflow definition that supplies both array_var and template; the current editor cannot configure them.


Sort Array ​

Sort a named array by each value's string representation and write it back. The runtime supports ascending or descending order; the current editor exposes neither setting.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{sorted}} (array) Permission: None Runtime confirmation: No

Example: The runtime can sort file_list, but the current editor cannot configure the target array or direction.


Unique ​

Remove duplicate string representations from a named array while preserving first occurrences. The current editor does not expose the array name.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{unique}} (array) Permission: None Runtime confirmation: No

Example: The runtime can deduplicate tags, but the current editor cannot configure that target.


Array Length ​

Return the number of elements in a named array. The current editor does not expose the array name.

Execution status: production_registered Fields: Custom Name (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{length}} (number) Permission: None Runtime confirmation: No

Example: The runtime can count file_list, but the current editor cannot configure that target.


Array Contains ​

Compare string representations to check whether a named array includes a value. The current editor exposes the value but not the array name.

Execution status: production_registered Fields: Custom Name (optional), Value (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{contains}} (boolean) Permission: None Runtime confirmation: No

Example: The runtime can test whether apps contains Safari, but the current editor cannot configure apps as the target.

Persistence ​

Read from Store ​

Read the string associated with a key from the persistent store. Returns null when the key does not exist.

Execution status: production_registered Fields: Custom Name (optional), Key (required), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{store_value}} (any) Permission: None Runtime confirmation: No

Example: Key: "daily_count" → {{store_value}} is the stored count, or null when absent.


Write to Store ​

Interpolate and write a string to the persistent store under a key, creating or overwriting the entry.

Execution status: production_registered Fields: Custom Name (optional), Key (required), Value (required) Control inputs: mainControl outputs: mainData output: None Permission: persistence / low Runtime confirmation: No

Example: After incrementing: write {{math_result}} to key "daily_count".


Delete from Store ​

Remove a key from the persistent store.

Execution status: production_registered Fields: Custom Name (optional), Key (required) Control inputs: mainControl outputs: mainData output: None Permission: persistence / low Runtime confirmation: No

Example: Reset the "daily_count" key at the start of each day using a Date/Time + If/Else guard.

UI ​

Show Dialog ​

On macOS, display a modal dialog with title, message, and a text input, then return the entered text after OK. Outside macOS, the current handler logs the dialog and returns OK.

Execution status: production_registered Fields: Custom Name (optional), Title (optional), Message (required), Predefined Options (optional), Output Variable Name (optional) Control inputs: mainControl outputs: mainData output: {{dialog_input}} (string) Permission: None Runtime confirmation: No

Example: Prompt the user: "What subject line should I use?" → {{dialog_input}} feeds into an LLM Prompt step.


Notification ​

Display a macOS system notification with a title and message without waiting. Outside macOS, the current handler only logs it.

Execution status: production_registered Fields: Custom Name (optional), Title (optional), Message (required) Control inputs: mainControl outputs: mainData output: None Permission: None Runtime confirmation: No

Example: Notify "Workflow complete — file saved to Desktop" after a Write File step.


Play Sound ​

On macOS, treat the editor's Sound File Path value as a system sound name and play /System/Library/Sounds/{name}.aiff; arbitrary file paths are not supported. Outside macOS, the handler is a no-op.

Execution status: production_registered Fields: Custom Name (optional), Sound File Path (optional) Control inputs: mainControl outputs: mainData output: None Permission: None Runtime confirmation: No

Example: Use Glass to play /System/Library/Sounds/Glass.aiff after a long-running step.


Text to Speech ​

Speak interpolated text through the TTS engine selected in Settings. The default engine is Echo's native system TTS provider on macOS and Windows and does not require a downloaded Echo voice model; the optional local neural engine is never chosen implicitly and speaks only when it is selected explicitly in Settings and its model is installed. An empty voice uses the configured default; a provider-qualified voice override is validated by the provider.

Execution status: production_registered Fields: Custom Name (optional), Text to Speak (required), Voice (optional) Control inputs: mainControl outputs: mainData output: None Permission: None Runtime confirmation: No

Example: Speak {{llm_result}} immediately rather than waiting for the workflow to finish.


Reader ​

Send text to the Reader: read it aloud once, or add it to the Reader library under an optional custom name.

Execution status: production_registered Fields: Custom Name (optional), Text (required), Operation (required) Control inputs: mainControl outputs: mainData output: None Permission: None Runtime confirmation: No

Example: After an LLM summary of a long article, hand {{summary}} to the Reader so it is read aloud while you keep working.

Control Flow ​

If / Else ​

Evaluates a condition and routes control through the named true or false port. Its data output is separate from those control ports.

Execution status: production_registered Fields: Custom Name (optional), Condition (required), Output Variable Name (optional) Control inputs: mainControl outputs: true, falseData output: {{branch_result}} (any) Permission: None Runtime confirmation: No

Example: Route {{file_exists}} == true through true; send the missing-file notification through false.


Loop ​

Routes count, variable-array, or while iterations through loop, then continues through done. It does not publish a data-output variable. The editor's items mode currently serializes an empty literal list.

Execution status: production_registered Fields: Custom Name (optional), Loop Mode (required), Repeat Times (optional), Array Variable (optional), While Condition (optional) Control inputs: mainControl outputs: loop, doneData output: None Permission: None Runtime confirmation: No

Example: Choose variable mode with array variable file_list (without braces), process each {{item}} through loop, then continue from done.


Switch ​

Routes control through a matching case:<pattern> port or default. Its data output is separate from those control ports.

Execution status: production_registered Fields: Custom Name (optional), Switch Value (required), Cases (required), Output Variable Name (optional) Control inputs: mainControl outputs: case:<pattern>, defaultData output: {{switch_result}} (any) Permission: None Runtime confirmation: No

Example: Use case:email, case:chat, and default ports to select the appropriate formatting branch.


Try / Catch ​

Routes normal execution through the named try port and errors through catch. It does not publish a data-output variable.

Execution status: production_registered Fields: Custom Name (optional) Control inputs: mainControl outputs: try, catchData output: None Permission: None Runtime confirmation: No

Example: Run an HTTP request through try; use catch to show a failure notification.

Runtime-only actions ​

These Rust workflow variants are executable or parseable but are not offered by the current editor picker.

Rust variantStatusPermissionRuntime confirmationAvailability
AudioCaptureproduction_registeredNoneNoUsed by Echo's internal transcription pipeline.
MatchSnippetknown_unimplementedNoneNoRecognized by the workflow format but not implemented; do not use it.
OpenUrlproduction_registerednetwork / mediumNoAvailable to built-in or YAML workflows, not the editor picker.
Pasteproduction_registeredclipboardread / lowNoAvailable to built-in or YAML workflows, not the editor picker.
Pluginproduction_registeredplugin / highYesAvailable through the workflow plugin runtime, not the editor picker.
Transcribeproduction_registeredNoneNoUsed by Echo's internal transcription pipeline.
TypeTextproduction_registeredinputsynthesis / mediumNoAvailable to built-in or YAML workflows, not the editor picker.
WaitForFocusproduction_registeredNoneNoAvailable to built-in or YAML workflows, not the editor picker.

Released under the MIT License.