Skip to main content

NAME

GlowWorm

Web-based digital photo frame system for Raspberry Pi displays

SPECIFICATIONS

Status: Active Started: 2024-09
Tech Stack:
Python React Docker WebSocket PostgreSQL
Tags: [Self-hosted] [Raspberry Pi] [Home Automation]

STATUS TIMELINE

Proposed
Active
Testing
Complete

LINKS

DOCUMENTATION

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

  1. WebSocket connection management is tricky with flaky networks
  2. Image processing should always be async - never block uploads
  3. Portrait displays need special handling for landscape photos
  4. FullPageOS is the right choice for kiosk displays
  5. Users will find ways to break things you never considered
manipulate.org
up 731d _