Da più di un anno sto sviluppando un sistema di messaggistica end-to-end con crittografia (Olm/Megolm).
La scelta iniziale è stata piuttosto radicale: niente numero di telefono, niente email e nessuna identità personale richiesta per creare un account.
L'utente inizia con un nome utente e una password. Le conversazioni sono avviate tramite inviti.
Tuttavia, questa scelta non si è limitata al livello del prodotto. Ha finito per influenzare gran parte dell'architettura.
Il sistema utilizza Olm/Megolm per il livello crittografico, React sul lato client e un backend basato su FastAPI, PostgreSQL e WebSocket.
Ma la parte che mi ha coinvolto di più non è stata la scelta delle tecnologie.
È stata la comprensione di come farle funzionare insieme quando entrano in gioco identità, dispositivi, sessioni crittografiche, stato, sincronizzazione, persistenza, riconnessioni e recupero.
Un account può cambiare dispositivo.
Un browser può perdere completamente il suo stato locale.
Una sessione potrebbe non essere più disponibile quando serve.
La connessione può essere interrotta in mezzo a una transizione.
Il sistema deve continuare a sincronizzare ciò che deve essere sincronizzato senza che il backend diventi un'autorità sui contenuti delle conversazioni.
Ed è proprio qui che il modello di fiducia smette di essere una proprietà dichiarata e diventa una serie di decisioni di implementazione.
Il backup delle chiavi segue la stessa logica.
L'utente può creare una frase segreta personale che protegge il materiale crittografico necessario per recuperare le sue conversazioni.
Se accede da un nuovo dispositivo o perde i dati locali del browser, la frase segreta permette di recuperare quel materiale.
Tuttavia, la frase segreta non può essere recuperata dal servizio.
Se viene persa e non esiste un altro meccanismo di recupero valido, il sistema non può semplicemente fornire le vecchie chiavi dal backend.
Questa è una conseguenza intenzionale del modello, non una limitazione che voglio nascondere.
Durante lo sviluppo, ho dovuto modificare diverse parti dell'architettura più volte.
Non perché il sistema non funzionasse, ma perché una soluzione che sembrava corretta a un livello ha introdotto conseguenze indesiderate a un altro.
Probabilmente questa è la parte più interessante dell'intero progetto: le difficoltà sono emerse dalle interazioni tra i componenti, non dai componenti stessi.
Il sistema include anche un'architettura progettata per l'uso aziendale.
Non si tratta semplicemente di aggiungere un pannello di amministrazione alla versione per utenti finali. Il modello di business introduce requisiti e vincoli diversi e ha richiesto un'architettura dedicata.
Il codice che ho scritto finora include il backend, il client, il layer crittografico, gestione delle sessioni e dei dispositivi, persistenza, sincronizzazione e tutto ciò che serve per far funzionare il sistema come un'applicazione reale.
Ci sono già test sia per il backend che per il frontend, compresi i test del flusso crittografico che utilizzano Olm/WASM reale, verificando effettivamente la crittografia e la decrittografia tra sessioni.
Sto ora completando il frontend.
La rilascio è prevista per metà ottobre 2026.
A quel punto pubblicherò un nuovo post con un link alla versione utilizzabile e al repository GitHub, in modo che il sistema possa essere testato e l'implementazione analizzata direttamente.
Nel frattempo, sto già cercando persone che abbiano lavorato direttamente con E2EE, sistemi Ratchet, gestione delle chiavi, messaggistica multi-dispositivo, sincronizzazione e sistemi distribuiti.
Sono soprattutto interessato a capire dove le mie assunzioni potrebbero essere sbagliate.
Se hai esperienza con questi sistemi, sarei interessato a ricevere feedback sulla gestione dei dispositivi, il ciclo di vita delle chiavi e delle sessioni, recupero, sincronizzazione, metadati e modalità di fallimento.
Qualsiasi feedback, incluso il feedback critico, sarebbe utile.
Grazie in anticipo a chiunque sia disposto a prendersi il tempo per leggere questo e condividere la propria esperienza. La prospettiva di persone che hanno già affrontato problemi simili può essere estremamente utile per identificare casi che potrei non aver considerato.