Icona dell'app Unnoticed

Descrizione

Unnoticed è un’app collaborativa di fotografia. Gli utenti creano viaggi, scattano foto in round basati su prompt creativi assegnati per ruolo, e votano per gli scatti migliori. Le foto sono protette con crittografia end-to-end: nemmeno il server può vederle — solo i partecipanti al viaggio possono.

Progetto collaborativo sviluppato all’Apple Developer Academy di Napoli con un team internazionale. È il progetto più completo e ambizioso che ho guidato all’Academy.

Problema

Le attività fotografiche di gruppo mancano di struttura e divertimento. Le app esistenti per condividere foto non creano un’esperienza di gioco collaborativa con vincoli creativi. Volevamo qualcosa che motivasse le persone a vedere il mondo da prospettive diverse, guidate da prompt e ruoli assegnati.

Il mio ruolo

Tech lead e project lead. Ho definito l’architettura completa (monorepo, backend, database, cloud storage), raccolto i requisiti con il team, implementato il backend e l’API REST, progettato il ciclo di vita del prodotto, scelto l’infrastruttura, configurato l’ambiente di sviluppo e stabilito la metodologia di lavoro (Scrum con Jira, CI/CD). Ho anche guidato l’organizzazione generale del team: sprint planning, divisione del lavoro e standard di qualità del codice.

Decisioni tecniche

  • Monorepo: un’unica fonte di verità per iOS, backend e landing page. Facilita la condivisione della configurazione e permette a tutto il team di comprendere l’architettura completa.
  • Cloudflare R2 rispetto ad Amazon S3: scelto per il prezzo (nessun costo per l’uscita dei dati), la facilità di configurazione e la compatibilità con l’API di S3 per una possibile migrazione futura.
  • Crittografia end-to-end: il server è zero-knowledge. Le foto vengono cifrate prima di lasciare il telefono e solo i dispositivi dei partecipanti possono decifrarle. Ho guidato la decisione e i requisiti; l’implementazione è stata realizzata da un compagno di team.
  • Cache intelligente delle immagini: sistema di cache in memoria e su disco con deduplicazione delle richieste. Successivamente adattato per gestire foto crittografate: decifra una sola volta e memorizza il risultato.
  • Senza login/registrazione: decisione di prodotto per dare priorità alla velocità di onboarding nel prototipo. Gli utenti possono creare o unirsi a un viaggio in pochi secondi.
  • Ciclo di vita del viaggio: una macchina a stati che guida l’intera esperienza del prodotto, dalla creazione del viaggio ai risultati finali.

Apprendimenti chiave

  • Guidare un team non è fare tutto: è creare le condizioni perché il team lavori bene. Definire architettura, standard e processi è importante quanto scrivere codice.
  • Saper delegare e definire requisiti chiari è tanto prezioso quanto implementare. La crittografia E2E è la feature di cui sono più orgoglioso, e non l’ho scritta io.
  • I problemi più frequenti nello sviluppo in team non sono bug tecnici, ma di collaborazione e qualità del codice. Stabilire regole di sviluppo presto fa risparmiare ore di merge conflict.
  • Scegliere l’infrastruttura giusta (R2 vs S3, monorepo vs multi-repo) sono decisioni che impattano l’intero ciclo di vita del progetto.