|
1 | | -# 🖥️ Kiosk Rotation Engine (MVP) |
| 1 | +# 🖥️ Kiosk Rotation Engine |
2 | 2 |
|
3 | | -> **A dead‑simple, self‑hosted rotation engine for view‑only screens** |
4 | | -> Built for factory floors, TVs, kiosks, and any display where *scrolling and |
5 | | -> clicking are illegal*. |
| 3 | +A lightweight, self‑hosted digital signage engine for kiosk displays. |
6 | 4 |
|
7 | | -This project provides a **fire‑and‑forget kiosk server** that automatically |
8 | | -discovers content from disk and rotates it fullscreen in a browser. |
9 | | - |
10 | | -No accounts. No editors. No cloud. No vendor lock‑in. |
11 | | - |
12 | | -Just drop content in a folder and let it play. |
| 5 | +Drop files in a folder. Screens update automatically. No cloud. No accounts. |
| 6 | +No nonsense. |
13 | 7 |
|
14 | 8 | --- |
15 | 9 |
|
16 | | -## 🎯 What this is |
17 | | - |
18 | | -This is **not** a full digital signage platform. |
19 | | - |
20 | | -It is: |
21 | | -- A **local kiosk server** |
22 | | -- With **filesystem‑driven content discovery** |
23 | | -- Designed for **non‑interactive TVs / monitors** |
24 | | -- Optimized for **industrial / factory environments** |
| 10 | +## ✨ Features |
25 | 11 |
|
26 | | -The goal is simple: |
27 | | - |
28 | | -> **If it’s a webpage, image, or HTML file — it can be shown on a screen.** |
| 12 | +* 📂 Folder‑based rotation (images, videos, HTML) |
| 13 | +* 🔄 Live updates — viewers refresh automatically |
| 14 | +* 🧠 Playlist versioning (safe, flicker‑free updates) |
| 15 | +* 🖥️ Fullscreen kiosk player (browser‑based) |
| 16 | +* 🛡️ Fault‑tolerant (missing files won’t crash playback) |
| 17 | +* ⚙️ Simple YAML configuration |
| 18 | +* 🐧 Works on Linux, Windows, Raspberry Pi |
29 | 19 |
|
30 | 20 | --- |
31 | 21 |
|
32 | | -## 🧠 Design philosophy (KISS, intentionally) |
33 | | - |
34 | | -- The **screen is dumb** (just a browser) |
35 | | -- The **rotation logic is simple** |
36 | | -- The **content owns itself** |
37 | | -- Humans should be able to add content **without touching Python** |
38 | | - |
39 | | -This avoids: |
40 | | -- Over‑engineering |
41 | | -- Vendor lock‑in |
42 | | -- UI builders nobody likes |
43 | | -- Becoming “the TV admin guy” |
| 22 | +## 🚀 Quick Start |
44 | 23 |
|
45 | | ---- |
46 | | - |
47 | | -## 📁 Core concept: the `rotation/` folder |
48 | | - |
49 | | -The kiosk automatically scans a folder and turns its contents into |
50 | | -fullscreen views. |
51 | | - |
52 | | -``` |
53 | | -rotation/ |
54 | | -├── onsite.url |
55 | | -├── production.url |
56 | | -├── safety.html |
57 | | -├── christmas.html |
58 | | -├── announcement.png |
59 | | -├── map.jpg |
60 | | -├── maintenance/ |
61 | | -│ └── index.html |
| 24 | +```bash |
| 25 | +git clone https://github.com/ProtoXCode/Kiosk-Rotation-Engine.git |
| 26 | +cd kiosk-rotation-engine |
| 27 | +pip install -r requirements.txt |
| 28 | +python run.py |
62 | 29 | ``` |
63 | 30 |
|
64 | | -Anything placed here becomes part of the rotation. |
65 | | - |
66 | | -No restart required (depending on scan interval). |
67 | | - |
68 | | ---- |
69 | | - |
70 | | -## 🧩 Supported content types (MVP) |
71 | | - |
72 | | -### 🌐 `.url` files → Web dashboards |
73 | | - |
74 | | -A text file containing a single URL: |
| 31 | +Open in a browser: |
75 | 32 |
|
76 | 33 | ``` |
77 | | -http://onsite.local/onsite |
| 34 | +http://<host>:8080 |
78 | 35 | ``` |
79 | 36 |
|
80 | | -Rendered as: |
81 | | -- Fullscreen iframe |
82 | | - |
83 | | -Perfect for: |
84 | | -- Dash dashboards |
85 | | -- ERP views |
86 | | -- Grafana |
87 | | -- Internal tools |
| 37 | +(Use fullscreen / kiosk mode for production screens.) |
88 | 38 |
|
89 | 39 | --- |
90 | 40 |
|
91 | | -### 📄 `.html` files → Static pages |
| 41 | +## 📁 Adding Content |
92 | 42 |
|
93 | | -Dropped directly into `rotation/`. |
| 43 | +Put files into the **rotation directory** (default: `rotation/`). |
94 | 44 |
|
95 | | -Rendered as: |
96 | | -- Fullscreen iframe |
| 45 | +Supported formats: |
97 | 46 |
|
98 | | -Supports: |
99 | | -- CSS |
100 | | -- JavaScript |
101 | | -- Animations |
102 | | -- Videos |
| 47 | +* Images: `.jpg`, `.png`, `.jpeg` |
| 48 | +* HEIC / HEIF: `.heic`, `.heif` (auto‑converted to JPEG) |
| 49 | +* Video: `.mp4`, `.webm` |
| 50 | +* HTML: `.html` (rendered via iframe) |
| 51 | +* URL: `'.url` (rendered via iframe, target site must allow to be built in) |
103 | 52 |
|
104 | | -Ideal for: |
105 | | -- Safety notices |
106 | | -- Announcements |
107 | | -- Event info |
| 53 | +Changes are picked up automatically — no reload, no restart. |
108 | 54 |
|
109 | 55 | --- |
110 | 56 |
|
111 | | -### 🖼 Images (`.png`, `.jpg`, `.webp`) → Posters |
| 57 | +## ⚙️ Configuration (`config.yaml`) |
112 | 58 |
|
113 | | -Rendered as: |
114 | | -- Fullscreen, centered image |
| 59 | +Example: |
115 | 60 |
|
116 | | -Ideal for: |
117 | | -- Posters |
118 | | -- Floor maps |
119 | | -- Evacuation plans |
120 | | -- One‑off announcements |
121 | | - |
122 | | ---- |
123 | | - |
124 | | -### 📁 Folders with `index.html` |
125 | | - |
126 | | -``` |
127 | | -rotation/maintenance/index.html |
| 61 | +```yaml |
| 62 | +rotation: |
| 63 | + media_directory: /srv/kiosk/rotation |
| 64 | + default_duration: 10 |
| 65 | + image_duration: 10 |
| 66 | + playlist_scan: 60 |
| 67 | + video_mute: true |
128 | 68 | ``` |
129 | 69 |
|
130 | | -Rendered as: |
131 | | -- Fullscreen mini‑site |
132 | | - |
133 | | -Allows multi‑file HTML content with assets. |
| 70 | +* **media_directory** – Folder watched for content |
| 71 | +* **default_duration** – Fallback duration (seconds) |
| 72 | +* **image_duration** – Image display time |
| 73 | +* **playlist_scan** – Backend rescan interval (seconds) |
| 74 | +* **video_mute** – Start videos muted |
134 | 75 |
|
135 | 76 | --- |
136 | 77 |
|
137 | | -## 🔁 Rotation behavior (MVP) |
| 78 | +## 🧠 How It Works (Short Version) |
138 | 79 |
|
139 | | -- Content rotates automatically |
140 | | -- Fixed duration per view (configurable) |
141 | | -- Fullscreen only |
142 | | -- No scrolling |
143 | | -- No user input |
| 80 | +* Backend scans the rotation folder on a fixed interval |
| 81 | +* Builds a versioned playlist |
| 82 | +* Viewers fetch the playlist and play it sequentially |
| 83 | +* Updates are applied cleanly on the next loop |
144 | 84 |
|
145 | | -The kiosk is **view‑only by design**. |
| 85 | +No polling storms. No race conditions. No broken screens. |
146 | 86 |
|
147 | 87 | --- |
148 | 88 |
|
149 | | -## 🖥️ Intended usage |
| 89 | +## ⚠️ Design Notes |
150 | 90 |
|
151 | | -- Factory floor TVs |
152 | | -- Production overview screens |
153 | | -- Safety / evacuation displays |
154 | | -- Office status boards |
155 | | -- Any screen that should *just show things* |
156 | | - |
157 | | -The kiosk runs via: |
158 | | -- Browser (Chrome / Edge / Firefox) |
159 | | -- Kiosk / fullscreen mode recommended |
160 | | - |
161 | | ---- |
162 | | - |
163 | | -## 🚧 What this MVP does NOT include (by design) |
164 | | - |
165 | | -Not included **yet**: |
166 | | -- UI manager |
167 | | -- Authentication |
168 | | -- User roles |
169 | | -- Screen grouping |
170 | | -- Per‑view schedules |
171 | | -- Remote control |
172 | | - |
173 | | -These are **explicitly postponed** to keep the MVP clean. |
174 | | - |
175 | | ---- |
176 | | - |
177 | | -## 🛣️ Planned next steps (post‑MVP) |
178 | | - |
179 | | -Once the rotation engine is stable: |
180 | | - |
181 | | -### 🧑💼 Manager UI (NiceGUI 3.0) |
182 | | -- CRUD for rotation content |
183 | | -- Upload / delete files |
184 | | -- Enable / disable views |
185 | | -- Adjust rotation timing |
186 | | - |
187 | | -### 📱 Remote control mode |
188 | | -- Use phone/tablet to temporarily take control |
189 | | -- Select a specific view (e.g. team meeting) |
190 | | -- Return to auto‑rotation |
191 | | - |
192 | | -### 🚨 Emergency override |
193 | | -- Force evacuation / safety view |
194 | | -- Pause rotation |
195 | | - |
196 | | -All of these builds **on top of the MVP**, not inside it. |
197 | | - |
198 | | ---- |
199 | | - |
200 | | -## 🧠 Why this exists |
201 | | - |
202 | | -Most digital signage solutions: |
203 | | -- Are cloud‑locked |
204 | | -- Cost per screen |
205 | | -- Don’t integrate cleanly with ERP systems |
206 | | -- Are painful to maintain long‑term |
207 | | - |
208 | | -This project exists to provide: |
209 | | -- A local‑first alternative |
210 | | -- With clean system boundaries |
211 | | -- That scales without turning into a platform monster |
212 | | - |
213 | | ---- |
214 | | - |
215 | | -## 🧑💻 Author |
216 | | - |
217 | | -Built by **Tom Erik Harnes** |
218 | | -Focused on practical, industrially grounded software that survives |
219 | | -real environments. |
| 91 | +* No authentication (intended for trusted networks) |
| 92 | +* No admin UI — filesystem is the source of truth |
| 93 | +* Not designed for public internet exposure |
220 | 94 |
|
221 | 95 | --- |
222 | 96 |
|
223 | | -## 🏄♂️ Final note |
224 | | - |
225 | | -This project is intentionally boring. |
| 97 | +## 📜 License |
226 | 98 |
|
227 | | -Boring means: |
228 | | -- Stable |
229 | | -- Predictable |
230 | | -- Easy to explain |
231 | | -- Hard to replace |
| 99 | +MIT License |
232 | 100 |
|
233 | | -That’s exactly what you want on a factory wall. |
| 101 | +Use it, break it, improve it — just don’t put it behind a paywall 😎 |
0 commit comments