Personal Project / Private File Sharing

Wedding Photo Uploader

A simple way for wedding guests to share original photos and videos from their phones, backed by resumable uploads and a private gallery.

The Workflow

From invitation to shared memories
From invitation to shared memories

Overview

I built this app to give wedding guests a straightforward place to share the photos and videos they capture. Guests enter through a private invitation link or QR code and upload directly from their device. The React frontend connects to a PC-hosted upload service through Cloudflare Tunnel, keeping the original files in storage I control.

What I Built

The upload page supports choosing multiple photos and videos, tracking progress, and recovering from interrupted transfers. A guest gallery publishes previews of completed uploads, supports video playback where the browser can decode the format, and offers original-file downloads. Gallery viewing has a separate password requirement in addition to invitation access.

The public portfolio uses a workflow diagram to describe the project. Guest photos, videos, invitation links, and gallery contents stay out of this write-up.

Technical Highlights

  • Uppy and the Tus protocol provide chunked, resumable uploads with retry handling.
  • A Node.js gateway checks invitation sessions before upload and gallery requests, using signed HttpOnly cookies.
  • Gallery access requires an additional session, with rate limiting on incorrect password attempts.
  • The gateway streams uploads rather than buffering entire files in memory; tusd handles transfer storage.
  • Background preview generation creates smaller gallery images while retaining the uploaded originals.
  • Upload deadlines, storage limits, health checks, and coordinated startup support running the service on a home PC.

Engineering Focus

The interesting challenge is making a simple guest experience dependable behind the scenes. Large phone videos, intermittent connections, browser format support, storage capacity, and separate upload and viewing permissions all influence the design. This project brings together frontend usability, streaming file transfers, authentication, and the practical work of operating a service.