Repository navigation
Releases: b0bbywan/odio-framebuffer-ui
Release list
v2.0.1
v2.0.1
A security release: the kiosk stops trusting eMudhra's compromised CAs
(CVE-2026-111943), which Debian's own fix does not reach, along with the CAs
Chrome has distrusted since Chromium 122. Update with apt upgrade; nothing
to configure.
🔒 Security
-
eMudhra's compromised CAs are distrusted: QtWebEngine carries Chromium's
own list of trusted roots and ignores the system store, so Debian's
ca-certificatesfix (DSA-6572-1)
left the kiosk trusting them. On every start, before the engine loads, the
kiosk now marks them as distrusted in the user's certificate database,
~/.pki/nssdb, which Chromium honors over its own list:- the six compromised TLS intermediates and their six Sectigo
cross-signatures; AAA Certificate ServicesandemSign ECC Root CA - G3, the two roots
Debian removed.
If it cannot write them, it refuses to start rather than run unprotected.
Details in odios#104. - the six compromised TLS intermediates and their six Sectigo
-
The CAs Chrome dropped for cause are distrusted too: Chrome has stopped
trusting Entrust (with AffirmTrust), Chunghwa Telecom and NetLock since the
Chromium that QtWebEngine 6.8 is built on, and the kiosk still trusted
whatever they issued. Their 12 roots join the list. The certificates they
issued before Chrome's cut-off dates have all expired, so no site Chrome
still accepts should break.
QtWebEngine itself still gets no security updates from Debian: this fixes
which certificates the kiosk trusts, not the engine's own flaws. Keep the kiosk
on pages you trust.
🐛 Fixes
- Quitting with Ctrl+Q no longer crashes: the window outlived the
application, so the web profile was torn down under a live page and the
kiosk died with a segmentation fault on its way out. Stopping the unit was
not affected.
⬆️ Upgrading from 2.0.0
sudo apt update && sudo apt upgrade
systemctl --user daemon-reload
systemctl --user restart 'odio-kiosk@*.service'The distrust records are written on the first start of 2.0.1. To check them
(certutil is in libnss3-tools):
certutil -L -d sql:$HOME/.pki/nssdb | grep -c 'odio-kiosk distrust' # 26What's Changed
Full Changelog: v2.0.0...v2.0.1
v2.0.1-beta.1
v2.0.0
v2.0.0
The kiosk is odio-kiosk now, built on Qt 6 / Chromium 122, and runs one
instance per screen. An installed node migrates on apt upgrade, but the unit
changed name and shape — see Upgrading below.
✨ Features
-
Qt 6 instead of Qt 5.15: the engine is Chromium 122, not Chromium 87 from
late 2020.:where(),accent-color, container queries, unprefixedmask-*
andObject.hasOwnall work, so the odio UI stops losing whole stylesheet
rules to an unknown pseudo-class and library code stops tripping on missing
built-ins. -
One kiosk per screen: the unit is a template,
odio-kiosk@.service. Each
instance names the page it shows, and its framebuffer if it is not the first,
in~/.config/odio-kiosk/<instance>.conf:URL=http://localhost:8018/ui FB=/dev/fb1 -
The node's Qt environment is a conffile:
/etc/default/odio-kioskholds
the default framebuffer, theQT_QPA_FB_*settings and the Chromium flags —
editable in place, with no drop-in and no quoting, and preserved on upgrade. -
The unit names no server: which one to wait for, and be restarted with, is
deployment configuration, so it goes in a drop-in:# ~/.config/systemd/user/odio-kiosk@main.service.d/wait-for.conf [Unit] After=default.target my-server.service PartOf=my-server.service
The health check waits on
${URL}regardless, so a kiosk with no drop-in
still comes up once its server answers.
🐛 Fixes
- An instance with no URL says which file to write, instead of dying on a
missing environment file that names neither the file nor the instance. - A stopped kiosk is inactive, not failed:
SuccessExitStatus=1is gone —
this binary exits 143 onSIGTERM, which systemd already counts as a clean
stop. It also no longer turned a browser that cannot open its framebuffer into
a unit going quietly inactive behind a blank screen. - The current URL is no longer written on close: it went through a
QSettingspointer that was never allocated. - The user agent is honest: Qt's own, naming QtWebEngine and its Chromium
with anodio-kiosksuffix. It used to claim to be Firefox 89, which made
every server log line about this browser misleading.
⬆️ Upgrading from fbrowser-kiosk
The package Provides/Replaces/Breaks fbrowser-kiosk, so apt upgrade
migrates the node by itself. The unit does not come along: odio-screen.service
is gone, and no instance of the template is enabled on install.
systemctl --user disable --now odio-screen.service
mkdir -p ~/.config/odio-kiosk
printf 'URL=http://localhost:8018/ui\n' > ~/.config/odio-kiosk/main.conf
systemctl --user enable --now odio-kiosk@main.service📦 Install
curl -fsSL https://apt.odio.love/key.gpg \
| sudo gpg --dearmor -o /usr/share/keyrings/odio.gpg
echo "deb [signed-by=/usr/share/keyrings/odio.gpg] https://apt.odio.love stable main" \
| sudo tee /etc/apt/sources.list.d/odio.list
sudo apt update && sudo apt install odio-kioskFirst run, on a node that has never shown a screen:
sudo usermod -aG tty,video,input $USER # then log in again
sudo loginctl enable-linger $USERamd64 and arm64, Debian trixie / Raspberry Pi OS trixie. No armhf: Pi OS
armhf is Raspbian, which publishes no qt6-webengine binary for it, exactly as
it published no Qt 5 one.
What's Changed
Full Changelog: v1.0.0+git20260210.4213a69...v2.0.0
v2.0.0-beta.1
v1.0.0+git20260210.4213a69
What's Changed
New Contributors
Full Changelog: https://github.com/b0bbywan/odio-framebuffer-ui/commits/v1.0.0+git20260210.4213a69