Triggers
Every trigger node available in DSL v1. Each one starts a workflow when its condition is met.
A workflow has exactly one trigger. Pick the one that matches when you want the workflow to run. For ad-hoc execution, use trigger.manual (a pinned shortcut) or trigger.pushFromCloud (run from the web).
packageName are subject to denylist enforcement. See denylist.Time (cron)
trigger.timeFire on a Vixie-style 5-field cron schedule.
| Name | Type | Notes |
|---|---|---|
| cron* | string | 5-field cron, e.g. `0 7 * * 1-5` |
| timezone | string | IANA timezone, defaults to `UTC` |
Resolution floor is 15 minutes — the WorkManager minimum periodic interval. Patterns finer than 15min still validate but only fire on each 15-minute tick that matches.
Scheduled window
trigger.scheduledWindowFire when the local time is inside a recurring window on specific weekdays.
| Name | Type | Notes |
|---|---|---|
| daysOfWeek* | number[] | 0=Sunday..6=Saturday |
| startMinute* | number | Minute of day, 0..1439 |
| endMinute* | number | Minute of day, 0..1439 |
| timezone | string | IANA timezone, defaults to `UTC` |
App opened
trigger.appOpenedFire when a target app comes into the foreground.
| Name | Type | Notes |
|---|---|---|
| packageName* | string | Android package id, e.g. `com.spotify.music` |
Driven by AccessibilityService window-state-changed events. Denylisted packages cannot be the target.
App closed
trigger.appClosedFire when a target app leaves the foreground.
| Name | Type | Notes |
|---|---|---|
| packageName* | string | — |
SMS received
trigger.smsReceivedFire when an incoming SMS matches optional sender or body patterns.
| Name | Type | Notes |
|---|---|---|
| fromPattern | string? | Regex matched against the sender address |
| bodyPattern | string? | Regex matched against the message body |
RECEIVE_SMS, READ_SMSNotification received
trigger.notificationReceivedFire when a notification arrives that matches optional package, title, or text patterns.
| Name | Type | Notes |
|---|---|---|
| packageName | string? | — |
| titlePattern | string? | Regex |
| textPattern | string? | Regex |
BIND_NOTIFICATION_LISTENER_SERVICE — granted via Settings → Notification accessCharging state
trigger.chargingStateFire when the charger is connected or disconnected.
| Name | Type | Notes |
|---|---|---|
| state* | "connected" | "disconnected" | — |
Wi-Fi connect
trigger.wifiConnectFire when the device connects to a Wi-Fi network whose SSID matches an optional pattern.
| Name | Type | Notes |
|---|---|---|
| ssidPattern | string? | Regex |
ACCESS_WIFI_STATELocation enter (geofence)
trigger.locationEnterFire when the device enters a circular geofence around a point.
| Name | Type | Notes |
|---|---|---|
| lat* | number | — |
| lng* | number | — |
| radiusMeters* | number | 10..50_000 |
ACCESS_FINE_LOCATION, ACCESS_BACKGROUND_LOCATIONManual
trigger.manualFire from a homescreen shortcut you pin.
No configuration. Tap the pinned shortcut to fire.
NFC tag
trigger.nfcTagFire when a specific NFC tag is scanned while the app is in the foreground.
| Name | Type | Notes |
|---|---|---|
| tagId* | string | Hex tag id |
NFCShake
trigger.shakeFire when the accelerometer registers a shake above the threshold.
| Name | Type | Notes |
|---|---|---|
| threshold | number | Acceleration magnitude in m/s² minus gravity; default 15 |
Debounced to once every 1.5s.
Headset plugged
trigger.headsetPluggedFire when wired headphones are plugged in or unplugged.
| Name | Type | Notes |
|---|---|---|
| state* | "plugged" | "unplugged" | — |
Boot
trigger.bootFire once after device boot.
RECEIVE_BOOT_COMPLETEDPush from cloud
trigger.pushFromCloudFire when the API sends a `workflow.fire` FCM message — e.g. via the web app's "Run now" button.
No configuration. Useful for testing or for chaining workflows from a server-side script via the REST API.