Actions
Every action node available in DSL v1. Actions form the body of a workflow.
Actions execute in the order you connect them, except action.branch (follows one of two edges) and action.loop (repeats its subgraph). Read the concepts page first if you haven't.
action.openApp, action.tapByText.inPackage, action.startMusic.packageName) are subject to denylist enforcement on-device, in addition to the server-side check at workflow-save time.Tap at coordinates
UIaction.tapAtCoordsDispatch a synthetic tap at an exact pixel coordinate.
| Name | Type | Notes |
|---|---|---|
| x* | number | — |
| y* | number | — |
Brittle across resolutions; prefer tapByText when possible.
Tap by text
UIaction.tapByTextWalk the accessibility tree, find the first node whose text matches, tap its nearest clickable ancestor.
| Name | Type | Notes |
|---|---|---|
| text* | string | — |
| matchMode | "exact" | "contains" | "regex" | Defaults to `contains` |
| inPackage | string? | If set, only match when this package is foreground |
Swipe
UIaction.swipeDispatch a swipe gesture from one point to another over a duration.
| Name | Type | Notes |
|---|---|---|
| fromX* | number | — |
| fromY* | number | — |
| toX* | number | — |
| toY* | number | — |
| durationMs | number | 50..5000, default 300 |
Type text
UIaction.typeTextSet the text of the currently focused input element.
| Name | Type | Notes |
|---|---|---|
| text* | string | — |
Requires an input to be focused. Use `tapByText` first to focus the right field.
Wait
Flowaction.waitPause the workflow for a fixed duration in milliseconds.
| Name | Type | Notes |
|---|---|---|
| durationMs* | number | 10..600_000 |
Open app
UIaction.openAppLaunch an app by its package name.
| Name | Type | Notes |
|---|---|---|
| packageName* | string | — |
Refused if the package is on the denylist.
Screenshot to Spaces
Outputaction.screenshotToSpacesCapture the current screen and upload it to your private object-storage prefix.
| Name | Type | Notes |
|---|---|---|
| label | string? | Optional human-readable label, ≤120 chars |
MediaProjection-backed. Uploaded to `screenshots/{userId}/{runId}/{nodeId}.png` and signed URL-only. Pro and Team plans.
HTTP call
Networkaction.httpCallMake an outbound HTTP request.
| Name | Type | Notes |
|---|---|---|
| method | "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | Defaults to GET |
| url* | string | Must be a valid URL, ≤2048 chars |
| headers | Record<string, string>? | Custom headers |
| body | string? | Raw body, typically JSON |
| storeResponseAs | string? | Variable name; the response body is stored in the run scope under this name and can be referenced by `action.branch` |
Set clipboard
Outputaction.setClipboardReplace the clipboard contents.
| Name | Type | Notes |
|---|---|---|
| text* | string | ≤2000 chars |
Show toast
Outputaction.showToastShow a short toast notification on screen.
| Name | Type | Notes |
|---|---|---|
| message* | string | ≤200 chars |
Play sound
Outputaction.playSoundPlay a sound file from a URI.
| Name | Type | Notes |
|---|---|---|
| soundUri* | string | content://, file://, or http(s):// |
Vibrate
Outputaction.vibrateVibrate the device for a fixed duration.
| Name | Type | Notes |
|---|---|---|
| durationMs | number | 10..10_000, default 200 |
VIBRATELog to Google Sheet
Networkaction.logToSheetAppend a row to a Google Sheet.
| Name | Type | Notes |
|---|---|---|
| sheetId* | string | — |
| range* | string | A1-style, e.g. `Sheet1!A:C` |
| values* | string[] | Cell values, one per column |
Requires Google OAuth — connect once from Settings → Integrations.
Send SMS
Networkaction.sendSmsSend a text message via the device's default SMS app.
| Name | Type | Notes |
|---|---|---|
| to* | string | Phone number, ≤40 chars |
| body* | string | ≤1600 chars |
SEND_SMSSet brightness
Systemaction.setBrightnessSet screen brightness on a 0..255 scale.
| Name | Type | Notes |
|---|---|---|
| level* | number | 0..255 |
WRITE_SETTINGS — granted from system settingsToggle Wi-Fi
Systemaction.toggleWifiToggle Wi-Fi on or off.
| Name | Type | Notes |
|---|---|---|
| state* | "on" | "off" | — |
Android 10+ restricts programmatic Wi-Fi toggling — we open the system Wi-Fi panel for user confirmation instead.
Toggle Bluetooth
Systemaction.toggleBluetoothToggle Bluetooth on or off.
| Name | Type | Notes |
|---|---|---|
| state* | "on" | "off" | — |
Same Android 10+ restriction as Wi-Fi: we surface the Bluetooth settings panel.
Start music
UIaction.startMusicStart music playback. If a packageName is given, launch that music app. Otherwise dispatch a media-play key event to whatever is the current media session.
| Name | Type | Notes |
|---|---|---|
| packageName | string? | — |
Stop automation
Flowaction.stopAutomationHalt the run. Downstream nodes are not executed.
Useful as the target of a `false` branch when you want a workflow to exit gracefully.
Branch (if/then)
Flowaction.branchEvaluate a condition on a stored variable and follow the `true` or `false` edge.
| Name | Type | Notes |
|---|---|---|
| condition* | { variable, op, value } | op ∈ eq, neq, gt, gte, lt, lte, contains, matches |
Variables are populated by `action.httpCall.storeResponseAs`. Branches must have two outgoing edges labeled `true` and `false`.
Loop
Flowaction.loopExecute the downstream subgraph N times.
| Name | Type | Notes |
|---|---|---|
| times* | number | 1..1000 |