Inspiration

I’ve always loved the pressure and creativity that comes from constraints. Most photo apps are infinite scroll and filters; I wanted something that felt more like a daily creative mission. Framed was inspired by daily prompts, film photography, and the idea of “one frame, one chance.” The goal was to make people notice their everyday surroundings again, not just post highlights.

What it does

Framed drops a single global prompt each day. You get one photo to respond. You can either shoot with the in‑app camera or pick one shot from today’s gallery, then submit it to the challenge. Friends and the wider community can view submissions, like them, and see winners on the leaderboard. There are also groups so smaller communities can run their own private challenges.

How I built it

On mobile, I used Expo + React Native + TypeScript to build a smooth camera and gallery experience that works on both Android and iOS. The app uses: expo-camera for the live camera and capture flow expo-media-library for today’s photo picker expo-notifications for daily challenge reminders On the backend and data side, I leaned heavily on Firebase: Firebase Auth for email / password accounts and verification codes Cloud Firestore for users, photos, likes, comments, groups, and chat Firebase Storage for full‑resolution images and thumbnails Cloud Functions for scheduled challenge creation and cleanup tasks I also built a marketing site + privacy / deletion pages with React, Vite, and Tailwind CSS, hosted on a static host (e.g. Vercel), which powers the public URLs required by Google Play’s data safety and account‑deletion policies.

What I learned

How to design a daily content cycle (prompts, submissions, voting) that feels fair and technically reliable. How to model social features—followers, likes, comments, group chats—cleanly in Firestore while keeping reads/writes efficient. How to build a production‑ready onboarding flow with email verification, password resets, and username reservation. How to navigate the Google Play data safety, photo/video permission, and account‑deletion requirements, and reflect them correctly in both code and policy docs.

Challenges

Permissions & privacy: Getting camera, gallery, and notification permissions right across Android and iOS while also satisfying Google Play’s new policies took several iterations. Photo uploads at scale: Handling large modern camera files required careful compression, upload progress tracking, and background Firestore writes so the UI stayed responsive. State and navigation complexity: Coordinating the camera, feed, groups, and onboarding flows in a single navigation stack, without confusing users, was a big design and engineering challenge. Real‑time features: Implementing live group chat and dynamic feeds over Firestore while avoiding unnecessary listener costs and keeping things snappy on slower devices. Overall, Framed has been a deep dive into mobile UX, real‑time data, and privacy‑first design, and it pushed me to think about both user delight and platform compliance at the same time.

Built With

Share this project:

Updates