A lightweight, self-hosted digital signage engine for kiosk displays.
Drop files in a folder. Screens update automatically. No cloud. No accounts. No nonsense.
- π Folder-based rotation (images, videos, HTML)
- π₯ Network upload support (via shared drop folder)
- π Live updates β viewers refresh automatically
- π§ Playlist versioning (safe, flicker-free updates)
- π₯οΈ Fullscreen kiosk player (browser-based)
- π‘οΈ Fault-tolerant (invalid files are ignored)
- βοΈ Simple YAML configuration
- π§ Works on Linux, Windows, Raspberry Pi
git clone https://github.com/ProtoXCode/Kiosk-Rotation-Engine.git
cd kiosk-rotation-engine
pip install -r requirements.txt
python run.pyOpen in a browser:
http://<host>:8080
(Use fullscreen / kiosk mode for production screens.)
This system uses a two-stage content pipeline:
Upload β Processing β Display
Files are dropped into an upload directory (e.g. via SMB/Samba):
/srv/uploads
This folder can be shared across the network so other machines can easily add content.
A small processing step moves valid files into the live rotation directory:
/srv/display
Typical responsibilities:
- β Allow only supported file types
- π« Reject invalid or unsupported files
- π¦ Optionally enforce file size limits
- π Normalize or convert formats if needed
This prevents broken or unsupported files from reaching the display.
The engine reads from the configured media directory:
rotation:
media_directory: /srv/displayOnly processed, valid content should live here.
.jpg,.jpeg,.png,.webp.heic,.heif(auto-converted to JPEG)
.mp4,.webm
.html(rendered via iframe).url(rendered via iframe β target site must allow embedding)
.ppt,.pptx.doc,.docx.xls,.xlsx.pdf
Office files are converted before display (e.g. to images or PDF pages).
β οΈ Requires LibreOffice to be installed on the host system for document conversion support.
Example:
rotation:
media_directory: /srv/display
default_duration: 10
image_duration: 10
playlist_scan: 60
video_mute: true- media_directory β Folder used for playback (post-processing)
- default_duration β Fallback duration (seconds)
- image_duration β Image display time
- playlist_scan β Backend rescan interval (seconds)
- video_mute β Start videos muted
- Backend scans the media directory on a fixed interval
- Builds a versioned playlist
- Viewers fetch the playlist and play it sequentially
- Updates are applied cleanly on the next loop
No polling storms. No race conditions. No broken screens.
- No authentication (intended for trusted networks)
- Upload directory should not be used directly as media source
- Recommended to isolate upload and display directories
- Not designed for public internet exposure
- Debian server running the engine
- Network share (SMB via Samba) mapped to
/srv/uploads - Background script or service processes uploads
- Clean media served from
/srv/display
MIT License
Use it, break it, improve it β just donβt put it behind a paywall π