Política de privacidad de Dish para Android
Efectiva el 2026-05-21. Esta política se aplica a la aplicación Dish para Android publicada por TinkerNorth ("nosotros", "TinkerNorth", "Dish") y distribuida a través de GitHub Releases. Si lees esto desde dentro de la app, también puedes encontrar la última versión en https://dish.tinkernorth.com/privacy/dish-android/.
La versión corta
Dish para Android no recopila ninguna información personal, identificadores de dispositivo, analíticas de uso o datos publicitarios. No tiene sistema de cuentas. El único procesador operado por TinkerNorth con el que contacta es Firebase Crashlytics, y solo cuando la app crashea, nunca durante el uso normal.
Los informes de crash llevan un stack trace, el modelo de dispositivo, la versión de Android y un UUID de instalación autogenerado. No llevan tus entradas de mando, los nombres o direcciones IP de los Satellites con los que te emparejas, tu SSID de Wi-Fi ni ninguna información de contacto. El alcance completo de Crashlytics está en la sección 5 más abajo. Puedes optar por no participar en cualquier momento desde el icono de engranaje en la pantalla principal → Ajustes → Diagnósticos → Compartir informes de crash; la elección persiste entre arranques y se respeta antes de que cualquier crash se pueda subir en el siguiente arranque.
Todo lo demás que hace la app ocurre en tu dispositivo o entre tu dispositivo y los servidores Satellite con los que tú te has emparejado explícitamente en tu propia LAN. El stream UDP cifrado del mando es tráfico local únicamente; no lo vemos ni lo procesamos.
La versión larga de abajo explica exactamente qué hace la app en el dispositivo, qué permisos solicita y por qué, qué datos viven dónde y cuáles son tus derechos bajo GDPR (UE), UK GDPR, CCPA / CPRA (California) y LGPD (Brasil).
Quiénes somos
TinkerNorth es un proyecto de un solo desarrollador que publica Dish y la suite Satellite como software libre y de código abierto. No operamos un servicio comercial ligado a Dish para Android. Para preguntas de privacidad, contacta privacy@tinkernorth.com.
1. Información que no recopilamos
Para mayor claridad, aquí está lo que Dish para Android no recopila, aunque muchas apps de esta categoría sí:
- Sin nombre, dirección de email, número de teléfono o credenciales de cuenta.
- Sin ID publicitario (AAID), Android ID, IMEI u otros IDs de dispositivo para tracking publicitario.
- Sin ubicación precisa o aproximada.
- Sin contactos, calendario, fotos, archivos o audio del micrófono.
- Sin analíticas generales de uso. No ejecutamos Firebase Analytics, Google Analytics ni ningún otro pipeline de tracking de eventos. El único dato fuera del dispositivo es el alcance de Crashlytics solo para crash descrito en la sección 5.
- Sin datos publicitarios y sin publicidad dentro de la app.
- Sin metadatos sobre los juegos que juegas, los mandos que usas o las horas a las que los usas.
2. Información procesada localmente en tu dispositivo
La siguiente información se procesa localmente en tu dispositivo. No sale de tu dispositivo, excepto donde se note explícitamente que va a un servidor Satellite con el que te has emparejado en tu propia LAN:
- Entradas del mando. Pulsaciones de botón, posiciones de stick analógico y presiones de gatillo desde el overlay táctil en pantalla o un mando físico conectado a tu teléfono. Están cifradas extremo a extremo (ChaCha20-Poly1305) y se envían solo a los servidores Satellite con los que te has emparejado, por UDP en tu LAN.
- Lecturas de sensores de movimiento. Si activas el reenvío de giroscopio / acelerómetro, la salida de la IMU del teléfono se muestrea hasta a 250 Hz, se cifra y se envía al Satellite emparejado. Esto está apagado por defecto y se alterna en la actividad de overlay de la app.
- Estado de la batería. La app lee el nivel y el estado de carga de tu teléfono desde
BatteryManagerde Android para reenviar una capability de batería a tu Satellite una vez cada 30 segundos y en las transiciones de estado. Esto se envía cifrado solo al Satellite emparejado. - Lista de Satellites emparejados. Cuando te emparejas con un Satellite, la app guarda la dirección IP, el puerto, el nombre visible, el identificador de dispositivo y la clave simétrica de 256 bits por satélite derivada durante el handshake de emparejamiento X25519. Esto vive en las
SharedPreferencespor app de Android y está aislado a la app. - Hosts Bluetooth recordados. Si usas la función de passthrough Bluetooth HID, la app guarda la dirección MAC y el nombre de cada host recordado en
SharedPreferencespara que puedas reconectarte sin reemparejar. - Servidores LAN descubiertos. La dirección IP, el puerto y el nombre de cualquier Satellite anunciado en tu red local vía mDNS o broadcast UDP, guardados en memoria durante el ciclo de descubrimiento. No se persisten entre arranques a menos que elijas emparejar.
- Preferencias de la app. Tipo de mando por slot (Xbox / PlayStation), layouts de overlay táctil por juego, selección de locale. Guardado en
SharedPreferencesen tu dispositivo. - Logs de Android. Como toda app Android, Dish escribe mensajes de diagnóstico en el log del sistema de Android (
logcat). Estos nunca salen de tu dispositivo; son visibles para ti (y para cualquiera con acceso de depuración USB a tu teléfono) pero no se transmiten a ningún sitio.
3. Permisos que solicita la app y por qué
Los permisos que Dish para Android declara en su AndroidManifest.xml se listan abajo con la razón exacta de cada uno.
INTERNET. Necesario para enviar paquetes UDP cifrados del mando a un Satellite en tu LAN y para realizar el handshake HTTPS de emparejamiento. No contactamos con ningún servidor que operemos.ACCESS_NETWORK_STATE. Deja a la app notar cuando no tienes Wi-Fi y mostrar un banner útil en lugar de fallar en silencio.ACCESS_WIFI_STATE. Se usa para detectar si estás en Wi-Fi siquiera, para que la app pueda avisarte de que Satellite no es alcanzable por datos móviles.CHANGE_WIFI_MULTICAST_STATE. Necesario para el descubrimiento mDNS / Bonjour de servidores Satellite en tu LAN. Sin él, la única ruta de descubrimiento es el broadcast UDP heredado.WAKE_LOCK. Mantiene la pantalla / CPU despiertas durante una sesión de streaming activa para que una pulsación no se retrase por Doze.FOREGROUND_SERVICEyFOREGROUND_SERVICE_CONNECTED_DEVICE. Android requiere un servicio en primer plano para mantener viva una sesión larga de dispositivo conectado cuando la app está en segundo plano. El tipo de servicio connected-device se ajusta al caso de uso de mando-a-host.POST_NOTIFICATIONS(Android 13+). Publica la notificación de sesión en curso requerida por el servicio en primer plano, más banners opcionales para cambios de estado de conexión. Puedes rechazarlo y la app sigue funcionando; simplemente la notificación no es visible.VIBRATE. Encamina los eventos de vibración reenviados desde tu juego a los vibradores del teléfono para que los sientas en tu mano.BLUETOOTH/BLUETOOTH_ADMIN(Android ≤ 11),BLUETOOTH_CONNECTyBLUETOOTH_ADVERTISE(Android 12+). Solo necesarios si usas la función de passthrough Bluetooth HID para registrar tu teléfono como un mando Bluetooth virtual para otro host. Nunca escaneamos ni registramos dispositivos que no hayas elegido explícitamente emparejar.
La app no solicita ninguno de estos permisos: ubicación (fina o aproximada), cámara, micrófono, contactos, calendario, SMS, registro de llamadas, sensores corporales, archivos / multimedia. Si una versión futura necesita alguno, esta política se actualizará antes del release.
4. Comportamiento de red
Dish para Android inicia tráfico de red en cuatro lugares:
- Descubrimiento LAN. La app envía y escucha consultas mDNS / Bonjour en la dirección multicast
224.0.0.251:5353, y escucha beacons UDP broadcast heredados en el puerto 9879. Este tráfico se queda en tu red local. - Handshake de emparejamiento. Cuando tocas un Satellite descubierto e introduces el PIN de 4 dígitos mostrado en el Satellite, la app hace una única petición HTTPS POST a la IP del Satellite en el puerto TCP 9443. El cuerpo de la petición contiene una clave pública X25519 de 32 bytes, el PIN, el identificador del dispositivo y la etiqueta del dispositivo. El certificado del Satellite es autofirmado y no se valida contra una CA pública; la confianza se establece por el PIN, que se consume una vez y luego se destruye.
- Sesión de streaming. Una vez emparejados, la app envía paquetes UDP autenticados con ChaCha20-Poly1305 a la IP del Satellite en el puerto 9876 y escucha paquetes de ruta de retorno (vibración, lightbar, eventos de estado) en el mismo socket. Los latidos se disparan cada 2 segundos.
- Informes de crash. Si, y solo si, la app crashea o ANR, el SDK de Firebase Crashlytics incluido sube un informe de crash a Google. El alcance detallado y las exclusiones están en la sección 5. No hay ruta de telemetría de operación normal: sin endpoint de analíticas, sin endpoint de "buscar actualizaciones", sin endpoint de configuración remota. Las comprobaciones de actualización las realiza Google Play Store o tú manualmente.
Todo el tráfico HTTPS saliente está además controlado por un network_security_config.xml explícito que deniega texto plano a cualquier host, así una regresión futura no puede bajar silenciosamente una conexión a HTTP plano.
5. Informes de crash (Firebase Crashlytics)
Dish para Android usa Firebase Crashlytics (proporcionado por Google LLC) para recopilar informes de crash y ANR y poder diagnosticar bugs que escapan a las pruebas. Crashlytics es el único flujo de datos desde tu dispositivo a un procesador operado por TinkerNorth.
Cuando la app crashea (una excepción Kotlin sin gestionar, una señal fatal en la capa nativa JNI o un evento Application Not Responding), Crashlytics sube:
- El stack trace (Kotlin y/o nativo).
- Modelo del dispositivo, fabricante, versión de Android, locale, RAM libre y disco libre en el momento del crash.
- El código de versión y el nombre de versión de la app.
- Un Firebase Installation ID: un UUID autogenerado que nos permite contar instalaciones únicas afectadas sin identificarte personalmente.
- Las últimas líneas de log que marcamos explícitamente como relevantes. No subimos contenido general de
logcat.
Crashlytics no recibe:
- Los nombres, IPs o direcciones MAC de los Satellites o hosts Bluetooth con los que te emparejas.
- Tus eventos de entrada del mando, incluidos los streams de movimiento y touchpad.
- Tu SSID, BSSID o dirección IP de Wi-Fi.
- Cualquier información de contacto, dirección de email o nombre.
- El contenido del cable UDP cifrado del mando.
Crashlytics retiene los datos de crash durante 90 días y luego los elimina. Mira la política de Privacidad y Seguridad de Firebase de Google para el rol de Google como procesador. TinkerNorth es el responsable del tratamiento; Google es el procesador.
Opt-out. Toca el icono de engranaje en la pantalla principal, luego en Ajustes bajo Diagnósticos desactiva Compartir informes de crash. El interruptor está activado por defecto. Desactivarlo llama a FirebaseCrashlytics.setCrashlyticsCollectionEnabled(false) y persiste la elección en almacenamiento privado de la app. El siguiente arranque aplica la preferencia guardada antes de cualquier ruta de código que pueda producir un informe de crash, y el controlador observa la preferencia durante el resto de la sesión para que un opt-out a mitad de sesión surta efecto inmediatamente. La preferencia se incluye en la copia de seguridad en la nube de Android para que sobreviva a transferencias de dispositivo. Los informes de crash ya recopilados antes de tu opt-out permanecen en Firebase hasta que expire su retención estándar de 90 días, y luego se eliminan.
Las variantes de build que se publican sin un google-services.json (por ejemplo, cualquiera que compile desde el código fuente) no tienen el SDK de Crashlytics inicializado en absoluto, aunque el interruptor esté activado. El controlador detecta esto vía FirebaseApp.getApps y no hace nada.
No ejecutamos Firebase Analytics. Crashlytics y Analytics son productos Firebase separados y esta app enlaza solo Crashlytics. Hemos mantenido deliberadamente la dependencia firebase-analytics fuera del build: incluirla auto-recopilaría eventos (first_open, session_start, screen_view, app_remove, etc.) y arrastraría com.google.android.gms.permission.AD_ID al manifest de producción. Ninguno es cierto hoy. Si alguna vez se añade Analytics, esta política se actualizará antes del cambio.
6. Servicios y SDKs de terceros
Dependencias que viajan dentro del APK:
- AndroidX (Google): bibliotecas estándar de soporte de Android.
- Material Components for Android (Google): widgets de UI Material 3.
- AndroidX GameActivity (Google): puente de bucle de juego nativo.
- libsodium (compilado desde fuente vía NDK): la biblioteca de primitivas criptográficas, usada para ChaCha20-Poly1305 y X25519. No inicia ningún tráfico de red.
- Firebase Crashlytics + Firebase Installations (Google): solo informes de crash + ANR, alcance detallado en la sección 5. El SDK se incluye siempre en el APK; solo se inicializa cuando el build se ensambló con un
google-services.jsonválido. Sin ese fichero (por ejemplo, cualquiera que compile desde fuente sin un proyecto Firebase), Crashlytics no hace nada en tiempo de ejecución y nada sale del dispositivo.
Firebase Analytics está deliberadamente fuera del build. Incluirlo auto-recopilaría eventos y arrastraría el permiso AD_ID al manifest, ambos en conflicto con esta política. El fichero app/build.gradle.kts tiene un comentario explicando la decisión para que un futuro contribuyente vea la restricción antes de volver a añadir la dependencia.
La lista completa de dependencias está en app/build.gradle.kts en el repo dish-android y en el software bill of materials (SPDX + CycloneDX) que se publica con cada release etiquetado.
Si obtuviste Dish para Android a través de Google Play, la propia Play Store se rige por la política de privacidad de Google. Es independiente de esta política y está fuera de nuestro control.
7. Datos que compartimos
No vendemos, alquilamos ni compartimos información personal con fines publicitarios, de marketing ni con ningún propósito comercial. No tenemos relaciones con redes publicitarias, proveedores de analíticas, proveedores de detección de fraude o partners de marketing. El único tercero que recibe datos de esta app es Google LLC, actuando como procesador para Firebase Crashlytics bajo el alcance descrito en la sección 5.
8. Retención de datos
Los datos en el dispositivo viven hasta que desinstales la app o uses la opción "Borrar almacenamiento" de Android en Ajustes > Apps > Dish.
Dos piezas de datos privados de la app interactúan con la copia de seguridad en la nube de Android de forma diferente:
- Las claves compartidas de los Satellites emparejados y los hosts Bluetooth recordados (fichero
connection_store.xml) están excluidos de auto-backup y transferencia de dispositivo, así que el material de cifrado nunca sale de tu dispositivo. Reemparejarse es la respuesta correcta cuando cambias de teléfono. - La preferencia de opt-out de informes de crash (fichero
user_preferences.xml) sí está incluida en la copia de seguridad en la nube, así que un "no gracias" deliberado se traslada a un dispositivo de reemplazo sin que tengas que volver a activar el interruptor.
Crashlytics retiene los informes de crash durante 90 días en la infraestructura de Google y luego los elimina.
9. Privacidad de los menores
Dish para Android no está dirigido a niños menores de 13 (o menores de la edad equivalente en tu jurisdicción: 14 en Corea del Sur, 16 en la mayor parte de la UE). El alcance de Crashlytics descrito en la sección 5 no contiene información que pueda identificar a un menor como menor (sin nombre, sin fecha de nacimiento, sin email). Si crees que los datos de un menor se han recopilado a través de esta app, escribe a privacy@tinkernorth.com con el Firebase Installation ID o un timestamp reciente de crash y purgaremos los informes asociados.
10. Transferencias internacionales
Los datos en el dispositivo no salen de tu dispositivo. La carga del informe de crash de Crashlytics se envía a Google LLC y puede procesarse en cualquier país donde Google opere infraestructura, incluidos los Estados Unidos. Las transferencias desde el EEE / Reino Unido a EE. UU. dependen de las Cláusulas Contractuales Estándar; mira los Términos de Procesamiento de Datos y Seguridad de Google para la documentación completa del mecanismo de transferencia.
11. Tus derechos
11.1 GDPR (Espacio Económico Europeo)
Si estás en el EEE, el Reglamento General de Protección de Datos (GDPR) te otorga los derechos de acceso, rectificación, supresión, limitación del tratamiento, portabilidad de datos y oposición. Los únicos datos personales que procesamos para usuarios en el EEE son el Firebase Installation ID y la carga del informe de crash descrita en la sección 5. Para ejercer cualquiera de esos derechos:
- Detener la recopilación (derecho de oposición / retirar el consentimiento): abre la app, toca el icono de engranaje en la pantalla principal, luego en Ajustes bajo Diagnósticos desactiva Compartir informes de crash. La preferencia surte efecto durante el resto de la sesión de inmediato y se reaplica antes de que cualquier crash se pueda subir en cada arranque posterior de la app. Desinstalar la app o compilar desde fuente sin un
google-services.jsonson rutas equivalentes para detener la recopilación. - Acceso, corrección, supresión, portabilidad: escribe a privacy@tinkernorth.com con la fecha / hora aproximada del crash y el modelo de tu dispositivo. No exponemos el Firebase Installation ID en la UI de la app, así que identificamos los informes por timestamp + modelo de dispositivo en lugar de pedirte que excaves el ID de logs de depuración. Comprobaremos si algún informe coincide y responderemos en 30 días como requiere el Art. 12(3) del GDPR.
Bases legales. El procesamiento local en el dispositivo (entrada del mando, claves de emparejamiento, hosts recordados) se basa en tu consentimiento, expresado al instalar la app y conceder permisos, y en la ejecución de un contrato cuando pides a la app que se empareje y transmita a tu Satellite. El procesamiento de Crashlytics se basa en nuestro interés legítimo (Art. 6(1)(f) del GDPR) en mantener una app funcional, equilibrado contra el alcance estricto sin PII descrito en la sección 5.
Transferencias internacionales. Los datos de Crashlytics los procesa Google LLC, que puede transferir datos fuera del EEE bajo Cláusulas Contractuales Estándar. Mira los Términos de Procesamiento de Datos y Seguridad de Google.
Tienes derecho a presentar una reclamación ante tu autoridad nacional de protección de datos. El Comité Europeo de Protección de Datos mantiene una lista.
11.2 UK GDPR (Reino Unido)
Si estás en el Reino Unido, el UK GDPR refleja los derechos de la sección 11.1 anterior. Tu autoridad supervisora es la Information Commissioner's Office (ICO). Se aplican el mismo alcance de Crashlytics y la misma mecánica de opt-out.
11.3 CCPA / CPRA (California)
Si eres residente de California, la California Consumer Privacy Act (modificada por la CPRA) te otorga los derechos de saber, eliminar, corregir, optar por no participar en la venta o compartición y limitar el uso de información personal sensible. No vendemos ni compartimos información personal (según se define bajo CCPA / CPRA), y no lo hemos hecho en los 12 meses anteriores. No se requiere un enlace de "No vender o compartir mi información personal" porque no hay venta ni compartición a la que oponerse.
Para ejercer un "derecho a saber" o "derecho a eliminar" sobre el alcance del informe de crash de la sección 5, escribe a privacy@tinkernorth.com con tu Firebase Installation ID (o un timestamp reciente de crash y modelo de dispositivo). También puedes designar un agente autorizado para hacer una solicitud en tu nombre.
11.4 Otros estados de EE. UU.
Los residentes de Virginia (VCDPA), Colorado (CPA), Connecticut (CTDPA), Utah (UCPA), Texas (TDPSA) y otros estados con leyes de privacidad integrales tienen derechos equivalentes. Se aplican el mismo alcance de Crashlytics y la misma mecánica de opt-out.
11.5 LGPD (Brasil)
Si estás en Brasil, la Lei Geral de Proteção de Dados (LGPD) te otorga los derechos de confirmación, acceso, corrección, anonimización, portabilidad y eliminación. Se aplican el mismo alcance de Crashlytics y la misma mecánica de opt-out. Para ejercer cualquier derecho, escribe a privacy@tinkernorth.com. El contacto de nuestro DPO es la misma dirección.
12. Seguridad
Cada paquete intercambiado entre Dish y Satellite se sella con ChaCha20-Poly1305 IETF usando una clave simétrica de 256 bits derivada de un intercambio de claves X25519 sembrado por un PIN de emparejamiento de cuatro dígitos. La clave nunca sale de tu dispositivo o del Satellite emparejado, y el PIN se destruye tras el emparejamiento. Para el modelo de amenazas completo mira /security/ en este sitio.
Para reportar una vulnerabilidad, mira SECURITY.md en el repo de Satellite.
13. Cambios en esta política
Actualizaremos esta política si el comportamiento de la app cambia de una forma que afecte a lo descrito aquí. Los cambios materiales se anunciarán en las notas de release de la app y la fecha "Efectiva" en la parte superior de esta página se actualizará. La versión anterior de cada política se preserva en el historial git de este sitio.
14. Contacto
Privacidad: privacy@tinkernorth.com
Seguridad: mira SECURITY.md en el repo de Satellite
General: abre una incidencia en GitHub en el repo dish-android
← Volver al índice de privacidad