rilo
Mascottevos Rilo naast een schild met een hangslot erop

Nu even technisch.

Alles wat de voorpagina zegt, uitgeschreven als datgene waaruit het is opgebouwd: de echte database, hoe een contact echt tot stand komt, en wie een gesprek nog meer aanraakt.

Je hebt deze pagina niet nodig om Rilo te gebruiken, en niets hier spreekt de eenvoudigere versie tegen. Het is hetzelfde product, alleen precies beschreven.

De volledige database

Alles wat onze server over jouw gezin weet.

Geen samenvatting. Dit zijn de zeventien tabellen die de server heeft, met de kolommen die ze hebben. Vier gaan over je gezin: wie ze zijn, wie voor een kind mag optreden, de telefoons waarvandaan ze praten, en waar je ze kunt bereiken. Vier houden iets vast voor een telefoon die uit stond, en alle vier wissen zichzelf. Drie gaan over wie voor een kind mag optreden en welke telefoon niet langer vertrouwd wordt. Twee zijn ondertekende sporen van een einde: een contact dat is doorgeknipt, of iemand die weg is. Ze blijven staan zodat een telefoon die offline was ze kan controleren in plaats van ons te geloven. Eén zijn gebruikte eenmalige nummers, opgeruimd zodra ze verlopen. Eén is het abonnement, en die bevat niets waar een naam in staat. Eén is een melding die een volwassene ons stuurde, en dat is de enige tabel hier die bestaat om iets te laten gebeuren. De laatste gaat helemaal niet over je gezin.

accounts bewaard tot je het verwijdert
  • ideen hash van de publieke sleutel, geen naam
  • public_keyde sleutel van het toestel, die het account is
  • typevolwassene of kind
  • type_certde handtekening die dat bewijst. Een kindaccount wordt door een ouder ondertekend, dus er is geen vlaggetje om om te zetten
  • created_at
  • last_activede laatste keer dat een van je telefoons hallo zei
  • dormant_warned_atleeg
  • consent_sealedje aanmeld-e-mail, verzegeld met een sleutel die op papier bij de oprichter ligt. Geen server kan hem lezen
  • uncovered_sinceleeg, tenzij je abonnement dit kind niet meer dekt — dan de dag waarop we het merkten, zodat de maand voordat er iets stopt vanaf dan loopt
Je accountrij blijft staan tot je hem verwijdert, en verwijderen in de app neemt deze rij en alles wat eraan hangt mee. We werken eraan om gezinnen die Rilo helemaal niet meer gebruiken op te ruimen. Zolang dat niet aan staat, verdwijnt hier niets vanzelf.
server_state bewaard
  • keywat er onthouden wordt
  • valueen wat het zegt
De enige tabel hier die helemaal niet over jouw gezin gaat. Vandaag staat er één ding in: het moment waarop deze versie van de server voor het eerst draaide. Elke vraag over wie er stil is geworden wordt vanaf dat moment gemeten, zodat een database van voordat we het konden zien nooit gelezen kan worden als maanden stilte.
guardians bewaard
  • account_id
  • guardian_keyeen sleutel die voor dit kind mag handelen
  • added_at
  • removed_at
Verwijderen wordt aangetekend, niet uitgewist. Contacten worden getoetst aan wie voogd was toen het contact werd ondertekend, zodat een vertrekkende ouder niet stilletjes elke vriendschap doorknipt die hij ooit heeft goedgekeurd.
devices bewaard
  • account_id
  • device_keyde eigen sleutel van één telefoon. Iemand kan vanaf meer dan één toestel praten
  • agreement_keyde sleutel waaraan een bericht wordt verzegeld, zodat alleen die telefoon het kan openen
  • certde handtekening die deze telefoon binnenliet, woord voor woord bewaard zodat je telefoon hem kan controleren in plaats van ons te geloven
  • kindeen telefoon, of het geprinte herstelpapier
  • added_at
  • removed_at
De telefoons en tablets waarvandaan één persoon praat. Het zegt hoeveel toestellen jouw gezin heeft en helemaal niets over met wie je praat, niet meer dan de twee tabellen erboven. Een telefoon wordt binnengelaten door een handtekening van een toestel dat al op de lijst staat, nooit door ons, en die handtekening staat hier zodat elke telefoon hem kan controleren in plaats van de lijst te geloven. Een telefoon uit dienst nemen tekent de rij aan in plaats van hem te wissen, om dezelfde reden als bij een vertrekkende volwassene: alles wat hij ondertekende toen hij van jou was, moet controleerbaar blijven.
push_tokens bewaard
  • account_id
  • device_keywelke van je telefoons deze laat overgaan
  • platformapns of fcm
  • tokeneen betekenisloos handvat van Apple of Google
  • updated_at
Eén per toestel, zodat een oproep een slapende telefoon kan laten overgaan. De pushmelding bevat geen naam en geen inhoud.
used_nonces opgeruimd
  • nonce
  • expires_at
Een lijst van al gebruikte eenmalige getallen, zodat een onderschept verzoek niet opnieuw kan worden afgespeeld. Wordt gewist zodra het verloopt.
denied_edges opgeruimd
  • edge_hasheen hash van het paar, niet van de twee personen
  • denied_at
  • expires_at
Als een volwassene nee zegt tegen een introductie, onthoudt dit die nee drie dagen, zodat de telefoon van de andere ouder, die toen uitstond, hem niet per ongeluk alsnog kan afronden. Opnieuw scannen tussen dezelfde gezinnen wist hem eerder. Geen namen, geen sleutels: een hash en twee datums.
pending_grants opgeruimd
  • edge_hasheen hash van het paar, niet van de twee personen
  • grant_recordde toestemming waarover beslist wordt, en de handtekeningen die er tot nu toe zijn
  • waiting_keywiens handtekening nog ontbreekt
  • requested_byde telefoon die het vroeg, zodat één telefoon een gezin niet kan overspoelen met vragen
  • originin persoon gescand, of een ouder die namens het kind handelt
  • delivered_towelke telefoons het al hebben
  • declaredde eigen naam van de vragende kant, verzegeld zodat alleen het gescande gezin hem kan lezen
  • created_at
  • expires_at
Dit is de enige plek waar de server iets bewaart dat op een sociaal netwerk lijkt, en hij bewaart het alleen zolang een kennismaking onafgerond is. Niemand antwoordde binnen 72 uur: het vervalt. Wel beantwoord, maar de telefoon waarvoor het bedoeld was kwam nooit online: 30 dagen. Zodra beide telefoons het afgeronde contact hebben, wordt de rij gewist. Daarom staat er op deze pagina geen tabel met contacten. Er is geen tabel met contacten.
messages gewist bij bezorging
  • id
  • recipient_idvoor het routeren moet deze leesbaar zijn
  • recipient_devicevoor welke van hun telefoons het doosje verzegeld is. Elke telefoon heeft een eigen sleutel, dus elke telefoon krijgt een eigen doosje
  • sender_idzodat de telefoon weet met wiens sleutel hij het opent
  • sender_devicewelke van hun telefoons hem verzegelde, zodat de juiste kopie het juiste slot vindt
  • edge_hashhet paar, gehasht, zodat dit niet te lezen is als een kaart van wie met wie praat
  • sealedversleutelde tekst. Er is geen tekstkolom en die komt er ook nooit
  • sent_at
  • expires_at
Een telefoon staat het grootste deel van de dag uit, en een bericht dat stilletjes verdwijnt is een kapot product. Dus wacht hier een verzegeld doosje: hoogstens 30 dagen, en gewist zodra de ontvanger bevestigt dat hij het heeft. Wij kunnen er geen openen.
revocations bewaard
  • edge_hashhet paar, gehasht
  • revoked_at
  • recordhet ondertekende bewijs, zodat een telefoon die offline was het verbreken zelf kan controleren in plaats van ons op ons woord te geloven
Het enige wat we onbeperkt bewaren. Het legt vast dat een contact is verbroken, zonder een leesbare lijst te zijn van wie wie kende.
roster_changes bewaard
  • id
  • account_idwiens lijst met telefoons en volwassenen verandert
  • kinderbij komen, of eraf gaan
  • subject_keyde telefoon of de volwassene waar het over gaat
  • subject_kindwelke van die twee
  • agreement_keyde tweede sleutel die een telefoon nodig heeft, leeg voor papier
  • recordde handtekening zelf, woord voor woord bewaard zodat een telefoon hem kan controleren in plaats van ons te geloven
  • signed_bywelke sleutel hem heeft ondertekend
  • by_authorityof een herstelpapier hem heeft ondertekend, en dat is wat hem laat wachten
  • issued_athet moment dat de ondertekenaar noemt, nooit onze klok
  • reasonleeg, tenzij de ondertekenaar er een schreef
  • proposed_at
  • effective_atwanneer het echt wordt, twee nachten nadat het is voorgesteld
  • contested_at
  • contested_bywie bezwaar maakte, en met welke handtekening
  • contest_record
  • resolved_at
  • resolutiontoegepast of geannuleerd, zodra het rond is
De twee nachten tussen het moment dat iemand een wijziging aan de volwassenen van een kind ondertekent en het moment dat die wijziging echt wordt. Een telefoon die bij een gezin komt, of eentje die eraf gaat, wacht hier waar elke andere telefoon op het account het kan zien en bezwaar kan maken. De rij blijft staan nadat het rond is, want een telefoon die uit stond moet kunnen controleren wat er gebeurd is in plaats van ons op ons woord te geloven. Er staan het account en de betrokken sleutels in, en dat is meer dan de meeste tabellen hier.
roster_change_votes bewaard
  • change_idwelke wachtende wijziging
  • voter_keywelke volwassene
  • decisiondoorlaten, of tegenhouden
  • recordhun handtekening
  • at
Eén rij per volwassene in plaats van een teller. Een meerderheid van de volwassenen van een kind kan de wachttijd van twee nachten vroeger beëindigen, en of er een meerderheid is moet opnieuw gevraagd worden aan de volwassenen die er nú zijn. Iemand die vertrokken is, is geen stem, en een teller zou dat niet weten.
device_revocations bewaard
  • account_idwiens telefoon het was
  • device_keyde sleutel die gestolen is
  • revoked_at
  • recordhet ondertekende bewijs, zodat een telefoon het kan controleren zonder het ons te vragen
Een gestolen telefoon, en het verschil tussen dit en een telefoon uit dienst nemen. Uit dienst nemen betekent dat hij vanaf nu niets meer kan doen, en dat klopt voor een telefoon die iemand vervangen heeft. Dit betekent: wantrouw alles wat hij ooit heeft ondertekend, en dat moeten andere telefoons kunnen controleren zonder het ons te vragen. Alleen diefstal krijgt een rij.
retirements bewaard
  • account_idhet account dat weg is
  • retired_at
  • recordhet ondertekende bewijs, gemaakt met de eigen sleutel van dat account voordat die sleutel werd vernietigd
Een lijst van afwezigheden, en het goede nieuws is de tweede kolom. Als iemand bij Rilo weggaat, krijgen de telefoons van hun vrienden een handtekening die met de eigen sleutel van die persoon is gezet. Een gezin hoort dus uit een bewijs dat iemand weg is, en niet omdat wij het zeggen. Niets wat wij op eigen houtje zeggen kan een gezicht van het scherm van je kind halen. Het is de enige tabel hier zonder verwijzing terug naar een account, omdat hij het account waar hij over gaat moet overleven.
entitlements bewaard
  • account_id
  • storeapple, google, of van het huis
  • store_refeen ondoorzichtige verwijzing van de winkel. Het is het enige waarmee we die later iets kunnen vragen
  • store_ref_hasheen vingerafdruk van de verwijzing hierboven. Die zorgt dat één aankoop niet voor twee accounts kan gelden
  • environment
  • stateactive, grace, lapsed, lapsed_trial of disabled
  • seatsvoor hoeveel kinderen het geldt. Een aantal, nooit hun namen
  • expires_at
  • acts_at
  • updated_at
Niets hier identificeert een persoon: geen store-account, geen Apple ID, geen Google-account, geen naam, geen e-mailadres, geen kaart. Welke kinderen een betaling dekt, wordt op het moment van vragen afgeleid uit de guardians-tabel en nooit opgeslagen.
roster_notices opgeruimd
  • device_keyde telefoon die het nog niet te horen heeft gekregen
  • change_idover welke verandering dit gaat
  • whatvoorgesteld, aangevochten of beslist
  • account_idwiens lijst met telefoons veranderde. Als een volwassene iets over hun kind te horen krijgt, is dit het kind
  • subject_keyde telefoon die erbij kwam of eraf ging
  • effective_at
  • created_at
  • expires_at
  • delivered_atwanneer we het hebben kunnen zeggen, of leeg omdat het nog niet gelukt is
Een wachtrij, en de reden dat een telefoon toevoegen of verwijderen hardop gebeurt. Elke telefoon in het gezin hoort het, en bij een kind ook elke volwassene die voor hen verantwoordelijk is, inclusief de telefoon die zojuist verwijderd is. Zo komt iemand die hem niet hoort te hebben erachter dat het je is opgevallen. Een melding bevat niets wat niet ook in de verandering zelf zit, en wordt gewist zodra ze verloopt, of we haar nu hebben kunnen bezorgen of niet.
reports bewaard
  • id
  • about_keyover wie de melding gaat. Leesbaar, zodat iemand er iets mee kan doen
  • reasonwelke van zes dingen er gebeurd is, zoals de volwassene die meldt het gekozen heeft
  • csa
  • sealedwat er geschreven is, op de verzendende telefoon verzegeld met een sleutel die op papier bij de oprichter ligt. Geen server kan het lezen
  • sealed_digesteen vingerafdruk van het verzegelde deel, zodat wat later geopend wordt aantoonbaar is wat er aankwam
  • received_at
  • edge_snapshotwie tot wie toegang had, en welke volwassene dat had toegestaan, zoals het op dat moment stond. Dit valt later niet te reconstrueren
  • reporter_keywie het gestuurd heeft, of helemaal niets als het zonder naam gestuurd is
  • source
  • sealed_key
  • receipthet kenmerk dat de verzender bewaart. Het is de enige manier waarop we iemand kunnen antwoorden over een melding die we niet kunnen openen
  • acknowledged_at
  • decided_at
  • actioned_at
  • escalated_at
  • decided_by
  • outcome
De enige tabel hier die bestaat om iets te laten gebeuren. Het grootste deel van een melding is verzegeld op de telefoon die hem verstuurde en wij kunnen die niet openen. Wat leesbaar blijft is over wie hij gaat, want een melding waar niemand iets mee kan is geen bescherming. Hij blijft bestaan nadat het account waarover hij gaat verdwenen is. Anders kon iedereen zichzelf eruit wissen. Er zit geen opname van een gesprek in, hier niet en nergens, want die wordt nooit gemaakt.

Kolommen die niet bestaan

  • e-mail
  • naam
  • leeftijd
  • foto
  • berichttekst
  • gespreksinhoud
  • belgeschiedenis
  • contactenlijst
  • locatie
  • toestelmodel

Je e-mailadres wordt bij het aanmelden één keer gecontroleerd en in dezelfde beweging verzegeld, met een sleutel die op papier bij de oprichter ligt en nooit een server heeft aangeraakt. De wet vraagt dat we kunnen bewijzen dat een volwassene toestemde. We zouden het niet kunnen teruglezen al wilden we het. Namen en foto’s worden op elke telefoon zelf ingesteld en rechtstreeks aan de andere telefoon doorgegeven. Ze bereiken ons nooit, en daarom kun je opa in de app noemen zoals jullie hem thuis noemen, zonder dat wij dat ooit weten. We zouden hier niets van aan iemand kunnen laten zien, ook al wilden we het, en we kunnen er ook niet toe gedwongen worden.

Deze sectie is gegenereerd uit het schema van de server zelf, in accounts.ts en roster-changes.ts, de twee bestanden die de database maken. Verschillen ze ooit, dan hebben de bestanden gelijk en is deze pagina de fout.

Contacten

Hoe een contact echt tot stand komt.

Iemands telefoon maakt een eenmalige uitnodiging. De andere telefoon leest die, gescand van een scherm in dezelfde kamer of geopend uit een link die de volwassene stuurde. Dat lezen start de kennismaking en legt op datzelfde moment de publieke sleutel van de andere telefoon vast, zodat beide telefoons voortaan precies weten welke sleutel bij welke persoon hoort. Dat is het stuk dat het onmogelijk maakt om later midden in een gesprek te gaan zitten, ook voor ons. Er gaat nog niets door voordat een volwassene aan de andere kant ja heeft gezegd.

Er is nog niets rond. Een verantwoordelijke volwassene moet het contact op de eigen telefoon ondertekenen, na een biometrische controle op datzelfde moment. Wat er ondertekend wordt is het geheel. Wie, met wie, en in welke richting. Die handtekening is wat de server controleert voordat hij ook maar iets doorstuurt. De server heeft geen enkele sleutel waarmee getekend kan worden, dus hij kan geen contact aanmaken, en wie de database steelt evenmin.

Zodra beide telefoons het afgeronde contact hebben, wordt de rij gewist en bestaat het contact alleen nog op de twee toestellen. Het later verbreken schrijft een ondertekende intrekking, en dat is het enige wat onbeperkt bewaard blijft. Die intrekking wordt opgeslagen als een hash van het paar, zodat ze vertelt dát een contact eindigde zonder te vertellen wie wie kende.

Wie er nog meer bij betrokken zijn

Drie bedrijven raken een gesprek aan. Geen van drieën kan het horen.

Zes andere bedrijven raken de dienst aan, en die staan allemaal in de privacyverklaring. Drie ervan zijn nodig om een oproep te laten overgaan. Dit is wat elk van die drie wel en niet kan zien.

  • Apple & Google

    Pushmeldingen, zodat een oproep een slapende telefoon laat overgaan. Op beide platforms onvermijdelijk. Ze bevatten een betekenisloos kenmerk en verder niets. Geen naam, geen nummer, geen inhoud.

  • Cloudflare

    Bij ongeveer één op de zes gesprekken lukt het niet om de twee telefoons rechtstreeks te verbinden, op hotelwifi of op sommige mobiele netwerken, en gaat het via een tussenstation. Dat tussenstation geeft versleutelde pakketjes door die het niet kan openen, maar het ziet wel dat twee anonieme kenmerken verbonden waren, wanneer, hoe lang en vanaf welke adressen. Dat zijn metagegevens die wij niet bewaren, en die iemand anders dus wel heeft.

  • Wij

    De tabel hierboven. Één kleine server in Nederland die twee telefoons aan elkaar voorstelt en zich daarna terugtrekt.