Workflow Variables
Echo keeps a runtime context for each workflow run. Inputs enter that context, completed steps add outputs, and action fields can interpolate values with {{...}}.
Inputs
Declared workflow inputs can have a type, default, requirement, description, options, and label. The current Configure form displays inputs already declared by the workflow and lets you change their defaults; it does not provide a general add-input builder.
Test run always supplies the entered text as both {{input}} and {{transcription}}. Other trigger paths can supply transcription, selected text, clipboard, active-app, and other runtime context according to their caller.
The runtime reserves these names and user workflows must not shadow them with Set Variable:
transcription, selected_text, clipboard, active_app, active_window_title, workflow_id, workflow_name, and app_context.
Voice Slots can add their own safe field names after a spoken trigger. See Voice Slots.
Outputs
An action that produces data has a default output name in the Action Reference. In the node's I/O tab, Output can replace that default with a descriptive alias such as trimmed or response_body.
Completed step data is also stored under the step's stable node id. A graph edge can therefore feed {{source_node_id}} into the next node, while an explicit output alias gives later actions a human-readable reference.
Scope is forward-only in the editor: the I/O picker lists workflow inputs plus output aliases from earlier actions, never outputs from later actions. In a graph, an explicit upstream edge is the clearest statement of dependency; do not rely on canvas position alone.
At workflow level, Workflow output names the variable to return. Echo then falls back to the last configured step output and finally processed_text when available. A name that never receives a value cannot produce a return value.
Interpolation
Use double braces in supported fields:
{{input}}
{{trimmed}}
{{response.status}}
{{count + 1}}
{{name || 'Anonymous'}}
{{upper(trim(name))}}Interpolation supports variable and property access, expressions, common functions, arithmetic, comparisons, conditionals, and fallback expressions. A missing double-brace value resolves to an empty string for backward compatibility, so validate required inputs instead of assuming a visible error.
Reusable constants — shared values referenced as {{constants.KEY}} — are edited in the recipe editor's settings tab under Global workflow constants. Treat them as ordinary workflow input, not secret storage.
Not every field accepts interpolation and not every action exposes the same input control. Check the generated action's Fields and example rather than guessing.
Secrets
Workflow variables, Voice Slots, node values, output aliases, the console, and run history are not a secret vault. Never paste API keys, access tokens, passwords, private keys, or credentials into ordinary variables, examples, test input, prompts, file paths, or recipe YAML.
Use configured provider or executor profiles for LLM credentials. Treat Get Env Variable, Shell, HTTP, file, plugin, and LLM actions as explicit trust boundaries: an action that can read or transmit data can expose a secret placed in its input even when the workflow name looks harmless.
Before importing or running third-party content, follow Recursive permissions and compare each action with the generated permission metadata in the Action Reference.