NAME
GlowWorm
Web-based digital photo frame system for Raspberry Pi displays
SPECIFICATIONS
STATUS TIMELINE
LINKS
GlowWorm
A modern web-based digital photo display system that turns Raspberry Pi devices into elegant photo frames.
The Problem
Digital photo frames are either:
- Expensive cloud-connected devices that harvest your data
- Cheap garbage with terrible screens and worse software
- DIY solutions that require constant tinkering
I wanted something that would just work, look good, and keep my photos on my own infrastructure.
The Solution
GlowWorm is a self-hosted photo frame system with a proper web interface for managing everything:
┌─────────────────┐ ┌─────────────────┐
│ GlowWorm │ │ Raspberry Pi │
│ Server │◄───────►│ + FullPageOS │
│ (Docker) │ WebSocket│ Portrait Mode │
└─────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ Admin UI │
│ (Any Browser) │
└─────────────────┘
Features
Image Management
- Drag-and-drop uploads with automatic processing
- Album organization with bulk operations
- Automatic thumbnail and variant generation
- EXIF extraction and duplicate detection
- Support for JPEG, PNG, GIF, WebP, AVIF
Playlist System
- Create custom slideshows from your library
- Smart pairing for landscape photos on portrait displays
- Multiple display modes with Ken Burns effects
- Per-playlist settings for transitions and timing
Display Modes
- Default - Smart image pairing
- Ken Burns Plus - Gentle zoom/pan (Pi-safe)
- Soft Glow - Luminosity transitions
- Ambient Pulse - Breathing light effect
- Dreamy Reveal - Elegant fade-ins
Scheduling
- Time-based playlist switching
- Day-of-week schedules
- Automatic display power on/off
- Perfect for themed content
Device Management
- Simple code-based registration
- Multi-device support
- Real-time status monitoring
- Remote browser refresh
Technical Details
The backend is Python with FastAPI, handling image processing with background task queues. Upload speed went from 3-5 seconds per image down to under 500ms after implementing async processing.
Frontend is React with Tailwind, communicating via WebSocket for real-time updates. When you upload images or change playlists, connected displays update immediately.
Runs in Docker for easy deployment. Two commands to get started:
curl -O https://raw.githubusercontent.com/nstephens/glowworm/main/quick-start.sh
./quick-start.sh
Current Status
Running on multiple Raspberry Pi displays around the house. The scheduling system lets me show different content at different times - family photos during the day, art at night.
Published on Docker Hub and GitHub with full documentation and a wiki. Getting occasional issues and PRs from other users which is satisfying.
What I Learned
- WebSocket connection management is tricky with flaky networks
- Image processing should always be async - never block uploads
- Portrait displays need special handling for landscape photos
- FullPageOS is the right choice for kiosk displays
- Users will find ways to break things you never considered