A self-hosted photo sharing app for weddings, parties and other events. Guests upload and browse photos in a password-protected gallery, without accounts or a cloud service.

Event Photo Share Gallery

Thumbnail grid and full-resolution viewer

Motivation

I built this for my own wedding. I wanted all the guests' photos in one place without a third-party cloud service and without making anyone create an account. Everything stays on my own server.

Password-Protected Login

Guests log in with one shared password

Features

  • Password-protected: Guests enter one shared password to upload and view photos
  • Image processing: HEIC conversion, thumbnails, EXIF extraction and duplicate detection on upload
  • Videos: Thumbnails generated with FFmpeg
  • Gallery: Preloads the next and previous full-resolution images so browsing feels instant, with keyboard and swipe support
  • Bulk download: All photos as one ZIP file
  • Notifications: Optional ntfy.sh alerts for new uploads
  • Docker: Deploys with docker-compose up -d, photos live in a mounted volume for easy backups and moves

How It Works

One Express server does everything. Uploads come in through multer, HEIC photos are converted to JPEG, Sharp makes the thumbnails, exifr reads the capture time and FFmpeg grabs a frame for video thumbnails. A file with the same name, capture time and size as an existing one counts as a duplicate, which catches guests uploading the same photo twice, even within one batch. The login compares the shared password in constant time and is rate-limited, and sessions are written to disk so a restart doesn't log everyone out. The ZIP of all photos is built once and rebuilt in the background after new uploads.

Tech Stack

  • Backend: Node.js, Express, JSON API
  • Frontend: Plain HTML and JavaScript, no framework
  • Image Processing: Sharp, FFmpeg
  • Deployment: Docker, Docker Compose
  • Storage: File-based with mounted volumes

Links

The source code is available on GitHub.

License: MIT