Privacy Policy — Controller Gateway

Effective date: 14 October 2026
App: Controller Gateway (Android package com.bw.controllergateway)
Developer contact: support@controller-gateway.com

Summary

Controller Gateway sends live controller input directly to the receiver address you choose, normally a PC on your own WiFi network. Our community service provides downloadable controller mappings and optional shared control profiles. The app has no advertising and no third-party analytics SDK. It can optionally send anonymous diagnostics to help fix controller problems — this is off unless you turn it on. Until you buy premium, the app also counts your free play time with our service, using a hashed identifier for this app on your device. Community requests, contributions, free play time, optional diagnostics and licence features involve the limited information described below.

Controller input and local settings

Buttons, sticks and rumble are processed to relay your controller between your Android device and your receiver. The community mapping service does not receive your live gameplay input. Relay packets are not encrypted; use a trusted private network or a secure VPN when connecting over another network.

The app stores settings, receiver addresses, personal calibrations, saved Studio profiles, downloaded hardware profiles and sharing preferences on your device. Controller mappings describe which physical inputs operate each control; they do not contain a recording of your gameplay. Diagnostics can be viewed and copied by you. The app does not upload any diagnostics unless you turn on Send anonymous diagnostics in Settings, which is off by default; see “Optional diagnostics” below.

Free play time

Controller Gateway includes a set amount of free play time — relay time with every feature unlocked — before a one-time purchase (or, in the separately distributed full version, a licence) is needed. Only time with a controller relaying to your receiver counts. So that reinstalling the app or clearing its storage does not reset the allowance, the count is kept by our service at controller-gateway.com, not only on your phone.

To do this, the app sends our service a one-way hash of the Android ID that Android assigns to this app on your device (the “per-app Android ID”), the app version, and how much relay time was used. It does so when the app opens, when a relay starts, every few minutes while a relay runs, and when it stops. The per-app Android ID is not your advertising ID: Android gives each app a different value, so other apps cannot use it to recognise you, and it changes if the phone is factory reset. Once you have bought premium or activated a licence, the app stops sending it. Free play time therefore needs an internet connection; premium does not.

Our service stores a keyed hash of the value the app sends (so the stored record cannot be matched back to a device without our secret key), together with the allowance, the play time used, the app version and when the record was created and last used. Like any internet service, it receives your network IP address with each request and uses it only for short-term rate limiting; the IP address is not stored with the record. We use these records only to count free play time and to stop the allowance being reset, not for advertising, and we do not share or sell them. They are kept for as long as the free play allowance applies, because deleting one would reset that device's free play time; you can ask us to delete yours at any time (see “Storage, retention and your choices”).

Automatic controller-profile downloads

When a controller connects, the app checks controller-gateway.com for a compatible hardware profile. This request includes the controller's model name, vendor and product numbers, exposed input sources, supported button codes and axis ranges, plus your phone manufacturer, model and Android API version. These details distinguish incompatible hardware and Android input layouts. We do not send the controller's serial number, Bluetooth address or Android device descriptor.

Lookup requests do not include the community installation token. The service processes the request to find compatible profiles and does not save the lookup body in its profile database. Like any internet service, our server receives your network IP address and request metadata; it uses the address for short-term rate limiting. Downloaded profiles are cached locally so a working controller can continue offline.

Optional hardware contributions

After you verify a mapping, you can keep it on your phone or share it. Sharing is off by default. You can also explicitly enable automatic sharing of future verified mappings and checks in Sharing settings. Turning this off cancels pending contributions; it cannot recall a request already sent.

A contribution sends the mapping or pass/fail check, the hardware and phone information listed above, and a randomly generated installation token. The service stores a one-way hash of that token and a hashed network IP address alongside the check and its timestamp. These pseudonymous identifiers help limit duplicate checks and abuse; they are not proof of a person's identity. No advertising ID, Android ID, serial number or email address is used for hardware contributions.

Shared mappings and aggregate check counts are available to other users. Installation-token hashes and network-address hashes are not included in public profile responses. A successful check does not guarantee immediate adoption as the community default: conflicting or insufficiently checked profiles may require another user's verification. Temporary upload failures are queued locally for retry when the app next checks for profiles; sharing status is shown in the app.

Optional diagnostics

The app can send anonymous diagnostics so we can find and fix controller problems across the user base. This is off by default: nothing is sent unless you turn on Send anonymous diagnostics, either at the one-time prompt or later in Settings (the gear icon). You can turn it off at any time, which stops all collection and sending immediately.

When it is on, the app sends a small record at the end of a relay session only when there is something worth reporting — for example a controller whose buttons did not work. A record contains the controller's model name, vendor and product numbers and input sources; your phone manufacturer, model and Android version; which mapping was in use; the outcome (whether the controller worked, partly worked, or failed and why); the app version; and a randomly generated installation token so one device is counted once per issue. The same problem is sent at most once per device per app version, and a daily limit applies.

Diagnostics do not include your name, account, email, gameplay content or button presses, the receiver's network address, the Android device descriptor, or any advertising or device identifier. The service stores one aggregate record per distinct problem with a count of how many devices reported it, and a one-way hash of the installation token to avoid double-counting; it receives your network IP address as any internet service does and uses it only for short-term rate limiting. We use this to improve controller compatibility, not for advertising, and do not sell it.

Studio community profiles and purchases

Studio profiles are optional configurations such as remaps and stick curves, separate from hardware calibration. Browsing and downloading contacts our service. Publishing, voting and managing a display name use a licence credential for attribution and moderation. Our service stores a one-way hash of that credential, your chosen display name, published content and associated activity. Do not include private information in public profile names or descriptions. Network-address hashes are also used for download counts and moderation.

Google Play purchases use Google Play Billing. Google handles payment information under its own privacy policy; the app receives purchase and entitlement information. The separately distributed full version uses Lemon Squeezy for licence activation and validation. These services process the information needed to administer purchases and licences. We do not receive your card details through the app.

The app may also fetch a version file from controller-gateway.com to check for updates. Opening website, help or purchase links sends normal web requests to those services.

Permissions

Controllers are paired through Android settings; the app receives their input through Android's input system. The Google Play build does not request an accessibility service. The separately distributed full version offers optional background-relay and remote-device features with their own Android permissions and setup screens.

Storage, retention and your choices

Personal settings and cached profiles remain on your device until you reset them, clear app storage or uninstall. Clearing app storage removes the local installation token and queued contributions. Turning sharing off does not delete contributions already received.

Shared profiles and their verification records are retained while needed to operate and moderate the community library. Withdrawn revisions may be retained to prevent their reuse and allow cached clients to learn that they are unavailable. Free play time records are retained as described in “Free play time” above. Server backups are rotated on a 14-day schedule. There is no automatic expiry for active community mappings or checks.

Contact support@controller-gateway.com to request removal of a contribution, your free play time record, or associated information, giving the profile number and relevant details. Removing a free play time record resets that device’s free play time. Please do not send passwords, licence keys or other secrets by email. We may need additional information to locate a record because hardware contributions do not include your name or email address. Copies previously downloaded by other users cannot be recalled from offline devices.

Security and service providers

Connections to the public community API use HTTPS. Our hosting provider processes network requests and stores the service database and backups. We use contribution identifiers and free play time records for functionality and abuse prevention, not advertising, and do not sell this information. Hashing reduces direct exposure of identifiers but does not make these records anonymous.

This website uses Cloudflare Web Analytics for aggregate website traffic information. This is separate from the Android app. The app contains no third-party analytics SDK; its optional, off-by-default diagnostics go only to our own service, as described above. See Cloudflare's privacy policy for its handling of website analytics information, and the privacy policies of Google and Lemon Squeezy when using their purchase services.

Our web server keeps standard access logs: the IP address, browser user agent, page address (including tags such as ?src=app) and time of each request. We use them for security and to count visits from the app and from shared links. They are kept for up to 30 days, and are not combined with app records or used for advertising.

Children's privacy

Controller Gateway is a general-audience utility and is not directed at children. If you believe a child has submitted personal information to our service, contact us so we can investigate and remove it where appropriate.

Changes and contact

We will post changes on this page and update the effective date. Questions or privacy requests: support@controller-gateway.com.