rilo

Vamos a lo técnico.

Todo lo que dice la portada, escrito como aquello de lo que salió: la base de datos real, cómo se crea de verdad un contacto y quién más toca una llamada.

No necesitas esta página para usar Rilo, y nada de lo que hay aquí contradice la versión sencilla — es el mismo producto, descrito con precisión.

La base de datos entera

Todo lo que nuestro servidor sabe de tu familia.

No es un resumen. Estas son las siete tablas, con las columnas que realmente tienen. Cuatro son la cuenta; tres existen para que un teléfono apagado no se pierda nada, y dos de ellas se borran solas.

accounts se guarda
  • idun hash de la clave pública — no un nombre
  • public_keyla clave del dispositivo, que es la cuenta
  • typeadulto o niño
  • type_certla firma que lo demuestra — una cuenta infantil la firma un padre o una madre, así que no hay ninguna casilla que cambiar
  • created_at
  • last_active
El nombre de usuario ya no existe (incidencia #75). Era de solo escritura — se guardaba, no se devolvía a nadie salvo a ti, nunca se enviaba a otro dispositivo — así que solo podía colisionar, nunca leerse. Quitar esa columna deja esta tabla una fila más corta y sigue siendo cierta.
guardians se guarda
  • account_id
  • guardian_keyuna clave autorizada a actuar por este niño
  • added_at
  • removed_at
La retirada se anota, no se borra. Los contactos se comprueban contra quién era tutor cuando se firmó el contacto, para que un padre que deja la cuenta no corte en silencio todas las amistades que aprobó.
push_tokens se guarda
  • account_id
  • platformapns o fcm
  • tokenun identificador opaco de Apple o Google
  • updated_at
Uno por dispositivo, para que una llamada pueda hacer sonar un teléfono dormido. La notificación no lleva nombre ni contenido.
used_nonces se purga
  • nonce
  • expires_at
Una lista de números de un solo uso ya gastados, para que una petición interceptada no pueda repetirse. Se borra al caducar.
pending_grants se borra al entregarse
  • edge_hashun hash del par, no de las dos personas
  • grantel permiso que se está decidiendo, y las firmas reunidas hasta ahora
  • waiting_keyqué firma falta todavía
  • requested_by
  • originescaneado en persona, o un padre actuando por su hijo
  • created_at
  • expires_at
  • delivered_toqué lados ya lo tienen
Este es el único sitio donde el servidor guarda algo parecido a un grafo social, y solo lo guarda mientras una presentación está sin terminar. Nadie respondió en 72 horas: caduca. Respondida, pero el teléfono al que iba dirigida nunca se conectó: 30 días. En cuanto los dos teléfonos tienen el contacto terminado, la fila se borra — y por eso en esta página no hay una tabla de contactos. No hay tabla de contactos.
messages se borra al entregarse
  • id
  • recipient_idel enrutado necesita este en claro
  • sender_idpara que el teléfono sepa con qué clave abrirlo
  • edge_hashel par, con hash, para que esto no pueda leerse como un mapa de quién habla con quién
  • sealedtexto cifrado. No hay columna de texto y nunca la habrá
  • sent_at
  • expires_at
Un teléfono está apagado la mayor parte del día, y un mensaje que desaparece en silencio es un producto roto. Por eso aquí espera una caja sellada — 30 días como mucho, y borrada en cuanto quien la recibe confirma que la tiene. Nosotros no podemos abrir ninguna.
revocations se guarda
  • edge_hashel par, con hash
  • revoked_at
  • recordel registro firmado, para que un teléfono que estaba sin conexión pueda verificar el corte por su cuenta en vez de creernos a nosotros
Lo único que conservamos indefinidamente. Deja constancia de que se cortó un contacto sin ser una lista legible de quién conocía a quién.

Columnas que no existen

  • correo
  • nombre
  • edad
  • foto
  • texto de los mensajes
  • contenido de las llamadas
  • historial de llamadas
  • lista de contactos
  • ubicación
  • modelo del dispositivo

Tu correo se comprueba una vez al registrarte y se destruye en el mismo movimiento — no hay ninguna columna donde ponerlo. Los nombres y las fotos se ponen en cada teléfono y pasan directamente al otro teléfono; nunca llegan hasta nosotros, y por eso también puedes llamar «Yayo» al abuelo sin que lo sepamos jamás. No podríamos enseñarle nada de esto a nadie aunque quisiéramos, y tampoco podrían obligarnos.

Esta sección se genera a partir de server/src/identity/accounts.ts — el archivo que crea la base de datos. Si alguna vez los dos no coinciden, el archivo tiene razón y esta página tiene un error.

Contactos

Cómo se crea de verdad un contacto.

Alguien muestra un código de un solo uso en su teléfono; el otro teléfono lo escanea, en la misma habitación. El código caduca a los diez minutos y sirve una vez. Ese escaneo hace dos cosas a la vez: inicia la presentación y registra la clave pública del otro teléfono, de modo que ambos saben desde entonces exactamente qué clave pertenece a quién. Esa es la parte que hace imposible colarse en una llamada después, también para nosotros.

Todavía no hay nada conectado. Un adulto responsable tiene que firmar el contacto en su propio teléfono, tras una comprobación biométrica hecha en ese momento. Lo que firma es el conjunto — quién, con quién y en qué sentido — y esa firma es lo que comprueba el servidor antes de encaminar nada. El servidor no tiene ninguna clave capaz de firmar, así que no puede crear un contacto, y quien robe la base de datos tampoco.

Cuando los dos teléfonos tienen el contacto terminado, la fila se borra y el contacto solo existe en los dos dispositivos. Cortarlo más tarde escribe una revocación firmada, lo único que se conserva indefinidamente — guardada como un hash del par, de forma que dice que un contacto terminó sin decir quién conocía a quién.

Quién más interviene

Tres empresas tocan una llamada. Ninguna puede oírla.

Hay tres empresas implicadas en que una llamada suene. Esto es lo que cada una puede y no puede ver.

  • Apple y Google

    Las notificaciones push, para que una llamada haga sonar un teléfono dormido. Inevitables en ambas plataformas. Llevan un identificador opaco y nada más — sin nombre, sin número, sin contenido.

  • Cloudflare

    Más o menos una de cada seis llamadas no consigue conectar los dos teléfonos directamente — wifi de hotel, algunas redes móviles — y se desvía por un relé. El relé reenvía paquetes cifrados que no puede abrir, pero sí ve que dos identificadores anónimos estuvieron conectados, cuándo, cuánto tiempo y desde qué direcciones. Esos son justo los metadatos que estamos orgullosos de no guardar, en manos de otro. Preferimos escribirlo aquí a que lo descubras en una política.

  • Nosotros

    La tabla de arriba. Un servidor pequeño en los Países Bajos que presenta dos teléfonos y luego se aparta.