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.
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.
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