Description
Unnoticed is a collaborative photography app. Users create trips, take photos in rounds based on creative prompts assigned by role, and vote for the best shots. Photos are protected with end-to-end encryption: not even the server can see them ā only the trip participants can.
Collaborative project developed at the Apple Developer Academy in Naples with an international team. Itās the most complete and ambitious project Iāve led at the Academy.
Problem
Group photography activities lack structure and fun. Existing photo-sharing apps donāt create a collaborative game experience with creative constraints. We wanted something that would motivate people to see the world from different perspectives, guided by prompts and assigned roles.
My role
Tech lead and project lead. I defined the complete architecture (monorepo, backend, database, cloud storage), gathered requirements with the team, implemented the backend and REST API, designed the product lifecycle, chose the infrastructure, configured the development environment, and established the working methodology (Scrum with Jira, CI/CD). I also led the overall team organization: sprint planning, work division, and code quality standards.
Technical decisions
- Monorepo: a single source of truth for iOS, backend, and landing page. Makes it easy to share configuration and for the whole team to understand the complete architecture.
- Cloudflare R2 over Amazon S3: chosen for the price (no data egress charges), ease of setup, and compatibility with the S3 API for a potential future migration.
- End-to-end encryption: the server is zero-knowledge. Photos are encrypted before leaving the phone and only participantsā devices can decrypt them. I led the decision and requirements; the implementation was carried out by a teammate.
- Smart image caching: in-memory and disk caching system with request deduplication. Later adapted to handle encrypted photos: decrypts once and stores the result.
- No login/registration: a product decision to prioritize onboarding speed in the prototype. Users can create or join a trip in seconds.
- Trip lifecycle: a state machine that guides the entire product experience, from trip creation to final results.
Key learnings
- Leading a team isnāt doing everything: itās creating the conditions for the team to work well. Defining architecture, standards, and processes is as important as writing code.
- Knowing how to delegate and define clear requirements is as valuable as implementing. E2E encryption is the feature Iām most proud of, and I didnāt write it.
- The most frequent problems in team development arenāt technical bugs ā theyāre about collaboration and code quality. Establishing development rules early saves hours of merge conflicts.
- Choosing the right infrastructure (R2 vs S3, monorepo vs multi-repo) are decisions that impact the entire project lifecycle.