A lightweight, self-hosted photo sharing solution designed for events, weddings, and parties. Guests can upload and download photos through a password-protected web interface with an optimized gallery viewer that provides a smooth browsing experience.
Optimized gallery viewer with thumbnail grid and full-resolution image viewer
Overview
Event Photo Share is a Docker-ready web application that makes it easy to collect and share photos from events. Unlike cloud-based solutions, this self-hosted approach gives you complete control over your photos while providing a polished user experience for guests.
The application handles the technical complexities of image processing automatically - converting HEIC files, generating thumbnails, extracting EXIF data, and even processing videos with thumbnail generation. Guests simply upload their photos, and the system takes care of the rest.
Simple password-protected access with session-based authentication
Key Features
Image & Video Processing
- Automatic thumbnail generation - Creates optimized thumbnails for fast gallery loading
- HEIC conversion - Automatically converts iPhone HEIC images to web-compatible formats
- EXIF data extraction - Preserves photo metadata including date, camera settings, and location
- Video support - Handles video uploads with automatic thumbnail generation using FFmpeg
- Duplicate detection - Prevents the same photo from being uploaded multiple times
Gallery Viewer
- Intelligent preloading - Preloads full-resolution images in both directions for instant navigation
- Responsive design - Works seamlessly on desktop, tablet, and mobile devices
- Smooth navigation - Arrow keys and swipe gestures for effortless browsing
- Full-resolution viewer - View photos in their original quality
Download & Sharing
- Bulk download as ZIP - Automatically generates ZIP archives for downloading all photos at once
- Individual downloads - Download specific photos in full resolution
- Session-based authentication - Password protection with persistent sessions
Notifications (Optional)
- ntfy.sh integration - Get real-time notifications when guests upload new photos
- Configurable alerts - Set notification priority and custom topics
Technical Implementation
Architecture
The application uses a straightforward Node.js + Express backend with server-side rendering. This keeps the architecture simple and maintainable while providing excellent performance.
Tech Stack:
- Backend: Node.js, Express
- Image Processing: Sharp (for images), FFmpeg (for videos)
- Deployment: Docker, Docker Compose
- Storage: File-based (easily mountable volumes)
Performance Optimizations
Intelligent Preloading:
The gallery viewer implements bidirectional preloading - when viewing an image, it preloads the next and previous images in full resolution. This creates an instant, seamless browsing experience as users navigate through the gallery.
Thumbnail Strategy:
All images are automatically processed to generate optimized thumbnails, dramatically reducing initial page load times while maintaining visual quality in the gallery grid view.
Efficient Caching:
The application implements smart caching strategies to minimize redundant processing and serve images quickly on subsequent requests.
Docker Deployment
The entire application is containerized for easy deployment:
# Quick start
cp .env.example .env
# Edit .env with your settings
docker-compose up -d
Access the gallery at http://localhost:3000
Volume Mounting:
Photos are stored in a mounted volume, making it easy to backup, migrate, or access files directly:
volumes:
- /path/to/photos:/app/uploads
Configuration
Required Settings:
PASSWORD- Gallery access passwordSESSION_SECRET- Session encryption key
Optional Notifications:
NTFY_ENABLED=true
NTFY_SERVER=https://ntfy.sh
NTFY_TOPIC=your_unique_topic
NTFY_PRIORITY=3
Use Cases
This application is perfect for:
- Weddings - Let guests upload and share photos from your special day
- Parties & Celebrations - Collect photos from birthday parties, anniversaries, etc.
- Corporate Events - Share photos from company events, team building, conferences
- Family Gatherings - Create a shared photo collection for reunions and holidays
Development
For local development:
npm install
cp .env.example .env
npm start
Requirements:
- Node.js 20+
- FFmpeg (for video processing)
Privacy & Control
Being self-hosted means:
- Complete data ownership - Your photos stay on your server
- No third-party access - No cloud services scanning or accessing your images
- Custom domain - Host on your own domain or subdomain
- Full control - Modify, extend, or customize as needed
Appendix and Links
The source code is available on GitHub.
License: MIT