Pryzmee

pryzmee logo

A fully End-to-End encrypted photo cloud for storing your most important memories, including videos and live photos. Shared albums give you and your friends an easy and secure way to share and collaborate on photos.

Why?

During my four-month-long internship semester in Shanghai, China my friends and my self we took a ton of photos, live photos as well as videos. At some point we had so many pictures that some other platforms did not have enough space on the free tier. And other platforms are not suitable to properly store and view photos. Live Photos are not commonly supported.

Another big missing feature that I have yet to see is a fully End-to-End encrypted platform. So I saw an opportunity to build and learn new things, and therefore I decided to give it a go.

What can it do?

Essentially, I offer the same fundamental features as other platforms, but with an added layer of security – your images, videos, and even sensitive data like location are all encrypted directly on your device, ensuring your privacy and protection.

  • Secure on-device encryption for images, videos, and sensitive data
  • Streamline photo organization through folders and albums
  • Collaborative album creation for shared experiences
  • Convenient photo management: upload, download, and sharing
  • Full support for Live Photos

How did I do it?

This architecture diagram provides a glimpse into my AWS resource landscape. To keep things clear and simple, I've left out numerous individual Lambdas SNS and SQS Queues as well as the different CloudFormation Stacks 🏗️✨

Cognito 🔐

To ensure a seamless and secure user experience, I've implemented Amazon Cognito to manage all user-related data. This includes vital information like email addresses, passwords, and names.

GraphQL 🧭

To enable communication between users' devices and the backend, I've implemented AppSync. I've created various commands for actions like working with images, albums, folders, and user data. These commands rely on the Velocity Template Language (VTL), and for more complex tasks, I've added some Lambdas to assist.

CloudFront 🌍

To ensure swift access to media elements, every upload or download is routed through a CloudFront endpoint, optimizing response times.

Each user enjoys their own dedicated storage space, essentially a personal "folder", within an S3 Bucket. More details can be found in the S3 section. Accessing one's personal media library is straightforward; each request carries a JWT Access Token from Cognito. CloudFront then cross-references the user ID in the JWT Token with the corresponding S3 path.

Additionally, I've created a feature for shared collaborative albums. If a user wishes to view photos uploaded by another user, I've implemented custom permission logic. This logic verifies whether a user is authorized to access specific photos within another user's S3 'folder.' To tackle this, I've integrated Lambda@Edge functions.

DynamoDB 🗃️

In the heart of this setup lies DynamoDB, a cornerstone of my infrastructure. It's the vault that houses a treasure trove of user data, photos, and videos, including details about user-created folders and albums, and the media elements tucked within. Each media element has its own special place in DynamoDB, complete with all its metadata.

Now, here's where it gets a bit tricky but fascinating – I've gone the extra mile to ensure the safety of sensitive information by encrypting it. This added layer of security certainly keeps us on our toes when it comes to designing the NoSQL structure.

On a broader note, apart from diving into the cloud and unraveling the mysteries of AWS, transitioning from traditional relational databases to non-relational databases was quite the journey. It was a learning experience like no other, particularly in terms of efficiently and intelligently organizing data. Secondary indexes, in particular.

S3 🪣

Every photo and video is protected with End-to-End encryption right on the user's device, ensuring that all of their precious memories are securely stored in their own personal folder. To efficiently manage tasks like updating the stored byte count for each user, I've hooked a Lambda function to the S3 bucket to handle events such as upload and delete.

SNS & SQS 📯

In my pursuit of simplifying the intricate web of systems, I naturally opted for SNS and SQS as the ideal tools. These mechanisms function behind the scenes, orchestrating the flow of information and tasks effortlessly among my diverse microservices. To ensure clarity and readability, I have intentionally refrained from displaying the intricate details of SNS, SQS, and their complex connections on the above diagram.

Get In Touch

Let's talk about Work, Life, Traveling, Bouldering, Everything

Don't like forms? Reach out to me on LinkedIn