Gestito da noi invece che acquistato
Il tracciamento degli errori gira su un'istanza GlitchTip ospitata da noi, sulla nostra infrastruttura Scaleway: i report dei crash non lasciano i nostri server. E non contengono te: prima che un report venga inviato, vengono rimossi identità dell'utente, IP, cookie, header, token di autorizzazione, corpo della richiesta e query string. Il corpo è la parte importante, perché altrimenti lì ci sarebbero i contenuti delle note e le ricerche. Il tracing delle prestazioni è disattivato per impostazione predefinita. Le statistiche delle visite di questo sito sono senza cookie (Plausible, UE) e nell'app non ce ne sono affatto.
Chiavi che possono fare una cosa sola
Le chiavi di accesso seguono il principio del privilegio minimo: ogni sistema riceve solo i permessi di cui ha davvero bisogno. Esempio: il deploy automatico di questo sito non detiene una chiave CDN valida per l'intero account, solo un token che sa fare esattamente una cosa: svuotare la cache di queste pagine. Le chiavi centrali stanno nel Secret Manager di Scaleway, non in sistemi di build esterni.
La separazione sta nel database, non nel codice
Nella maggior parte dei servizi è il codice applicativo a impedirti di vedere i dati altrui. Basta allora un «where user = …» dimenticato in una sola query per avere una fuga di dati. In Memexa la separazione sta un livello più in basso: PostgreSQL la impone tramite la row-level security. Senza un contesto utente impostato, il database non restituisce alcuna riga: non quelle sbagliate, proprio nessuna. Il contesto viene impostato per transazione e decade automaticamente alla sua chiusura, quindi non può passare alla connessione successiva del pool. Perché resti così, insieme ai test gira un controllo che scatta non appena compare una nuova tabella senza row-level security o senza una classificazione esplicita: la build fallisce invece di passare in silenzio.
Cosa può fare la tua IA lo decidi tu, e puoi revocarlo
Claude, ChatGPT e Cursor non ricevono una chiave universale. L'accesso passa per OAuth: prima di autorizzare vedi quale app IA lo chiede e dove va l'accesso, e lo confermi tu. Il clipper del browser e l'accesso IA completo hanno autorizzazioni separate: il clipper può archiviare, non cercare tra i tuoi contenuti. Puoi scollegare le app IA collegate in qualsiasi momento in Memexa; inoltre un'app IA può restituire il proprio accesso di sua iniziativa. E il controllo degli accessi non dipende da un unico punto centrale: ogni interfaccia verifica da sé la sessione, così un errore in un punto non apre tutto.
Eliminare significa eliminare: in quest'ordine
Puoi eliminare il tuo account da solo, con conferma via e-mail. Quello che succede poi è volutamente capovolto: prima vengono rimossi tutti i file dall'object storage, sull'intero prefisso dell'utente, quindi compresi i file orfani che non appartengono più a nessuna voce. Solo dopo vengono eliminati i record del database. Se l'eliminazione dei file non riesce, l'intera operazione si interrompe e il tuo account resta, invece di ritrovarti con i dati di gestione cancellati e i documenti ancora lì. L'operazione si può ripetere senza rischi. I singoli contenuti puoi eliminarli uno per uno in qualsiasi momento, senza toccare l'account.
Le linee in mezzo
Ogni tratta è cifrata: TLS 1.2 o superiore all'edge, le versioni più vecchie sono disattivate; anche le connessioni al database verificano certificato e nome host, non solo «cifrate in qualche modo». Il database si trova in una rete privata senza indirizzo pubblico. Davanti ci sono un WAF e una protezione DDoS, e il server di origine accetta solo richieste dalla rete della CDN: non lo si raggiunge direttamente. Il container dell'applicazione gira senza privilegi di root, le dipendenze vengono compilate da un lockfile bloccato, e l'unico binario esterno di cui abbiamo bisogno è vincolato a una versione e a un checksum.