rilo
La volpe mascotte di Rilo in piedi accanto a uno scudo con sopra un lucchetto

Entriamo nel tecnico.

Tutto quello che dice la prima pagina, scritto come la cosa da cui è nato: il database vero, come si crea davvero un contatto, e chi altro tocca una chiamata.

Questa pagina non ti serve per usare Rilo, e niente qui contraddice la versione più semplice. È lo stesso prodotto, descritto con precisione.

Tutto il database

Tutto quello che il nostro server sa della tua famiglia.

Non è un riassunto. Queste sono le diciassette tabelle del server, con le colonne che hanno. Quattro sono la tua famiglia: chi sono, chi può agire per un bambino, i telefoni da cui parlano e dove farli squillare. Quattro tengono qualcosa da parte per un telefono che era spento, e tutte e quattro si cancellano da sole. Tre riguardano chi può agire per un bambino e quale telefono ha smesso di essere affidabile. Due sono registrazioni firmate di una fine: un contatto tagliato, o qualcuno che se n’è andato. Si conservano perché un telefono rimasto offline possa verificarle invece di credere a noi. Una contiene numeri usa e getta già spesi, spazzati via alla scadenza. Una è l’abbonamento, e non contiene niente che faccia il nome di nessuno. Una è una segnalazione che ci ha mandato un adulto, ed è l’unica tabella qui che esiste per far succedere qualcosa. L’ultima non riguarda affatto la tua famiglia.

accounts conservato finché non lo cancelli
  • idun hash della chiave pubblica, non un nome
  • public_keyla chiave del dispositivo, che è l’account
  • typeadulto o bambino
  • type_certla firma che lo dimostra. L’account di un bambino è firmato da un genitore, quindi non c’è nessun interruttore da girare
  • created_at
  • last_activel’ultima volta che uno dei tuoi telefoni ha detto ciao
  • dormant_warned_atvuoto
  • consent_sealedla tua email di registrazione, sigillata con una chiave che sta su carta dal fondatore. Nessun server può leggerla
  • uncovered_sincevuoto, a meno che il tuo abbonamento non copra più questo bambino — allora il giorno in cui l'abbiamo notato, così che il mese prima che qualcosa si fermi parta da lì
La riga del tuo account resta finché non lo cancelli, e cancellarlo dall’app si porta via questa riga e tutto quello che le sta attaccato. Stiamo lavorando a una pulizia delle famiglie che hanno smesso del tutto di usare Rilo; finché non sarà attiva, qui niente se ne va da solo.
server_state conservato
  • keyche cosa si sta ricordando
  • valuee che cosa dice
L’unica tabella qui che non riguarda per niente la tua famiglia. Oggi contiene una cosa sola: il momento in cui questa versione del server è partita per la prima volta. Ogni domanda su chi è rimasto in silenzio si misura da lì, così un database scritto prima che potessimo accorgercene non verrà mai letto come mesi di silenzio.
guardians conservato
  • account_id
  • guardian_keyuna chiave autorizzata ad agire per questo bambino
  • added_at
  • removed_at
La rimozione viene annotata, non cancellata. I contatti si verificano rispetto a chi era tutore quando il contatto è stato firmato, così un genitore che lascia l’account non recide in silenzio tutte le amicizie che ha approvato.
devices conservato
  • account_id
  • device_keyla chiave di un singolo telefono. Una persona può parlare da più di uno
  • agreement_keyla chiave a cui viene sigillato un messaggio, così solo quel telefono può aprirlo
  • certla firma che ha fatto entrare questo telefono, conservata parola per parola così il tuo telefono può verificarla invece di credere a noi
  • kindun telefono, oppure il foglio di recupero stampato
  • added_at
  • removed_at
I telefoni e i tablet da cui parla una persona. Dice quanti dispositivi ha la tua famiglia e assolutamente niente su chi frequentate, non più delle due tabelle qui sopra. Un telefono entra grazie alla firma di un dispositivo già in elenco, mai grazie a noi, e quella firma è conservata qui perché qualsiasi telefono possa verificarla invece di fidarsi dell’elenco. Ritirare un telefono segna la riga invece di cancellarla, per lo stesso motivo per cui si annota un adulto che se ne va: tutto quello che ha firmato mentre era vostro deve restare verificabile.
push_tokens conservato
  • account_id
  • device_keyquale dei tuoi telefoni fa squillare
  • platformapns o fcm
  • tokenun identificatore opaco che arriva da Apple o da Google
  • updated_at
Uno per dispositivo, così una chiamata può far squillare un telefono che dorme. La notifica non porta né nomi né contenuti.
used_nonces spazzato via
  • nonce
  • expires_at
Un elenco di numeri usa e getta già spesi, così una richiesta intercettata non può essere rigiocata. Cancellato man mano che scade.
denied_edges spazzato via
  • edge_hashun hash della coppia, non le due persone
  • denied_at
  • expires_at
Quando un adulto dice no a una presentazione, questa tabella ricorda il no per tre giorni, così il telefono dell’altro genitore, spento in quel momento, non può completarla per sbaglio. Una nuova scansione fra le stesse famiglie la cancella prima. Niente nomi, niente chiavi: un hash e due date.
pending_grants spazzato via
  • edge_hashun hash della coppia, non le due persone
  • grant_recordil permesso che si sta decidendo, e le firme raccolte finora
  • waiting_keydi chi manca ancora la firma
  • requested_byil telefono che ha chiesto, così un telefono non può sommergere di domande una famiglia
  • originscansionato di persona, oppure un genitore che agisce per il proprio figlio
  • delivered_toquali telefoni ce l’hanno già
  • declaredil nome scelto da chi chiede, sigillato così può leggerlo solo la famiglia che ha scansionato
  • created_at
  • expires_at
Questo è l’unico punto in cui il server tiene qualcosa che assomigli a un grafo sociale, e lo tiene solo finché una presentazione è incompiuta. Nessuno ha risposto entro 72 ore: decade. Ha risposto, ma il telefono a cui era destinata non si è mai collegato: 30 giorni. Quando entrambi i telefoni hanno il contatto finito, la riga viene cancellata. Ecco perché in questa pagina non c’è nessuna tabella dei contatti. Non esiste una tabella dei contatti.
messages cancellato alla consegna
  • id
  • recipient_idl’instradamento ha bisogno di questo in chiaro
  • recipient_deviceper quale dei loro telefoni è sigillata la scatola. Ogni telefono ha la sua chiave, quindi ognuno riceve la propria scatola
  • sender_idcosì il telefono sa quale chiave la apre
  • sender_devicequale dei loro telefoni l’ha sigillata, così la copia giusta trova la serratura giusta
  • edge_hashla coppia, sotto forma di hash, così questo non si può leggere come una mappa di chi parla con chi
  • sealedtesto cifrato. Non c’è nessuna colonna di testo e non ci sarà mai
  • sent_at
  • expires_at
Un telefono è spento quasi tutto il giorno, e un messaggio che sparisce in silenzio è un prodotto rotto. Perciò una scatola sigillata aspetta qui: al massimo 30 giorni, e viene cancellata nel momento in cui il destinatario conferma di averla. Noi non possiamo aprirla.
revocations conservato
  • edge_hashla coppia, sotto forma di hash
  • revoked_at
  • recordla registrazione firmata, così un telefono rimasto offline può verificare da sé il taglio invece di fidarsi della nostra parola
L’unica cosa che teniamo a tempo indeterminato. Registra che un contatto è stato tagliato senza essere un elenco leggibile di chi conosceva chi.
roster_changes conservato
  • id
  • account_iddi chi sta cambiando l’elenco di telefoni e di adulti
  • kindsta entrando, o sta venendo tolto
  • subject_keyil telefono o l’adulto di cui si parla
  • subject_kindquale dei due
  • agreement_keyla seconda chiave che serve a un telefono, vuota per la carta
  • recordla firma vera e propria, conservata parola per parola così un telefono può verificarla invece di credere a noi
  • signed_byquale chiave ha firmato
  • by_authorityse ha firmato un foglio di recupero, che è quello che la fa aspettare
  • issued_atil momento che dichiara chi firma, mai il nostro orologio
  • reasonvuoto, a meno che chi firma non abbia scritto qualcosa
  • proposed_at
  • effective_atquando diventa vero, due notti dopo la proposta
  • contested_at
  • contested_bychi si è opposto, e con quale firma
  • contest_record
  • resolved_at
  • resolutionapplicato o annullato, una volta risolto
Le due notti fra la firma di un cambiamento agli adulti di un bambino e il momento in cui quel cambiamento diventa vero. Un telefono che entra in una famiglia, o uno che viene buttato fuori, aspetta qui dove ogni altro telefono dell’account può vederlo e opporsi. La riga resta anche dopo, perché un telefono che era spento deve poter verificare cos’è successo invece di fidarsi della nostra parola. Contiene l’account e le chiavi coinvolte, che è più di quello che ha la maggior parte delle tabelle qui.
roster_change_votes conservato
  • change_idquale cambiamento in attesa
  • voter_keyquale adulto
  • decisionlascia passare, oppure ferma
  • recordla sua firma
  • at
Una riga per adulto invece di un conteggio. La maggioranza degli adulti di un bambino può chiudere in anticipo l’attesa di due notti, e se ci sia una maggioranza va richiesto ogni volta rispetto agli adulti che ci sono adesso. Chi se n’è andato non è un voto, e un contatore non saprebbe accorgersene.
device_revocations conservato
  • account_iddi chi era il telefono
  • device_keyla chiave che è stata rubata
  • revoked_at
  • recordla prova firmata, così un telefono può verificarla senza chiedere a noi
Un telefono rubato, e la differenza fra questo e ritirarne uno. Ritirare vuol dire che da adesso non può più agire, che è la risposta giusta per un telefono che qualcuno ha sostituito. Questo vuol dire diffidare di tutto quello che ha firmato, e gli altri telefoni devono poterlo verificare senza chiedere a noi. Solo il furto ottiene una riga.
retirements conservato
  • account_idl’account che non c’è più
  • retired_at
  • recordla prova firmata, fatta con la chiave di quell’account prima che la chiave fosse distrutta
Un elenco di assenze, e la buona notizia è la seconda colonna. Quando qualcuno lascia Rilo, ai telefoni dei suoi amici arriva una firma fatta con la chiave di quella persona. Una famiglia scopre che qualcuno se n’è andato da una prova, non perché lo diciamo noi. Niente di quello che potremmo dire da soli può togliere una faccia dallo schermo di tuo figlio. È l’unica tabella qui senza un collegamento a un account, perché deve sopravvivere a quello di cui parla.
entitlements conservato
  • account_id
  • storeapple, google, oppure offerto da noi
  • store_refun identificatore opaco che arriva dallo store. È l’unica cosa che ci permette di fargli una domanda più avanti
  • store_ref_hashun’impronta dell’identificatore qui sopra. È quello che impedisce a una ricevuta di coprire due account
  • environment
  • stateactive, grace, lapsed, lapsed_trial o disabled
  • seatsquanti bambini copre. Un numero, mai i loro nomi
  • expires_at
  • acts_at
  • updated_at
Qui niente identifica una persona: nessun account dello store, nessun Apple ID, nessun account Google, nessun nome, nessuna email, nessuna carta. Quali bambini copre un pagamento si ricava dalla tabella dei tutori quando serve, e non viene mai scritto da nessuna parte.
roster_notices spazzato via
  • device_keyil telefono a cui non è ancora stato detto
  • change_iddi quale cambiamento si tratta
  • whatproposto, contestato o risolto
  • account_iddi chi è l’elenco di telefoni che si è mosso. Quando lo si dice a un adulto a proposito di suo figlio, qui c’è il bambino
  • subject_keyil telefono che è stato aggiunto o tolto
  • effective_at
  • created_at
  • expires_at
  • delivered_atquando siamo riusciti a dirlo, oppure vuoto perché non ci siamo riusciti
Una coda, e il motivo per cui aggiungere o togliere un telefono avviene ad alta voce. Ogni telefono della famiglia lo viene a sapere, e per un bambino lo viene a sapere anche ogni adulto che se ne occupa, compreso il telefono appena tolto. È così che chi non dovrebbe averlo scopre che te ne sei accorto. Un avviso non contiene niente che il cambiamento stesso non contenga, e viene cancellato alla scadenza, che siamo riusciti a consegnarlo o no.
reports conservato
  • id
  • about_keydi chi parla la segnalazione. Leggibile, perché qualcuno possa intervenire
  • reasonquale delle sei cose è successa, come l’ha scelta l’adulto che segnala
  • csa
  • sealedquello che è stato scritto, sigillato sul telefono che l’ha mandato con una chiave che sta su carta dal fondatore. Nessun server può leggerlo
  • sealed_digestun’impronta della parte sigillata, così quello che si apre dopo è dimostrabilmente quello che è arrivato
  • received_at
  • edge_snapshotchi era stato autorizzato a raggiungere chi, e quale adulto lo aveva permesso, com’era in quel momento. Questo non si può ricostruire dopo
  • reporter_keychi l’ha mandata, oppure niente del tutto quando è stata mandata senza nome
  • source
  • sealed_key
  • receiptil riferimento che tiene chi la manda. È l’unico modo che abbiamo di rispondere a qualcuno su una segnalazione che non possiamo aprire
  • acknowledged_at
  • decided_at
  • actioned_at
  • escalated_at
  • decided_by
  • outcome
L’unica tabella qui che esiste per far succedere qualcosa. Gran parte di una segnalazione è sigillata sul telefono che l’ha mandata e noi non possiamo aprirla. Quello che resta leggibile è di chi parla, perché una segnalazione su cui nessuno può intervenire non protegge nessuno. Sopravvive all’account di cui parla. Altrimenti chiunque potrebbe cancellarsi per uscirne. Non contiene nessuna registrazione di nessuna chiamata, né qui né altrove, perché non ne viene mai fatta nessuna.

Colonne che non esistono

  • email
  • nome
  • età
  • foto
  • testo dei messaggi
  • contenuto delle chiamate
  • cronologia delle chiamate
  • elenco dei contatti
  • posizione
  • modello del dispositivo

La tua email viene controllata una volta sola quando ti registri e sigillata nello stesso istante, con una chiave che sta su carta dal fondatore e non ha mai toccato un server. La legge ci chiede di poter dimostrare che un adulto ha dato il consenso. Noi non riusciremmo a rileggerla. Nomi e foto si scelgono su ogni telefono e passano direttamente all’altro telefono. Da noi non arrivano mai, ed è anche per questo che puoi ribattezzare il nonno “Nonnino” e noi non lo sapremo mai. Non potremmo mostrare niente di tutto questo a nessuno nemmeno volendo, e non ci si potrebbe costringere.

Questa sezione è generata dallo schema stesso del server, in accounts.ts e roster-changes.ts, i due file che creano il database. Se un giorno non fossero d’accordo, hanno ragione i file e questa pagina è un bug.

Contatti

Come si crea davvero un contatto.

Il telefono di qualcuno crea un invito usa e getta. L’altro telefono lo legge, scansionato da uno schermo nella stessa stanza oppure aperto da un link mandato da quell’adulto. Leggerlo avvia la presentazione e, nello stesso istante, registra la chiave pubblica dell’altro telefono, così da quel momento entrambi i telefoni sanno esattamente quale chiave appartiene a chi. È la parte che rende impossibile mettersi in mezzo a una chiamata successiva, anche a noi. Niente di tutto questo è collegato finché un adulto dall’altra parte non ha detto sì.

Ancora non è un contatto. Un adulto responsabile deve firmare il contatto sul proprio telefono, dietro un controllo biometrico fatto in quel momento. Quello che firma è tutto quanto. Chi, con chi, e in quale direzione. La sua firma è ciò che il server controlla prima di instradare qualsiasi cosa. Il server non ha nessuna chiave capace di firmare, quindi non può creare un contatto, e non può farlo nemmeno chi gli rubasse il database.

Quando entrambi i telefoni hanno il contatto finito, la riga viene cancellata e il contatto esiste solo sui due dispositivi. Tagliarlo più avanti scrive una revoca firmata, che è l’unica registrazione conservata a tempo indeterminato. È salvata come hash della coppia, quindi dice che un contatto è finito senza dire chi conosceva chi.

Chi altro c’entra

Tre aziende toccano una chiamata. Nessuna può sentirla.

Altre sei aziende toccano il servizio, e sono tutte elencate nella privacy policy. Tre di loro servono a far arrivare una chiamata, ed ecco che cosa ognuna di quelle tre può e non può vedere.

  • Apple & Google

    Le notifiche push, così una chiamata fa squillare un telefono che dorme. Inevitabili su tutte e due le piattaforme. Portano un identificatore opaco e nient’altro. Nessun nome, nessun numero, nessun contenuto.

  • Cloudflare

    Circa una chiamata su sei non riesce a collegare i due telefoni direttamente, sul Wi-Fi di un albergo o su certe reti mobili, e viene fatta rimbalzare su un relay. Il relay inoltra pacchetti cifrati che non può aprire, ma vede che due identificativi anonimi sono stati collegati, quando, per quanto tempo e da quali indirizzi. Sono metadati che noi non conserviamo, in mano a qualcun altro.

  • Noi

    La tabella qui sopra. Un piccolo server nei Paesi Bassi che presenta due telefoni e poi si toglie di mezzo.