Touchscreen Kiosk-dashboard op ZimaBoard 2 met Docker (X.Org + Chromium)

Eva Wong is de Technisch Schrijver en vaste knutselaar bij ZimaSpace. Een levenslange geek met een passie voor homelabs en open-source software, ze is gespecialiseerd in het vertalen van complexe technische concepten naar toegankelijke, praktische handleidingen. Eva gelooft dat zelf-hosting leuk moet zijn, niet intimiderend. Met haar tutorials geeft ze de community de kracht om hardware-setup te ontrafelen, van het bouwen van hun eerste NAS tot het beheersen van Docker-containers.

Hallo allemaal,

Ik wilde delen hoe ik een fullscreen touchscreen kiosk draaiend kreeg op mijn ZimaBoard 2 aangesloten op een 22" touchmonitor via HDMI.

Omdat ZimaOS geen pakketbeheerder heeft (apt bestaat niet), is de truc om alles binnen Docker-containers te doen.

Mijn setup

ZimaBoard 2 1664 (Intel N100, 16 GB RAM)

ZimaOS v1.5.4

22" touchmonitor via HDMI + USB-C→USB-A touchscreen invoer

Een close-up van een wit-rode Thermaltake Tower 900 PC-behuizing, met aangepaste blauwe LED-verlichting en een gedetailleerd beeld van interne componenten, waaronder een Intel-processor en geheugen.

De aanpak

ZimaOS is Buildroot-gebaseerd — geen apt, geen Xorg, geen desktopomgeving. In plaats daarvan draaien we een Debian-container met Xorg modesetting-stuurprogramma + Chromium in kioskmodus, met /dev/dri doorgegeven. Een aparte nginx:alpine-container serveert de dashboardbestanden.

Stap 1 — Voeg je gebruiker toe aan de docker-groep

Open de webterminal op http://your-zima-ip:7681 en voer uit:

bash

sudo usermod -aG docker JOUW_GEBRUIKERSNAAM

Verbind daarna opnieuw via SSH zodat de wijziging van kracht wordt.

Stap 2 — Maak de bestanden aan

bash

mkdir -p /DATA/AppData/kiosk/dashboard

/DATA/AppData/kiosk/Dockerfile:

text

FROM debian:bookworm-slim
RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' >> /etc/apt/sources.list
RUN apt-get update && \
apt-get install -y \
xserver-xorg-core \
xserver-xorg-input-libinput \
openbox chromium \
x11-xserver-utils xinit \
fonts-noto-core && \
apt-get install -y -t bookworm-backports libgl1-mesa-dri && \
rm -rf /var/lib/apt/lists/*
COPY xorg.conf /etc/X11/xorg.conf
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

Waarom Mesa backports? De Intel N100 (Alder Lake-N, PCI ID 0x46d4) wordt pas ondersteund vanaf Mesa 23.0+. Debian bookworm levert 22.3. Backports biedt 25.x.

/DATA/AppData/kiosk/xorg.conf:

text

Sectie "Apparaat"
Identificatie "Intel"
Stuurprogramma "modesetting"
Optie "AccelMethod" "geen"
EndSection

Sectie "Scherm"
Identificatie "Standaard"
Apparaat "Intel"
EndSection

Sectie "Invoerapparaat"
Identificatie "Touchscreen"
Stuurprogramma "libinput"
Optie "Apparaat" "/dev/input/event8"
EndSection

Sectie "ServerLayout"
Identificatie "Standaard"
Scherm "Standaard"
Invoerapparaat "Touchscreen" "CorePointer"
EndSection

Vind het eventnummer van je touch-apparaat met:

bash

cat /proc/bus/input/devices | grep -A3 -i touch

/DATA/AppData/kiosk/entrypoint.sh:

text

#!/bin/sh
Xorg :0 vt1 -s 0 -dpms -nolisten tcp &
sleep 4
export DISPLAY=:0
xset s off && xset -dpms && xset s noblank
openbox --sm-disable &
sleep 1
exec chromium \
--kiosk --no-sandbox --disable-gpu \
--disable-dev-shm-usage \
--touch-events=enabled \
--no-first-run --disable-infobars \
"${KIOSK_URL:-http://localhost:8888}"

/DATA/AppData/kiosk/nginx.conf:

text

server {
listen 8888;
root /usr/share/nginx/html;
index index.html;
}

Plaats je dashboard HTML/CSS/JS bestanden in /DATA/AppData/kiosk/dashboard/.

Bovenaanzicht van de ZimaBoard single board server, met de nadruk op de PCIe uitbreidingsslot, dubbele Ethernet-poorten en SATA-connectoren voor integratie in doe-het-zelf projecten.

Stap 3 — Bouwen en Uitvoeren

Bouwen (let op: docker build heeft --config /tmp nodig op ZimaOS):

bash

docker --config /tmp build -t kiosk:latest /DATA/AppData/kiosk

Dashboard webserver:

bash

docker --config /tmp run -d \
--name dashboard-server \
--restart unless-stopped \
--network host \
-v /DATA/AppData/kiosk/dashboard:/usr/share/nginx/html:ro \
-v /DATA/AppData/kiosk/nginx.conf:/etc/nginx/conf.d/default.conf:ro \
nginx:alpine

Kiosk weergave:

bash

docker --config /tmp run -d \
--name jarvis-kiosk \
--restart unless-stopped \
--privileged \
--network host \
-e KIOSK_URL=http://localhost:8888 \
-v /DATA/AppData/kiosk/xorg.conf:/etc/X11/xorg.conf:ro \
-v /DATA/AppData/kiosk/entrypoint.sh:/entrypoint.sh:ro \
-v /run/udev:/run/udev:ro \
kiosk:latest

Beide containers hebben --restart unless-stopped zodat ze automatisch herstarten na een reboot.

Touchscreen Klik Fix (belangrijk!)

Xorg's libinput behandelt aanraking als pointer (muis) gebeurtenissen. Chromium past dan een kleine bewegingsdrempel toe voor klikken — zelfs een 1px vingerverschuiving voorkomt dat het wordt geactiveerd. Als je dashboard onclick handlers gebruikt, voeg dan deze JS toe om ze te vervangen door pointerup + een drempel van 20px:

js

(function touchFix() {
const downs = {};
document.addEventListener('pointerdown', e => {
downs[e.pointerId] = { x: e.clientX, y: e.clientY };
}, { passive: true });
function isTap(e) {
const d = downs[e.pointerId];
return !d || (Math.abs(e.clientX - d.x) < 20 && Math.abs(e.clientY - d.y) < 20);
}
functie run(fn) { probeer { nieuwe Function(fn)(); } vang(ex) {} }
functie patchButtons(root) {
root.querySelectorAll('button[onclick]').forEach(btn => {
const oc = btn.getAttribute('onclick');
btn.removeAttribute('onclick');
btn.addEventListener('pointerup', e => { e.stopPropagation(); als (isTap(e)) run(oc); });
});
}
window.addEventListener('load', () => {
document.querySelectorAll('.widget[onclick]').forEach(el => {
const oc = el.getAttribute('onclick');
el.removeAttribute('onclick');
el.addEventListener('pointerup', e => { als (isTap(e) && !e.target.closest('button')) run(oc); });
});
patchButtons(document.body);
});
nieuwe MutationObserver(muts => muts.forEach(m =>
m.addedNodes.forEach(n => { als (n.nodeType === 1) patchButtons(n); })
)).observe(document.body, { childList: true, subtree: true });
})();

Voeg ook toe aan je CSS om de muiscursor op een touchscreen te verbergen:

css

{ cursor: none !important; touch-action: manipulation; }

Een 22-inch Pisichen touchmonitor verbonden met een ZimaBoard via HDMI en USB, die een aangepast smart home dashboard met interactieve widgets toont.

Probleemoplossing

Probleem Oplossing
docker build faalt met onbekende vlag Gebruik docker --config /tmp build …
Zwart scherm / Basis outputtest mislukt Gebruik Xorg modesetting, niet Wayland/cage
Mesa ondersteunt N100 niet Installeer libgl1-mesa-dri van bookworm-backports
Touch-invoer niet gedetecteerd Controleer eventnummer met /proc/bus/input/devices, update xorg.conf
Dashboard toont ZimaOS login Poort 80 is in gebruik door ZimaOS — gebruik een andere poort (888 werkt)

Mijn altijd-aan Home Assistant setup (Antwoord)

Ik heb een energiezuinige home assistant setup gebouwd die 24/7 beschikbaar is zonder dat mijn hoofdcomputer continu stroom verbruikt. Het geheime wapen is een Zima die fungeert als het altijd-aan brein, terwijl mijn volledige pc in slaapstand staat totdat hij echt nodig is.

De hoofd-pc

Dit zit er in de hoofdcomputer:

CPU: AMD Ryzen 9 9950X3D

Moederbord: ASUS ROG Crosshair X870E Glacial

RAM: Acer Predator Hermes RGB DDR5 96GB (2×48GB) 6000MHz CL28

Opslag: Crucial T710 4TB NVMe M.2 PCIe 5.0 Gen5

GPU (Gaming): ASUS ROG Astral GeForce RTX 5080 16GB

GPU (AI): Intel Arc Pro B70 32GB (wacht op release)

Voeding: Corsair RM1200x

Behuizing: Thermaltake Tower 900

De Zima-opstelling (de altijd-aan hub)

De Zima draait 24/7 en regelt alles wat licht is — taken van de home assistant, camerafeeds, en basis AI-vragen via de Groq free tier in de cloud.

Aangesloten randapparatuur direct op de Zima:

Pisichen 22" touchscreen monitor via HDMI → miniDP-adapter + één USB-C-kabel voor touch input

Edifier G1000 II luidsprekers via een externe USB-A naar 3,5mm geluidskaart

DAMAO DGM20S microfoon via USB-A

Opslag:

Seagate IronWolf Pro 20TB — ''zwart gat'' NAS-schijf

Seagate IronWolf Pro 1TB — hoofd NAS-schijf

Netwerk:

Zima verbonden met de router via ethernet

Een tweede ethernetkabel loopt rechtstreeks van de Zima naar de pc voor snelle lokale overdrachten

Een uitgebreide thuisautomatiseringswerkplek met een ZimaBoard-aangedreven touchscreen kiosk, professionele luidsprekers en een minimalistische bureau-opstelling voor 24/7 monitoring.

Het slimme deel: Wake-on-LAN

Hier is de magie — wanneer iemand een vraag stelt die te complex is voor Gemini om goed af te handelen, stuurt de Zima een Wake-on-LAN-pakket om de hoofd-pc uit de slaapstand te halen. Zodra hij aan is, maakt hij verbinding met een lokale 70B parameter LLM die draait op de Intel Arc Pro B70. Nadat de taak is voltooid, gaat de pc weer in slaapstand.

Het resultaat: een home assistant die altijd responsief is, maar de grote computer alleen wakker wordt als er echt zwaar werk te doen is. De energierekeningen blijven beheersbaar, en ik heb nog steeds toegang tot een zeer capabel lokaal model wanneer ik het nodig heb.

Een grote dank aan Claude Code en Perplexity — eerlijk gezegd had ik zonder hun hulp dit hele project nooit alleen kunnen realiseren. Ze waren onmisbaar gedurende het hele proces.

Ik hoop dat deze informatie iedereen helpt die gek genoeg is om een soortgelijk project aan te pakken — voel je vrij om het te delen waar je maar wilt!

Zima Campagne Hub

Meer om te lezen

Wat gebeurt er als twee AI-agenten vechten om één server?
Jun 16, 2026Community & Stories

Wat gebeurt er als twee AI-agenten vechten om één server?

Zero Noichi’s AI-cybersecurity-experiment gebruikte twee ZimaBoard 2-apparaten om aanvallers- en verdedigersagenten te simuleren, waarmee werd aangetoond hoe homelab-servers veilige AI, Docker, NAS en beveiligingstests...

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.