Privacy Policy — Retained
The short version
Retained collects nothing. There is no account, no cloud service, no analytics and no telemetry. The app talks only to the MQTT brokers you configure yourself, and everything it stores stays on your device.
What the app stores, and where
All of the following is written to the app's private storage on your device. None of it is transmitted anywhere except to the MQTT brokers you enter yourself.
| Data | Purpose | Where it lives |
|---|---|---|
| Broker connection settings (name, host, port, protocol, client ID, TLS options) | To connect to your broker | Local database |
| Broker username and password | To authenticate to your broker | Encrypted with AES-256-GCM using a non-exportable key held in the Android Keystore |
| Topic subscriptions, data sources and extraction settings | Your dashboard configuration | Local database |
| Dashboard pages, widgets and rules | Your dashboard layout | Local database |
| Message history samples | To draw charts and show recent values | Local database, capped by the retention limits you set |
| App preferences (theme, kiosk settings, kiosk PIN) | To remember how you set the app up | Local preferences storage |
Uninstalling the app removes all of it.
What the app sends, and to whom
Retained makes network connections only to the MQTT brokers you configure. It sends what you tell it to send: subscription requests for your topics, and any messages you publish using control widgets. The developer operates no server and receives no data from the app.
The app contains no advertising SDK, no analytics SDK, no crash-reporting SDK and no social login. It does not read your contacts, location, photos, camera, microphone, call log, SMS, or installed-app list, and it requests no permission that would allow it to.
Please note that your MQTT broker is a third party operated by you or by whoever runs it. What that broker does with the messages it receives is governed by its own operator, not by this app.
Permissions the app requests, and why
INTERNET,ACCESS_NETWORK_STATE,ACCESS_WIFI_STATE,CHANGE_NETWORK_STATE— to reach your broker and to notice when the network drops so the connection can be re-established.FOREGROUND_SERVICE,FOREGROUND_SERVICE_CONNECTED_DEVICE— to hold the broker connection open while the dashboard is running, with a persistent notification showing the connection state. This is what stops Android from silently killing a wall-mounted display.WAKE_LOCK— to keep the network connection alive while the screen is off.POST_NOTIFICATIONS— to show the connection-status notification and any threshold alerts you configure yourself in the rules engine.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS— to ask you, with an explanation, to exempt the app from battery optimisation. Battery optimisation is the most common cause of a dashboard that stops updating overnight. You can decline; the app still works, less reliably in the background.
Files you export
Configuration export writes a JSON file to the location you pick through the system file picker. Exported files deliberately exclude broker usernames and passwords, so a config file you share with someone else carries no credentials. Once a file is outside the app, it is yours to manage; the app has no further involvement with it.
Children
Retained is a utility for home-automation and IoT users. It is not directed at children and collects no personal data from anyone, including children.
Changes to this policy
If this policy changes, the revised version will be published at this address with an updated date above. Because the app collects no data, any change is likely to be a clarification rather than a change in practice.