Help & documentation
The complete guide to Flowroid, the Android automation platform where your phone is the server. Build flows that react to what your device sees and does, control hardware and apps, and expose it all to external systems through an embedded HTTP API. Everything runs locally — no account, no cloud relay for core automation.
- Platform
- Android 8.0 (API 26) and newer
- Designed for
- Android 14 (target API 35)
- Works on
- Phones, tablets, Chromebooks
- Privacy
- Core automation runs on-device
On this page
Core concepts
Flowroid automations are called flows. A flow is three parts that run in sequence.
Starts on
Triggers
A device event starts the flow — a notification arrives, you reach a location, the battery drops. A flow can have one or more.
Guarded by
Conditions
Optional checks evaluated when a trigger fires. The flow only continues if they pass. An empty group passes.
Then runs
Actions
What the flow does, in order. Each action can read the output of the ones before it. Every run is logged to history.
Flows are event-driven — they react to events rather than polling — and fail gracefully: if one action errors, the flow logs it and either continues, retries, or stops based on your settings, but never crashes the app.
Getting started
Install & first launch
- Install Flowroid from Google Play and open it.
- On first launch you're guided through the Permissions overview, where you grant only the permissions the features you want require.
- Flowroid starts a persistent foreground service that keeps your automations alive. The small ongoing notification shows how many flows are active — that's what lets flows run when the app isn't open.
Create your first flow
The fastest start is the Templates library: ready-made automations you install in one tap and customise. To build from scratch:
- Tap + New Flow.
- Add a trigger (for example, Battery State).
- Optionally add conditions.
- Add one or more actions (for example, Post Notification).
- Give the flow a name, enable it, and save.
Your flow is now live and runs whenever its trigger fires.
Building flows
The visual editor
Flows are built in a visual editor where you assemble triggers, conditions, and an ordered chain of actions. Each trigger and action presents a form generated from its configuration schema, so you only ever see the options that are relevant.
Action chaining & outputs
Actions run sequentially. Every action produces structured outputs that later actions can reference using template expressions. For example, an HTTP Request action exposes statusCode, headers, body, and latency, which a following action reads with {{previous.http.body}}.
Control flow
First-class control-flow actions let a flow branch, loop, and call sub-flows:
- If / Else — run one set of nested actions or another based on a condition group.
- Loop — repeat nested actions
forEachitem, a fixed number oftimes, orwhilea condition holds (with amaxIterationssafety cap). - Call Sub-Flow — invoke another flow and pass it an input object, enabling reusable building blocks.
- Delay, Stop, Log, plus Math, String, and Array helpers for in-flow data manipulation.
Error handling
Each action can be configured to continue, stop, or retry on error. Failures are recorded in the flow's execution history with logs, so you can see exactly what happened and when.
Trigger catalog
Flowroid ships 30 triggers. Permissions noted are only required if you use that trigger.
Notifications
1- Notification Received
notification.postedA notification is posted.
Filter by package, title text, body text, priority. Exposes title, text, bigText, category, priority, key, and more. Requires notification access.
Battery & power
3- Battery State
battery.stateBattery level or charging state changes.
Level threshold, direction (rising / falling / any), low-battery, hysteresis.
- Charging Type
battery.charging_typeA charger connects or disconnects.
Charger type (USB / AC / wireless / dock), connected / disconnected.
- Battery Temperature
battery.temperatureTemperature crosses a threshold.
Above / below, °C threshold.
Connectivity
7- Network Connectivity
connectivity.stateWi-Fi or mobile data connectivity changes.
Per-network connect / disconnect, SSID pattern.
- Wi-Fi SSID
connectivity.wifi_ssidYou connect to or leave a specific network.
Exact SSID, connected / disconnected. Requires location.
- Network Type
connectivity.network_typeNetwork type changes (2G / 3G / 4G / 5G / Wi-Fi).
Types, connect / disconnect.
- Airplane Mode
connectivity.airplaneAirplane mode is toggled.
Enabled / disabled / changed.
- VPN State
connectivity.vpnA VPN connects or disconnects.
Optional VPN name filter.
- Bluetooth Device
connectivity.bluetooth_deviceA specific Bluetooth device connects or disconnects.
Device MAC, type. Requires Bluetooth.
- Hotspot State
connectivity.hotspotYour hotspot is enabled or disabled.
Enabled / disabled / changed.
Device & system
8- Device State
device.stateScreen turns on or off, or the device is unlocked.
Screen on / off, user unlock.
- Headset Plugged
device.headsetHeadphones connect or disconnect.
Wired / Bluetooth / any. Bluetooth needs permission.
- NFC Tag Scanned
device.nfcAn NFC tag is scanned.
Tag-ID and content filters (wildcards). Requires NFC.
- Do Not Disturb
device.dndDND mode changes.
Enabled / disabled / changed. Requires DND access.
- Media Button
device.media_buttonA media button is pressed.
Play / pause / next / previous.
- Device Boot
system.bootCompletedThe device finishes booting.
- Alarm Triggered
system.alarmA device alarm fires.
All or specific alarms.
- Clipboard Changed
clipboard.changedClipboard content changes.
Optional text filter.
Schedule & time
1- Scheduled Time
time.scheduleA schedule fires.
Intervals, specific times, days of week, cron expressions, timezone. Exact timing needs alarm access.
Location
1- Geofence
location.geofenceProYou enter, exit, or dwell in an area.
Multiple geofences (lat / lng / radius, enter / exit / dwell). Requires location + background location.
Apps
1- App Opened / Closed
app.foregroundAn app comes to or leaves the foreground.
App selection, opened / closed, minimum foreground time. Requires usage access.
Phone & calendar
2- Phone Call
phone.callA call event occurs (incoming / outgoing / answered / ended / missed).
Number / contact filters, minimum duration. Requires phone state (+ contacts for names).
- Calendar Event
calendar.eventA calendar event starts or ends, or a reminder fires.
Minutes-before, calendar and title filters. Requires calendar.
Sensors
5- Physical State
sensor.physical_stateThe phone's orientation or motion changes (flat, face-down, shaken, and so on).
State, sensitivity, debounce.
- Proximity Sensor
sensor.proximitySomething approaches or leaves the proximity sensor.
Near / far / changed, sensitivity.
- Device Picked Up
sensor.pickupThe device is picked up.
Sensitivity.
- Light Level
sensor.lightAmbient light crosses a threshold.
Bright / dark, threshold, sensitivity.
- Step Counter
sensor.stepsA step-count milestone is reached.
Threshold, daily reset. Requires activity recognition.
Chat
1- Flowroid Chat
flowroid.chatA message is sent in Flowroid's in-app chat.
Optional target-flow filter.
Action catalog
Flowroid ships 45+ actions. Each action's outputs are available to later actions via template expressions.
Android 10+ radio note
Google restricts apps from silently toggling Wi-Fi (and some other radios) on Android 10 and newer. On those versions the Wi-Fi action may open a system panel for confirmation rather than switching silently. Templates that rely on this carry an honest in-app limitation note.
HTTP & integrations
1- HTTP Request
http.requestSends an HTTP request to an external endpoint.
URL, method, headers, body, content type, timeout. Outputs
statusCode,headers,body,latency.
Notifications
2- Post Notification
notification.postPosts a notification.
Title, text, big text, channel, priority, ongoing, auto-cancel.
- Cancel Notification
notification.cancelCancels a notification.
By id (own posts) or by key (any notification, via notification access).
Device control
12- Set Volume
device.volumeSets or mutes a volume stream (media / ring / notification / alarm / system).
- Set Ringer Mode
device.ringer_modeNormal / vibrate / silent.
- Set Brightness
device.brightnessManual level or auto.
Needs Modify settings.
- Set Screen Timeout
device.screen_timeoutSets the screen timeout.
Needs Modify settings.
- Control Screen State
device.screenStateScreen on / off, or lock the device.
- Flashlight
device.flashlightOn / off / toggle with brightness.
Needs camera.
- Vibrate
device.vibrateDuration or custom pattern.
- Set Auto Rotate
device.auto_rotateOn / off.
Needs Modify settings.
- Dark Mode
device.darkModeOn / off / toggle.
Needs Modify settings.
- Keep Screen Awake
device.keep_awakeHolds a wake lock for a duration.
- Toggle Wi-Fi
device.wifiOn / off / toggle.
Behaviour limited on Android 10+ — see the radio note above.
- Toggle Bluetooth
device.bluetoothOn / off / toggle.
Needs Bluetooth.
Audio & media
3- Play Sound
audio.playPlays an audio file on a chosen stream.
- Text to Speech
audio.ttsSpeaks text (pitch, rate, language).
- Media Control
media.controlPlay / pause / next / previous / stop.
Connectivity
3- Connect Bluetooth
connectivity.bluetooth_connectConnects to a device by MAC (A2DP / HFP / HSP).
- Toggle Airplane Mode
connectivity.airplaneOn / off / toggle.
Needs Modify settings.
- Toggle Hotspot
connectivity.hotspotOn / off / toggle with optional SSID and password.
Apps & system
4- Launch App
app.launchLaunches an app, or opens a URL or intent.
- Kill App
app.killTerminates a running app.
- Send Intent
system.intentSends an arbitrary Android intent (action, package, class, data, extras).
- Set Clipboard
system.setClipboardWrites text to the clipboard.
Phone & chat
2- Make Phone Call
phone.callDials a number.
Needs Make calls.
- Send Chat Response
chat.respondSends a message in Flowroid's in-app chat.
Files
7- Read File
file.readReads file contents (encoding, max lines).
- Write File
file.writeWrites or appends content.
- Copy File
file.copyCopies a file.
- Move File
file.moveMoves or renames a file.
- Delete File
file.deleteDeletes a file (recursive for directories).
- Create Directory
file.mkdirCreates a directory.
- List Directory
file.listLists directory contents with an optional filter.
Flow control & logic
11- Delay
flow.delayPauses for a duration.
- If / Else
flow.ifElseBranches into nested actions based on a condition group.
- Loop
flow.loopRepeats nested actions (forEach / times / while).
- Call Sub-Flow
flow.callCalls another flow with an input object.
- Set Variable
flow.setVariableSets a flow- or global-scoped variable.
- Clear Variable
flow.clearVariableClears a variable.
- Math Operation
flow.mathadd / subtract / multiply / divide / modulo / power.
- String Operation
flow.stringuppercase / lowercase / trim / replace / split / concat / substring.
- Array Operation
flow.arraypush / pop / shift / unshift / filter / map / join.
- Log
flow.logWrites a message to the debug log.
- Stop Flow
flow.stopStops execution with an optional reason.
Conditions
Conditions let a flow decide whether to proceed, or which branch to take in an If / Else. Each condition compares a left value (usually a template expression) against a right value using an operator.
Operators
Equality & text
| Operator | Meaning |
|---|---|
| EQUALS | Exact match (case-sensitive) |
| NOT_EQUALS | Not equal |
| CONTAINS | Substring present (case-insensitive) |
| NOT_CONTAINS | Substring absent |
| STARTS_WITH | Prefix match (case-insensitive) |
| ENDS_WITH | Suffix match (case-insensitive) |
| MATCHES_REGEX | Matches a regular expression |
Numeric
| Operator | Meaning |
|---|---|
| GREATER_THAN | Left > right |
| GREATER_THAN_OR_EQUALS | Left ≥ right |
| LESS_THAN | Left < right |
| LESS_THAN_OR_EQUALS | Left ≤ right |
Lists
| Operator | Meaning |
|---|---|
| IN | Value is in a list (JSON array or comma-separated) |
| NOT_IN | Value is not in the list |
Presence
| Operator | Meaning |
|---|---|
| IS_EMPTY | Empty or null |
| IS_NOT_EMPTY | Has a value |
| IS_NULL | Null or missing |
| IS_NOT_NULL | Present and non-null |
Time & date
| Operator | Meaning |
|---|---|
| TIME_BEFORE | Current time is before HH:mm |
| TIME_AFTER | Current time is after HH:mm |
| TIME_BETWEEN | Current time is within HH:mm-HH:mm (handles overnight ranges) |
| DAY_OF_WEEK_IN | Today is one of the listed days |
How values are compared
Numeric operators try a numeric comparison first and fall back to string comparison if the values aren't numbers. List operators accept either a JSON array (["a","b"]) or a comma-separated string (a, b).
Combining conditions
Conditions group into AND / OR sets, and groups can nest arbitrarily deep for complex logic. An empty condition group passes (evaluates to true).
AND
├── {{event.sender}} EQUALS "+15551234567"
└── OR
├── {{event.body}} CONTAINS "urgent"
└── {{event.body}} CONTAINS "important"Variables & template expressions
Scopes
| Scope | Persistence | Writable | Use for |
|---|---|---|---|
| Global | Persists across flows and app restarts | Yes | Counters, shared state, settings |
| Flow | In-memory, single execution | Yes | Temporary values, loop indices |
| Event | Read-only during execution | No | The trigger's payload |
| Device | Real-time, read-only | No | Live device state |
| Secret Pro | Encrypted at rest, read-only in expressions | No | API keys, tokens, passwords |
Template expressions
Anywhere a field accepts dynamic input, use {{ ... }} expressions with dot-notation and array indexing:
{{event.sender}} Trigger event field
{{event.data.nested}} Nested field
{{event.items[0]}} Array index
{{global.counter}} Global variable
{{flow.temp}} Flow-scoped variable
{{previous.http.body}} Output of a previous action (by type)
{{prev[0].output.field}} Output of a previous action (by index)
{{device.battery.level}} Live device state
{{secret.api_key}} Secret value (read-only)Device variables
The device.* namespace exposes live state without needing a trigger:
- Battery —
device.battery.level,.charging,.status - Network —
device.network.connected,.type,.wifi - Screen —
device.screen.brightness - Android —
device.android.version,.release - Locale —
device.locale.language,.country - Time —
device.time.zone,.timestamp
Referencing a category without a property (e.g. {{device.battery}}) returns the whole object as JSON.
Secrets Pro
Secret variables are encrypted at rest using AES-256-GCM with a key held in the device's hardware-backed Keystore (where available). Secret values are masked everywhere in the UI, are never written to logs, and are read-only inside expressions — a flow can use {{secret.api_key}} but cannot overwrite it. The secret vault is a Pro feature.
Permissions
Flowroid only asks for the permissions needed by the features you actually use. They fall into two groups: standard runtime permissions (granted with a system dialog) and special-access permissions (granted on a dedicated Android settings screen).
On SMS & call logs
Flowroid intentionally does not request SMS (READ_SMS / SEND_SMS / RECEIVE_SMS), call-log, or call-screening permissions. These were removed to comply with Google Play policy. Phone-call triggers use only the basic phone-state permission.
Runtime permissions
| Permission | Enables | Notes |
|---|---|---|
NotificationsPOST_NOTIFICATIONS | Posting notifications and the foreground-service status notification. | Required on Android 13+ |
Phone stateREAD_PHONE_STATE | The Phone Call trigger (incoming / outgoing / answered / ended / missed). | No call-log access |
ContactsREAD_CONTACTS | Showing contact names in call triggers, filtering by contact. | Optional |
Make callsCALL_PHONE | The Make Phone Call action. | Optional, dialer flow only |
Fine locationACCESS_FINE_LOCATION | Geofence triggers, Wi-Fi SSID detection (required by Android for SSID). | — |
Background locationACCESS_BACKGROUND_LOCATION | Geofences that work while the app is in the background. | Android 10+. Shown only after an in-app disclosure explaining why |
BluetoothBLUETOOTH_CONNECT | Bluetooth device triggers, headset detection, Bluetooth toggle. | Android 12+ |
Activity recognitionACTIVITY_RECOGNITION | The Step Counter trigger. | Android 10+ |
CalendarREAD_CALENDAR | The Calendar Event trigger. | — |
Special-access permissions
These are granted through Android's settings, not a popup. Flowroid links you straight to the right screen. The Permissions screen shows everything at a glance, grouped by category, with grant status and one-tap actions; a Guided mode walks you through only the permissions that still need attention.
| Access | Enables | Where |
|---|---|---|
| Notification access | Notification triggers — reading notifications from other apps. | Settings → Special app access → Notification access |
| Usage access | The App Opened / Closed trigger (foreground app detection). | Settings → Special app access → Usage access |
| Modify system settings | Actions that change brightness, screen timeout, auto-rotate, dark mode. | Settings → Special app access → Modify system settings |
| Schedule exact alarms | Precise schedule and timed triggers. | Settings → Special app access → Schedule exact alarms (Android 12+) |
| Do Not Disturb access | The Do Not Disturb trigger and ringer / DND actions. | Settings → Special app access → Do Not Disturb access |
| Display over other apps | Launching apps from background triggers (e.g. after unlock). | Settings → Special app access → Display over other apps |
| Battery optimization exemption | Reliable background execution. | Settings → Battery → Battery optimization |
Keeping automations running
Android aggressively stops background apps to save battery, and some manufacturers are far more aggressive than others. To make sure your flows run when you expect them to:
- Exempt Flowroid from battery optimization. The single most important step. Settings → Apps → Flowroid → Battery → Unrestricted / Not optimized.
- Enable auto-start on Xiaomi, Oppo / Realme, Vivo / iQOO, OnePlus, Huawei / Honor, Asus, and similar. These brands block apps from starting after a reboot unless you allow auto-start in their own settings. Flowroid provides a shortcut to the relevant manufacturer screen.
- Grant notification access if you use notification triggers.
- Grant exact-alarm access if you use schedules and want minute-accurate timing.
Boot behaviour
When your device restarts, Flowroid's boot receiver restarts the foreground service (if auto-start is enabled) and resumes all enabled flows. Boot triggers fire after you first unlock the device, once encrypted storage becomes available — Flowroid does not run during the locked, pre-unlock phase.
Templates
Flowroid ships 46 ready-made templates spanning beginner to intermediate automations. Install one in a tap, customise its values (times, locations, app choices, thresholds), and it becomes a normal editable flow. A sampling of what's included:
- Silent at Night
Go silent at bedtime on selected days.
- Low Battery Alert
Notify when the battery drops below a threshold.
- Wi-Fi at Home
Manage Wi-Fi on geofence arrival.
- Flip to Silence
Silence the phone when placed face-down.
- Headphones Auto-Play
Launch music and set volume when headphones connect.
- NFC Office Mode
Tap a tag to switch to work mode.
- Auto Dark Mode at Sunset
Schedule-based dark mode.
- Pocket Mode Protection
Lock the screen when pocketed.
- Meeting Auto-Silence
Silence during calendar events.
- Battery Overheat Warning
Alert on high battery temperature.
- Auto TTS Notification Reader
Read notifications aloud.
- Media Pause on Call
Pause media on an incoming call, resume after.
- File Backup on Charge
Back up a file when charging.
…and many more across power, connectivity, sensors, and productivity.
Honest limitations
Some templates depend on capabilities Android restricts on newer versions or specific manufacturers (for example, silently toggling Wi-Fi on Android 10+, or force-closing apps). Those templates display a clear limitations note in their detail screen describing exactly what will and won't work on your device, so there are no surprises.
Import & export
Every flow can be exported to a portable file and re-imported on the same or another device — handy for backups, sharing, or moving between devices. Import / export works entirely with local device storage: no account or cloud required. (Flows can also be exported and imported through the API server.)
The embedded HTTP API server
Flowroid can run an embedded HTTP server directly on your device, turning your phone into an automation endpoint that external systems call. The device is the server — your computer, home-automation hub, or another phone connects to the phone. This is a Pro feature.
Security model
The API server is off by default and built secure-by-default:
- Localhost-only by default. It binds to
127.0.0.1and is unreachable from the network until you explicitly enable the Enable LAN access toggle (which rebinds to0.0.0.0and shows a clear warning). - Authentication required. All protected routes require an API key or a JWT bearer token. The signing secret is stored in the hardware-backed Keystore; if that's unavailable the server refuses to start rather than fall back to a guessable secret.
- Scoped access. API keys carry fine-grained scopes (
flows:read,flows:write,flows:execute,variables:read,webhooks:write) so you grant only what each integration needs. - CORS closed by default. No browser origins are allowed unless you add them to an allow-list; wildcard origins are rejected.
- Request body cap of 1 MiB and configurable rate limiting.
- Secrets never leave in plaintext. Secret variables are returned masked; revealing a value requires a separate dedicated scope.
- SSRF protection on outbound HTTP actions (loopback, link-local, and private ranges are blocked by default).
- Optional HTTPS / TLS with a self-signed certificate you can export, and HMAC-SHA256 signature verification for inbound webhooks.
Authentication flow
Exchange an API key for a short-lived JWT, or authenticate per-request with the key directly (X-Api-Key: fd_live_xxxx).
# Exchange an API key for a short-lived JWT
curl -X POST http://<device-ip>:8080/api/v1/auth/token \
-H "Content-Type: application/json" \
-d '{"apiKey":"fd_live_xxxxxxxxxxxxxxxx"}'
# → { "accessToken": "...", "refreshToken": "...", "expiresIn": 900 }Core endpoints
All endpoints are versioned under /api/v1.
| Group | Examples |
|---|---|
| Health & info | GET /api/v1/health, GET /api/v1 |
| Auth | POST /auth/token, POST /auth/refresh, GET /auth/me, GET /auth/scopes, API-key CRUD under /auth/apikeys |
| Flows | GET /flows, POST /flows, GET/PUT/PATCH/DELETE /flows/{id}, /flows/{id}/toggle, /execute, /duplicate, /executions, /export, POST /flows/import |
| Executions | GET /executions, GET /executions/{id}, GET /executions/{id}/logs |
| Device | GET /device plus /battery, /network, /storage, /memory, /screen, /locale, /apps, /sensors |
| Variables | GET /variables, GET/PUT/DELETE /variables/{name}, POST /variables/{name}/reveal |
| Webhooks | GET/POST /webhooks, GET/PATCH/DELETE /webhooks/{id}, plus the public trigger endpoint POST /api/v1/hooks/{path} |
| Discovery | GET /discovery/mdns, /devices, /capabilities (mDNS service advertisement) |
| TLS | GET /tls, certificate inspection / export / regeneration |
| WebSocket | ws://<device-ip>:8080/api/v1/ws for real-time execution events |
Run a flow remotely
curl -X POST http://<device-ip>:8080/api/v1/flows/<flow-id>/execute \
-H "X-Api-Key: fd_live_xxxx" \
-H "Content-Type: application/json" \
-d '{"input":{"reason":"manual run"},"sync":true}'Inbound webhooks
Create a webhook bound to a flow, then trigger it from any external system. The webhook can require no auth, an API key, a bearer token, or an HMAC-SHA256 signature:
BODY='{"event":"deploy","status":"green"}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "your-secret" -hex | sed 's/^.* //')
curl -X POST http://<device-ip>:8080/api/v1/hooks/my-webhook \
-H "Content-Type: application/json" \
-H "X-Signature: sha256=$SIG" \
-d "$BODY"Live, interactive reference
The server publishes its own always-current OpenAPI spec and Swagger UI on the device: GET /openapi.json and /openapi.yaml for the machine-readable spec, GET /docs for interactive Swagger UI, and GET /redoc for the ReDoc viewer. Because these are generated from the running server, they are the authoritative, version-matched reference for your specific build.
Plans & pricing
Flowroid has two tiers. Pricing is shown in the app and on Google Play, localised to your region.
Free
Everything you need to automate your device, free forever.
- Unlimited flows
- All standard triggers — notifications, schedules, sensors, connectivity, calendar, app foreground, Do Not Disturb, phone call, NFC, boot, battery, Bluetooth, step counter, and more
- All standard actions — device control, file operations, app launch, system intents, notifications, audio / TTS, media control, vibrate, volume / ringer, flow control & logic
- Basic HTTP requests
- Global & flow variables
- The full condition engine — all operators, nested AND / OR groups
- Local, on-device execution — no cloud relay
- The curated template library
- Local import / export
Pro
Everything in Free, plusThe advanced surfaces.
- Embedded HTTP API server — expose your flows as a secure REST API
- Encrypted secret vault — store credentials and use them as
{{secret.*}} - Geofence trigger — location-based automations (Google Geofencing)
- Maps & advanced location
- Inbound webhooks — trigger flows over HTTP
- Priority support
Available monthly, yearly, or as a one-time lifetime purchase. Flows that use Pro features are paused, not deleted, if Pro access ends — so you never lose your work, and everything resumes when Pro is active again.
Privacy & security
- On-device by default. Core automation runs entirely on your phone. No account requirement and no cloud relay for normal flow execution.
- Sensitive data stays local. Notification titles and text are never written to Flowroid's logs. Secret variables are encrypted at rest with a hardware-backed key and masked throughout the UI.
- The API server is opt-in, localhost-bound, and authenticated. Network exposure requires an explicit toggle; all protected routes require scoped credentials; CORS is closed by default.
- Outbound requests are guarded. The HTTP action blocks server-side request forgery against loopback, link-local, and private address ranges by default.
- No restricted permissions. Flowroid does not request SMS, call-log, or accessibility-service permissions.
- Honest capability disclosures. Where Android or a manufacturer restricts a capability, the relevant template or action says so plainly in-app.
The full Privacy Policy details exactly what each permission accesses and where the data goes.
Troubleshooting & FAQ
My flows stop running when the screen is off, or after a while.
Exempt Flowroid from battery optimization, and on Xiaomi, Oppo, Vivo, OnePlus, Huawei, and Asus devices enable auto-start. See Keeping automations running.
My automations don't run after a reboot.
Make sure auto-start is enabled (especially on the manufacturers above) and that battery optimization is disabled. Flowroid resumes flows automatically once you unlock the device after boot.
Notification triggers stopped working after an update or reboot (Xiaomi / MIUI).
Some MIUI and HyperOS builds drop the notification-listener binding. Flowroid re-requests it automatically on boot and after updates; if a flow still doesn't fire, toggle notification access off and on for Flowroid in Android settings.
My Wi-Fi, airplane, or radio toggle action doesn't switch silently.
On Android 10+ Google restricts apps from changing these radios directly; the action may open a confirmation panel instead. This is an OS restriction, noted in-app on the affected templates.
My schedule fires a few minutes late.
Grant the “Schedule exact alarms” special access (Android 12+) and disable battery optimization for minute-accurate timing.
Can external apps control Flowroid?
Yes — enable the Pro API server. It's localhost-only and authenticated by default; turn on LAN access only when you need network reach. See The embedded HTTP API server.
Does Flowroid send SMS or read my texts or call log?
No. SMS and call-log capabilities are not part of Flowroid — these permissions were removed to comply with Google Play policy.
Where can I see why a flow did or did not run?
Open the flow's execution history — each run records its trigger, the actions executed, their outputs, and any errors with logs.
Still stuck? Reach the maker directly — Flowroid has no telemetry, so the detail you include is all support has to go on.