A lightweight image display system for Raspberry Pi that allows users to upload images via a web interface and automatically displays them on a connected screen.
- π± Mobile-friendly web interface for image uploads
- π Automatic slideshow of uploaded images
- π₯οΈ Direct framebuffer display (no X server required)
- π Lightweight - runs smoothly on Raspberry Pi Zero W 2
- π Auto-restart and boot startup support
- ποΈ Image management (view and delete uploaded images)
- Raspberry Pi (tested on Pi Zero W 2)
- Raspbian OS (terminal mode is fine)
- Screen connected via HDMI
- Network connection (WiFi or Ethernet)
From your development machine:
# Using git (on the Pi):
git clone https://github.com/yourusername/pixelpot.git
cd pixelpot
# Or using scp (from your machine):
scp -r /path/to/pixelpot pi@raspi.local:~/
ssh pi@raspi.local
cd ~/pixelpotcd ~/pixelpot
chmod +x scripts/install.sh
./scripts/install.shThis will:
- Install system dependencies (fbi, imagemagick, nodejs, npm, python3)
- Install Node.js packages
- Set up Python virtual environment
- Configure permissions
./scripts/start.shsudo ./scripts/install-services.shThis will:
- Install systemd services
- Enable auto-start on boot
- Start the services immediately
-
Access the Web Interface
- Open a browser on any device on the same network
- Navigate to:
http://raspi.local:3000orhttp://[PI-IP]:3000
-
Upload Images
- Click the upload area or drag & drop images
- Supported formats: JPEG, PNG, GIF, WebP
- Maximum file size: 5MB
-
View on Screen
- Images will automatically display on the connected screen
- Each image shows for 10 seconds by default
- The slideshow loops continuously
Edit the display service or run manually with different timing:
cd ~/pixelpot/display
source venv/bin/activate
python display.py --time 5 # 5 seconds per imageSet the PORT environment variable:
PORT=8080 npm startsudo systemctl status pixelpot-server
sudo systemctl status pixelpot-display# Real-time logs
sudo journalctl -u pixelpot-server -f
sudo journalctl -u pixelpot-display -f
# Or check log files
tail -f /var/log/pixelpot-server.log
tail -f /var/log/pixelpot-display.logsudo systemctl stop pixelpot-server pixelpot-displaysudo systemctl restart pixelpot-server pixelpot-displaysudo systemctl disable pixelpot-server pixelpot-displayTo access your PixelPot from anywhere:
- Install cloudflared:
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm.deb -o cloudflared.deb
sudo dpkg -i cloudflared.deb- Authenticate:
cloudflared tunnel login- Create tunnel:
cloudflared tunnel create pixelpot- Configure tunnel (create
~/.cloudflared/config.yml):
tunnel: YOUR_TUNNEL_ID
credentials-file: /home/pi/.cloudflared/YOUR_TUNNEL_ID.json
ingress:
- hostname: pixelpot.yourdomain.com
service: http://localhost:3000
- service: http_status:404- Route traffic:
cloudflared tunnel route dns pixelpot pixelpot.yourdomain.com- Run tunnel:
cloudflared tunnel run pixelpotpixelpot/
βββ server/ # Node.js Express server
β βββ index.js # Main server file
β βββ package.json # Node dependencies
βββ display/ # Python display script
β βββ display.py # Image display controller
β βββ requirements.txt
βββ public/ # Web interface
β βββ index.html
β βββ style.css
β βββ script.js
βββ uploads/ # Uploaded images directory
βββ scripts/ # Installation and service scripts
- Ensure you're in the
videogroup:groups $USER - Try running with sudo:
sudo python display.py - Check if framebuffer exists:
ls /dev/fb*
- Check firewall:
sudo ufw status - Verify server is running:
ps aux | grep node - Check port:
sudo netstat -tlnp | grep 3000
- Check uploads directory permissions:
ls -la ~/pixelpot/uploads - Verify fbi is installed:
which fbi - Check Python script logs:
sudo journalctl -u pixelpot-display -n 50
- Keep images under 2MB for best performance on Pi Zero
- Consider resizing images before upload
- Clean old images periodically to save space
- Monitor disk space:
df -h
- The server accepts uploads from any device on the network
- Consider adding authentication if exposing to internet
- Regularly clean uploaded images to prevent disk filling
- Use Cloudflare Tunnel instead of port forwarding for internet access
MIT
Pull requests welcome! Please test on Raspberry Pi before submitting.