Ajé

Privacidad y avisos de error

Ajé no tiene cuentas ni guarda tus datos fuera del teléfono. Lo único que puede salir del teléfono son los avisos de error, y solo si los activas: al abrir la app por primera vez te lo pregunta, y puedes cambiarlo cuando quieras en Ajustes → Privacidad. Vienen apagados.

Sirven para una cosa: saber que en tal versión, tal operación de tal banco falló, o que llegó un SMS del banco con una forma que Ajé todavía no sabe leer. No sirven para saber quién eres, y esta página explica por qué.

Qué se envía

Cada aviso es un evento suelto, con estos campos y ningún otro:

eventQué pasó: la app arrancó, se envió un código USSD, llegó la respuesta, llegó un SMS del banco, un error.
app, commitLa versión de Ajé y la revisión exacta del código.
android, makerLa versión de Android (solo el número grande, como 13) y el fabricante (samsung, xiaomi). No el modelo.
op, bank, viaEl código de la operación (46 es consultar saldo), el banco y si fue por la API o por el marcador. El banco se deduce de los primeros dígitos de la tarjeta; el número nunca sale.
ok, failure_codeSi salió bien y, si no, el código de fallo que da Android.
latency_ms, age_msCuánto tardó, redondeado a décimas de segundo.
kind, sender, length, linesEl tipo de SMS, el remitente si es un servicio (como PAGOxMOVIL; un número de persona nunca), y el largo del texto.
text, error, stackEl texto del SMS o de la respuesta, o el error y en qué línea del código ocurrió, tachados como se explica abajo.

El tachado

Antes de salir del teléfono, cada texto pasa por un tachado. Las palabras que pasan son las de una lista cerrada: las palabras fijas de los mensajes del banco y de ETECSA, y palabras como «de», «la» o «su». Cualquier otra palabra se cambia por ‹w›. En una palabra con números, cada dígito pasa a # y cada letra a A o a. Un nombre nunca está en la lista, así que se tacha sin que nadie tenga que reconocerlo. Un ejemplo con datos inventados:

Lo que llega al teléfono

Banco Metropolitano: La Transferencia fue completada.
 Fecha: 1/2/2026
 Beneficiario: 9200XXXXXXXX0001
 Ordenante: ANA PEREZ
 Monto: 100.00 CUP
 Nro. Transaccion: AB0000XYZ0001
 Saldo restante: CR 1134.56 CUP

Lo que sale

Banco Metropolitano: La Transferencia fue completada.
 Fecha: #/#/####
 Beneficiario: ####AAAAAAAA####
 Ordenante: ‹w› ‹w›
 Monto: ###.## CUP
 Nro. Transaccion: AA####AAA####
 Saldo restante: CR ####.## CUP

Con la forma basta para arreglar el código que lee ese mensaje. El nombre, el monto y los números no salen.

Lo que no se envía nunca

  • Números de tarjeta o de cuenta, ni siquiera en parte.
  • Tu carné, tu nombre, tu número de teléfono, tu clave.
  • Saldos ni montos.
  • Un identificador de la instalación, del teléfono o de tu cuenta.

Por qué no se puede saber de quién vino

  • Sin identificador. Ningún aviso lleva algo que sea igual en dos avisos tuyos.
  • Uno por envío. Cada aviso viaja solo, en su propia petición; nunca en un paquete con otros tuyos.
  • Sin hora exacta. El teléfono no manda la hora. El servidor anota solo la hora en punto en que llegó.
  • Mezclados. Al cerrar cada hora, el servidor desordena los avisos de esa hora antes de guardarlos, así que el orden no dice cuáles llegaron juntos.
  • Sin dirección IP. Tu conexión llega al servidor, como a cualquier página web, pero ni el servidor web ni el colector la escriben en ningún sitio. Esto es una promesa del servidor, no algo que se pueda comprobar desde fuera; el código del colector es público para que se pueda leer.

Así nadie, tampoco quien mantiene Ajé, puede unir dos avisos tuyos, saber que quien usa un banco también usa otro, ni hacer estadísticas por persona.

Los datos son públicos

Todo lo recibido se publica tal cual en aje.apiad.net/data/, un archivo por día, con licencia CC0. La hora en curso no aparece hasta que se cierra y se mezcla. Puedes ver en Ajustes → Privacidad, con los avisos activados, cada aviso que salió de tu teléfono, exactamente como salió.

El código que tacha, el que envía y el colector están en GitHub, y la explicación técnica en docs/telemetry.md.