Back to projects

Case Study

Own product

OnePick

A photo diary web app for recording one photo per day, managing journeys, inviting collaborators, and documenting a polished Next.js/Firebase UI.

A product we planned, launched, and operate ourselves. Read these as evidence of technical range and operating practice.

Visit Product

Project Overview

OnePick is a photo-based diary web application that encourages users to record everyday moments through the constraint of one photo per day. It supports journey-based organization, social invitations, Firebase authentication and storage, responsive UI, Storybook documentation, and testing from a Next.js 14 and Firebase architecture. For a calendar month with daily picks, it reduced the measured Firestore read pattern from 1,740 to 60 document reads by subscribing to visible-month changes and storing picked dates on the journey document.

Product screens

Journey detail with day-by-day photo records
Journey detail with day-by-day photo records
One-photo-per-day upload modal
One-photo-per-day upload modal
Full journey photo gallery
Full journey photo gallery
Journey settings and member invitation screen
Journey settings and member invitation screen

Key Challenges

  • Designing a simple daily recording loop around the one-photo-per-day constraint
  • Managing journey and photo state with Recoil
  • Integrating Firebase Auth, Firestore, and Storage
  • Avoiding repeated Firestore reads when browsing a month with many daily picks
  • Creating a responsive photo diary UI across mobile and desktop

Key Outcomes

  • Built a complete photo diary app from planning to deployment
  • Implemented journey management and social invitation flows
  • Added Firebase authentication, secure data storage, and photo uploads
  • Reduced a measured daily-pick month from 1,740 to 60 Firestore document reads (96%) with visible-month subscriptions and picked-date metadata
  • Documented components with Storybook and added Jest test coverage

Technologies

Next.js 14ReactTypeScriptFirebaseFirestoreTailwindCSSRecoilStorybookJest