Design e sviluppo per founder consumer cloud
Una sola codebase Next.js su web, desktop e React Native. Un'architettura zero-knowledge con chiavi protette dall'hardware. Una lista che resta piatta a qualsiasi dimensione di dataset, perché l'ingegneria è stata dimensionata sulla proiezione, non sul carico attuale.
I problemi che sentiamo più spesso
Un sito di marketing in Webflow, un prodotto in un altro repo, e uno strato di traduzione tra due team
Il visitatore vede un mockup curato, si registra, e arriva in un prodotto diverso da quello che la landing prometteva. Il trimestre del lancio esce in due eventi che non si allineano mai del tutto.
Un MVP costruito per gli utenti della settimana scorsa, non per quelli dell'anno prossimo
La lista della libreria ridisegna l'intero DOM a ogni keystroke. La query dei file recenti scansiona la tabella. Il giorno in cui chiudi il round seed, il prodotto rallenta proprio prima che esca il comunicato stampa.
Una PWA dentro una WebView, venduta come app nativa
Il prompt di installazione esce grigio. Le notifiche push cadono. Il reviewer dello store la rifiuta alla terza submission, e il lancio scivola mentre il team riscrive in React Native.
Una storia sulla privacy che nessuno crede
Il marketing dice cifrato, l'ingegneria dice best-effort, l'audit di sicurezza dice che le chiavi dei client vivono sul server. Il prodotto perde proprio i clienti venuti per la privacy.
Cloude · un prodotto cloud consumer costruito per intero
Un prodotto cloud consumer su web, desktop e React Native. Una sola codebase Next.js, un solo design system, chiavi protette dall'hardware al centro, e un motore di sync che regge anche dentro una galleria.
Dentro la build di Cloude
Abbiamo costruito Cloude su web, desktop e React Native. Una sola codebase Next.js, un solo design system, un solo team. L'MVP è andato online, e il team che lo aveva messo in pista è rimasto dopo il lancio e ha costruito il prodotto consumer finale sulla stessa base. Un solo ingaggio, una sola codebase, nessuna seconda build.
Una codebase, due superfici
La prima decisione è stata strutturale. Un prodotto cloud consumer di solito spedisce sito di marketing e piattaforma prodotto da repo diversi, con team diversi e uno strato di traduzione in mezzo. Abbiamo sostenuto una sola codebase Next.js, un solo design system, un solo team. Il founder ha sposato l'argomento.
Il trade-off è onesto. Una codebase unificata significa che il team marketing non può spedire una modifica di copy senza coordinarsi col deploy ingegneristico, e il team prodotto deve pensare alla SEO quando rifattorizza un componente. Abbiamo accettato quei costi perché il vantaggio era più grande. Il sito di marketing incorpora il componente Files vivo del prodotto invece di un mockup, e quello che il visitatore vede in anteprima sulla landing è esattamente quello che ottiene al signup. Il trimestre del lancio è uscito in un unico evento di calendario, non in un lancio di marketing seguito da un lancio prodotto che nessuno sincronizza.
Ingegneria per la scala prima che arrivino gli utenti
L'MVP aveva una piccola coorte in early access quando siamo partiti. Il deck del seed proiettava un aumento di un ordine di grandezza entro il primo anno. Abbiamo ingegnerizzato sulla proiezione, non sul carico attuale.
La lista libreria è virtualizzata con un tetto fisso di righe a prescindere dal dataset, e il costo di rendering resta piatto mentre la libreria cresce. I file recenti arrivano da una sola query server indicizzata su (owner_id, accessed_at desc), e il piano di query resta costante per richiesta. Le pagine cartella e i recenti leggono da una cache local-first su IndexedDB, tenuta in sync col server tramite un motore di sync differenziale che spedisce solo i byte cambiati. Un laptop in galleria continua a lavorare, e una riconnessione recupera in un solo round.
Mobile è React Native, non una web app ridotta
La scorciatoia sarebbe stata una PWA dentro una WebView. Abbiamo fatto nativo. Il client React Native consuma gli stessi design token del web tramite un package condiviso, e un bump di un token si propaga in un solo commit a tutte le superfici. Il bundle è ingegnerizzato per restare sotto la soglia di hot-fetch dell'iOS App Store dopo il tree-shaking, e così gli aggiornamenti si scaricano in silenzio. Il trasporto è HTTP/3 su QUIC, con migrazione di connessione che sopravvive a un passaggio da Wi-Fi a LTE. Il primo frame interattivo su un Android di fascia bassa è lo stesso costo fisso indipendentemente dal dataset, perché la lista virtualizzata e la query indicizzata fanno il lavoro pesante dal lato server e non sul dispositivo.
Cifratura senza tassa di latenza
Questa è stata la decisione ingegneristica più difficile. La cifratura lato client di solito si presenta alla finestra delle tasse, con round trip aggiuntivi, cold start più lunghi, file che si aprono più lenti. Ci siamo rifiutati di spedire questa esperienza.
Lo storage è cifrato a riposo con AES-256-GCM. Le chiavi per account derivano via Argon2id dalla passphrase dell'utente e non sono mai memorizzate sul server. I file condivisi viaggiano cifrati con scambio di chiavi X25519. Le chiavi private vivono dentro l'iOS Secure Enclave e l'Android StrongBox, protette dall'hardware e resistenti all'estrazione anche su un dispositivo rooted. L'architettura è zero-knowledge, il server contiene solo blob opachi, e il server non vede mai una chiave decifrata.
Il penetration testing indipendente gira con cadenza ricorrente tramite una società di sicurezza terza. Un programma pubblico di disclosure delle vulnerabilità eredita da quel lavoro ed è ancora attivo. I clienti verificano la promessa invece di crederla sulla parola.
Perché questa forma conta per un founder consumer
Un prodotto cloud consumer non è una landing curata più un file sync generico. È il trimestre del lancio in cui marketing e prodotto escono insieme, il cold-start quando l'utente apre l'app in treno e la libreria rende prima che la rete risponda, il momento in cui un ricercatore legge l'architettura e riconosce che la cifratura è reale, e il giorno in cui chiudi il round seed e gli utenti raddoppiano senza che il prodotto rallenti. Cloude è la forma di lavoro che chiude tutto quel cerchio sotto una sola codebase e un solo design system, non tre repo che vedono ognuno una fetta dell'utente.
Quello che il lavoro ha consegnato
Una sola codebase Next.js su web, desktop e React Native. Chiavi protette dall'hardware su iOS e Android. Un'architettura zero-knowledge verificata da penetration testing indipendente. Una lista libreria virtualizzata con un costo di rendering costante a qualsiasi dataset. Un motore di sync differenziale che recupera in un solo round dopo una riconnessione.
Cosa consegniamo in questo verticale
Una codebase, tre superfici
Sito di marketing, prodotto web e client React Native vivono in un solo repo Next.js, con un solo design system. La landing di marketing incorpora il componente Files vivo del prodotto, e il visitatore vede in anteprima quello che riceve dopo il signup.
Architettura zero-knowledge
Il server contiene solo blob opachi e non vede mai una chiave decifrata. Le chiavi per account derivano dalla passphrase dell'utente via Argon2id e non lasciano mai il dispositivo.
Chiavi di cifratura protette dall'hardware
Le chiavi private vivono dentro l'iOS Secure Enclave e l'Android StrongBox. Resistono all'estrazione anche su un dispositivo rooted.
Condivisione file cifrata
I file condivisi viaggiano cifrati con scambio di chiavi X25519 tra i destinatari. AES-256-GCM a riposo, nessun testo in chiaro su nessun filo.
Motore di sync differenziale
Sul filo passano solo i byte cambiati. Un laptop in galleria continua a lavorare, e una riconnessione recupera in un solo round.
Cache local-first su IndexedDB
Le pagine cartella e i recenti leggono dallo storage locale e si riconciliano col server in background. Il primo paint è immediato, la staleness è limitata.
Lista libreria virtualizzata
Il costo di rendering resta piatto qualunque sia la dimensione del dataset. Mille file e un milione di file disegnano lo stesso numero di righe.
Piano di query indicizzato per i percorsi caldi
I file recenti arrivano da un'unica query server indicizzata su (owner_id, accessed_at desc). Il piano di query resta costante per richiesta, niente scan dell'intera tabella mentre cresce.
Client React Native con design token condivisi
Il client mobile consuma gli stessi design token del web tramite un package condiviso. Un bump di un token si propaga in un solo commit a tutte le superfici.
Trasporto HTTP/3 su QUIC
La migrazione di connessione sopravvive a un passaggio da Wi-Fi a LTE senza un nuovo handshake. Il primo frame interattivo su Android resta a costo fisso qualunque sia il dataset.
Bundle pronto per lo store sotto la soglia hot-fetch
Il bundle React Native resta sotto la soglia di hot-fetch dello iOS App Store dopo il tree-shaking, e gli aggiornamenti si scaricano in silenzio in background.
Programma di penetration testing
Una società di sicurezza terza con cadenza ricorrente. Il report di ogni intervento è archiviato e i findings sono tracciati fino alla remediation.
Disclosure pubblica delle vulnerabilità
Un programma di disclosure documentato con tempi di risposta dichiarati. Chi fa ricerca sa dove mandare una segnalazione e cosa aspettarsi.
Recupero in caso di passphrase persa
Chiavi di recupero opzionali in shard, con un'interfaccia che chiarisce che senza queste, una passphrase persa significa dati persi.
Uno stack che non fa pagare l'utente per la privacy
Ogni livello qui esiste per ripagarsi due volte: la prima quando stai mettendo online la prima versione del prodotto, la seconda quando sopravvivi a una revisione di sicurezza o a un ciclo di stampa sulla privacy e l'architettura è la risposta. Scegliamo lo stack che regge proprio in quel secondo momento.
Next.js App Router come unico runtime. Sito di marketing, prodotto web, e superficie API per il client React Native vivono tutti in un solo repo. Le pagine di marketing rendono in modo statico e le pagine prodotto rendono in modo dinamico, ma i design token, la tipografia e i componenti sono gli stessi su entrambe. Il team marketing e il team engineering lavorano nella stessa codebase, e questo costa coordinamento su un cambio di copy e fa risparmiare uno strato di traduzione su una riprogettazione.
React Native per il client mobile, con gli stessi design token condivisi tramite un singolo package. Un bump di un token nel design system si propaga in un solo commit a web, desktop e mobile. Il bundle resta sotto la soglia di hot-fetch dell'iOS App Store dopo il tree-shaking, e gli aggiornamenti si scaricano in silenzio. Il client Android si appoggia a StrongBox, il client iOS al Secure Enclave, con chiavi protette dall'hardware e nessuna via di estrazione anche su un dispositivo rooted.
Architettura dati zero-knowledge. I file sono cifrati lato client con AES-256-GCM, con chiavi per account derivate dalla passphrase dell'utente via Argon2id e mai memorizzate sul server. I file condivisi viaggiano cifrati con scambio di chiavi X25519 tra i destinatari. Il server contiene blob opachi, accesso solo tramite URL firmata, e non vede mai una chiave decifrata. Il report di penetration testing e il programma pubblico di disclosure delle vulnerabilità danno al cliente qualcosa da verificare, invece di qualcosa di cui fidarsi sulla parola.
Cache local-first con un motore di sync differenziale. Le pagine cartella e i recenti leggono prima da IndexedDB e si riconciliano col server in background. Sul filo passano solo i byte cambiati. Un laptop in galleria continua a lavorare, e una riconnessione recupera in un solo round. La lista libreria è virtualizzata con un tetto fisso di righe, così il costo di rendering resta piatto a qualsiasi dataset, e i file recenti arrivano da una sola query server indicizzata su (owner_id, accessed_at desc), così il piano di query resta costante per richiesta.
HTTP/3 su QUIC per il trasporto. La migrazione di connessione sopravvive a un passaggio da Wi-Fi a LTE senza un nuovo handshake. Il primo frame interattivo su un Android di fascia bassa è lo stesso costo fisso che la libreria abbia mille o un milione di file, perché la lista virtualizzata e la query indicizzata fanno il lavoro pesante dal lato giusto del filo.
TypeScript strict dal dispositivo al server. I rename restano sicuri, le migrazioni di schema restano verificabili, il bus factor resta a zero. Quando l'ingegnere che ha costruito il motore di sync lascia il team, il successivo legge le firme dei tipi e va in produzione.
Domande che fanno i founder
Come garantite che non potete leggere i dati degli utenti?
Le chiavi per account derivano dalla passphrase dell'utente via Argon2id e non lasciano mai il dispositivo. I file sono cifrati lato client con AES-256-GCM prima che entrino sul filo. Il server contiene solo blob opachi, accesso esclusivo tramite URL firmata. Il report di penetration testing e il programma pubblico di disclosure delle vulnerabilità sono il modo in cui il cliente verifica la promessa, invece di crederla sulla parola.
Perché React Native e non una PWA in WebView?
Una WebView non vede né Secure Enclave né StrongBox. Le chiavi protette dall'hardware non sono negoziabili su un prodotto privacy, quindi il client mobile deve essere nativo. Il client React Native riusa anche i design token dal package web, e il costo del nativo si paga una volta sola a livello di design system, non a ogni superficie.
Come evitate che la cifratura rallenti il prodotto?
Nessun round trip aggiuntivo sul percorso di lettura. La decifratura avviene lato client dopo che i byte sono arrivati. Le chiavi condivise si scambiano via X25519, abbastanza veloce da rendere l'apertura a freddo di un file condiviso indistinguibile da uno non condiviso. Il costo di latenza che la maggior parte dei prodotti paga per la cifratura lato client è quasi tutto architetturale, non crittografico.
E se l'utente perde la passphrase?
Al signup offriamo chiavi di recupero opzionali in shard, con un'interfaccia che chiarisce che senza queste, una passphrase persa significa dati persi. Ci rifiutiamo di spedire una via di recupero backdoor che si dichiara privata e non lo è.
Come scalate prima ancora che arrivino gli utenti?
La lista libreria è virtualizzata, quindi il costo di rendering resta piatto a qualsiasi dataset. I file recenti arrivano da una sola query indicizzata, quindi il piano di query resta costante per richiesta. Le viste cartella e recenti leggono dalla cache locale su IndexedDB, quindi il primo paint è immediato a prescindere dalla rete. Progettiamo sulla proiezione, non sul carico attuale.
Come gestite la review degli store?
Abbiamo già spedito iOS e Android attraverso le pipeline di review di Apple e Google per un prodotto privacy, e quindi conosciamo le domande che il reviewer farà su crittografia, eliminazione account ed export dati. Il bundle resta sotto la soglia di hot-fetch dell'iOS, e gli aggiornamenti silenziosi funzionano.
Vi occupate del penetration testing?
No. Lavoriamo a fianco della società di sicurezza che portate voi, oppure suggeriamo partner con cui abbiamo già spedito progetti. Gli esiti dell'intervento finiscono nell'archivio compliance del cliente, e i findings entrano nel nostro tracker per la remediation.
Cosa succede quando l'utente è offline?
La cache local-first tiene in piedi ogni lettura. Le scritture si mettono in coda su IndexedDB e si ripropagano quando il link torna. Il motore di sync differenziale spedisce solo i byte cambiati alla riconnessione, e una finestra offline lunga non si trasforma in una sync lunga.
Raccontaci il tuo prodotto consumer
Una chiamata per inquadrare il progetto, un numero concreto nella prima risposta, zero teatro da agenzia e zero pitch deck di case study tutti uguali.