Descripción
Unnoticed es una app colaborativa de fotografía. Los usuarios crean viajes, toman fotos en rondas basadas en prompts creativos asignados por rol, y votan por las mejores tomas. Las fotos están protegidas con encriptación de extremo a extremo: ni siquiera el servidor puede verlas, solo los participantes del viaje.
Proyecto colaborativo desarrollado en la Apple Developer Academy de Nápoles con un equipo internacional. Es el proyecto más completo y ambicioso que he liderado en la Academy.
Problemática
Las actividades de fotografía en grupo carecen de estructura y diversión. Las apps existentes para compartir fotos no crean una experiencia de juego colaborativa con restricciones creativas. Queríamos algo que motivara a las personas a ver el mundo desde perspectivas diferentes, guiadas por prompts y roles asignados.
Mi rol
Líder técnico y de proyecto. Definí la arquitectura completa (monorepo, backend, base de datos, almacenamiento en la nube), levanté los requerimientos con el equipo, implementé el backend y la API REST, diseñé el ciclo de vida del producto, elegí la infraestructura, configuré el entorno de desarrollo y establecí la metodología de trabajo (Scrum con Jira, CI/CD). También lideré la organización general del equipo: sprint planning, división de trabajo y estándares de calidad de código.
Decisiones técnicas
- Monorepo: una sola fuente de verdad para iOS, backend y landing page. Facilita compartir configuración y que todo el equipo entienda la arquitectura completa.
- Cloudflare R2 sobre Amazon S3: elegido por el precio (sin cargos por egreso de datos), la facilidad de configuración y la compatibilidad con la API de S3 para una posible migración futura.
- Encriptación de extremo a extremo: el servidor es zero-knowledge. Las fotos se cifran antes de salir del teléfono y solo los dispositivos de los participantes pueden descifrarlas. Lideré la decisión y los requerimientos; la implementación la llevó un compañero del equipo.
- Caché inteligente de imágenes: sistema de caché en memoria y disco con deduplicación de solicitudes. Adaptado después para manejar fotos encriptadas: descifra una sola vez y almacena el resultado.
- Sin login/registro: decisión de producto para priorizar la velocidad de onboarding en el prototipo. El usuario puede crear o unirse a un viaje en segundos.
- Ciclo de vida de viaje: una máquina de estados que guía toda la experiencia del producto, desde la creación del viaje hasta los resultados finales.
Aprendizajes clave
- Liderar un equipo no es hacer todo: es crear las condiciones para que el equipo trabaje bien. Definir arquitectura, estándares y procesos es tan importante como escribir código.
- Saber delegar y definir requerimientos claros es tan valioso como implementar. La encriptación E2E es la feature de la que más orgulloso estoy, y no la escribí yo.
- Los problemas más frecuentes en desarrollo en equipo no son bugs técnicos, son de colaboración y calidad de código. Establecer reglas de desarrollo temprano ahorra horas de merge conflicts.
- Elegir la infraestructura correcta (R2 vs S3, monorepo vs multi-repo) son decisiones que impactan todo el ciclo de vida del proyecto.