-
Notifications
You must be signed in to change notification settings - Fork 35
OpenterfaceQT‐Linux‐Environment‐Setup
This guide walks through setting up a Linux host to run (and optionally build) Openterface QT.
| Distribution | Version | Architecture | Notes |
|---|---|---|---|
| Ubuntu | 22.04+ | x64, ARM64 |
.deb and AppImage available |
| Debian | 12+ | x64, ARM64 |
.deb available |
| Fedora | 42+ | x64, ARM64 |
.rpm available |
| Linux Mint | 21.3+ | x64 |
.deb available |
| openSUSE | Tumbleweed | x64 |
.rpm available |
| Arch Linux | Rolling | x64, ARM64 | ✅ Supported — native .pkg.tar.zst (see Arch Linux Installation) |
| Raspberry Pi OS | 64-bit | ARM64 | ✅ Supported |
| Raspberry Pi OS | 32-bit | ARM32 | ❌ Not supported (Qt too old) |
| NixOS | 25.11+ | x64, ARM64 | Nix flake available |
Three methods — pick the one that fits your needs:
| Method | Time | Effort | When to use |
|---|---|---|---|
| Pre-built binary | ~30 s | Minimal | Most users — fastest & easiest |
| Build from source | 5–30 min | Medium | Custom modifications needed |
| Manual package install | Varies | Higher | Advanced users & troubleshooting |
Installs the latest release in ~30 seconds, no compilation:
curl -fsSL https://raw.githubusercontent.com/TechxArtisanStudio/Openterface_QT/main/build-script/install-release.sh | bashTo pin a specific version:
VERSION="v0.5.17" bash <(curl -fsSL https://raw.githubusercontent.com/TechxArtisanStudio/Openterface_QT/main/build-script/install-release.sh)The script automatically:
- Downloads the pre-built binary for your architecture (x86_64 / ARM64)
- Installs runtime dependencies (Qt6, FFmpeg, USB libraries)
- Configures device permissions (udev rules, user groups)
- Creates desktop menu integration
- Sets up a Qt environment wrapper (prevents "Qt platform plugin" errors)
Supported distros: Ubuntu/Debian (apt), Fedora/RHEL (dnf), openSUSE (zypper), Arch (pacman).
flatpak install flathub com.openterface.openterfaceQT
flatpak run com.openterface.openterfaceQTIf the Flatpak cannot see the device, grant full device access:
flatpak run --device=all com.openterface.openterfaceQTThe Flatpak uses the KDE 6.9 runtime (org.kde.Platform).
The repo ships a Nix flake for reproducible builds and NixOS integration:
# Build
nix build github:TechxArtisanStudio/Openterface_QT
# Run
nix run github:TechxArtisanStudio/Openterface_QT
# Dev shell
nix develop github:TechxArtisanStudio/Openterface_QTNixOS module — add to configuration.nix:
{
inputs.openterface-qt.url = "github:TechxArtisanStudio/Openterface_QT";
# ...
imports = [ inputs.openterface-qt.nixosModules.default ];
services.openterface-qt.enable = true;
}The module installs the package, udev rules, and the dialout/video groups automatically.
See §4 Build from Source below.
For users who want full control:
- Download the
.debor.rpmfrom GitHub Releases. - Install runtime dependencies (Ubuntu/Debian example):
sudo apt install -y \
libqt6core6 libqt6dbus6 libqt6gui6 libqt6network6 \
libqt6multimedia6 libqt6multimediawidgets6 libqt6serialport6 \
libqt6widgets6 libqt6svg6 libgstreamer1.0-0 \
libgstreamer-plugins-base1.0-0 libusb-1.0-0 libturbojpeg0Ubuntu 24.04+ note:
libturbojpeg0was renamed tolibturbojpeg. Use the new name on 24.04+.
- Install the package:
sudo dpkg -i openterface-qt_*.deb
sudo apt -f install # resolve any missing depsLinux enforces access control on every /dev node. Before the app can see the Mini-KVM, three things must be set up:
- udev rules for the hardware
- User group membership
- BRLTTY conflict resolved
This block covers V1/V2/V3 hardware, both serial chips, and BRLTTY. Paste it, then log out and back in.
# 1. Groups
sudo usermod -a -G dialout,video,uucp $USER
# 2. udev rules for all Openterface devices
sudo tee /etc/udev/rules.d/51-openterface.rules > /dev/null <<'EOF'
# V1 (534D:2109) — USB + hidraw
SUBSYSTEM=="usb", ATTRS{idVendor}=="534d", ATTRS{idProduct}=="2109", TAG+="uaccess"
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="534d", ATTRS{idProduct}=="2109", TAG+="uaccess"
# V2 (345F:2132, MS2130S) — USB + hidraw
SUBSYSTEM=="usb", ATTRS{idVendor}=="345f", ATTRS{idProduct}=="2132", TAG+="uaccess"
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="345f", ATTRS{idProduct}=="2132", TAG+="uaccess"
# V3 (345F:2109, MS2109S) — USB + hidraw
SUBSYSTEM=="usb", ATTRS{idVendor}=="345f", ATTRS{idProduct}=="2109", TAG+="uaccess"
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="345f", ATTRS{idProduct}=="2109", TAG+="uaccess"
# Serial CH341 / CH9329 (1A86:7523)
SUBSYSTEM=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", TAG+="uaccess"
SUBSYSTEM=="ttyUSB", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", TAG+="uaccess"
# Serial CH32V208 (1A86:FE0C)
SUBSYSTEM=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="fe0c", TAG+="uaccess"
SUBSYSTEM=="ttyACM", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="fe0c", TAG+="uaccess"
EOF
# 3. Apply rules
sudo udevadm control --reload-rules
sudo udevadm trigger
# 4. Mask BRLTTY (it grabs USB serial/HID devices)
if systemctl list-units --full --all 2>/dev/null | grep -q brltty; then
sudo systemctl mask brltty-udev.service 2>/dev/null || true
sudo systemctl mask brltty.service 2>/dev/null || true
sudo systemctl stop brltty-udev.service 2>/dev/null || true
sudo systemctl stop brltty.service 2>/dev/null || true
fi
echo "✅ Done. Log out and back in, then re-plug the device."Fallback for systems without systemd-logind (Docker, OpenRC, old RHEL/CentOS): replace
TAG+="uaccess"withMODE="0666"in the rules above. This grants access to all local users — fine for single-user desktops, reconsider on multi-user systems.
| Piece | Purpose |
|---|---|
dialout group |
Opens /dev/ttyUSB* / /dev/ttyACM* (serial port for keyboard/mouse) |
video group |
Opens /dev/video* (UVC capture device) |
uucp group |
Serial port ownership on Arch Linux |
udev uaccess tag |
systemd-logind grants access to the logged-in user automatically |
| BRLTTY mask | Stops the Braille TTY daemon from stealing the USB serial/HID interface |
Group changes need a logout/login (or reboot). The udev rules apply immediately.
The CH341/CH32V208 serial chips use a kernel built-in driver — no separate driver install needed on any modern distro (kernel 4.x+).
Full details: Linux Permission Access.
Openterface QT runs on both. Qt auto-detects via QT_QPA_PLATFORM:
-
X11:
QT_QPA_PLATFORM=xcb(default on most X11 desktops) -
Wayland:
QT_QPA_PLATFORM=wayland(default on GNOME/Fedora, KDE Plasma 6)
The GStreamer video overlay uses GstVideoOverlay, which embeds differently on X11 (XID) vs Wayland (protocol-dependent).
Known Wayland issues:
- Video may fall back to XWayland if the GStreamer sink lacks native Wayland support
- Some compositors mis-handle the video overlay window
If video display is broken on Wayland, force X11:
QT_QPA_PLATFORM=xcb openterfaceQTUbuntu / Debian
sudo apt-get update -y
sudo apt-get install -y \
build-essential cmake \
qt6-base-dev qt6-multimedia-dev qt6-serialport-dev qt6-svg-dev qt6-tools-dev \
libusb-1.0-0-dev libudev-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
pkg-config libx11-dev libxrandr-dev libxrender-dev \
libexpat1-dev libfreetype6-dev libfontconfig1-dev libbz2-dev \
libturbojpeg0-dev libva-dev \
libavformat-dev libavcodec-dev libavdevice-dev libavutil-dev \
libswresample-dev libswscale-dev ffmpeg libssl-devUbuntu 24.04+: use
libturbojpeg-devinstead oflibturbojpeg0-dev.
Fedora / RHEL
sudo dnf install -y \
gcc gcc-c++ cmake \
qt6-qtbase-devel qt6-qtmultimedia-devel qt6-qtserialport-devel \
qt6-qtsvg-devel qt6-qttools-devel \
libusb1-devel libudev-devel \
gstreamer1-devel gstreamer1-plugins-base-devel \
pkg-config libX11-devel libXrandr-devel libXrender-devel \
libexpat-devel freetype-devel fontconfig-devel bzip2-devel \
turbojpeg-devel libva-devel ffmpeg-devel openssl-develFedora uses /usr/lib64 for libraries and /usr/include/ffmpeg/ for headers.
openSUSE
sudo zypper install -y \
cmake gcc-c++ \
libQt6Base-devel libQt6Multimedia-devel libQt6SerialPort-devel \
libQt6Svg-devel libQt6Tools-devel \
libusb-1_0-devel libudev-devel \
gstreamer-devel gstreamer-plugins-base-devel \
pkg-config libX11-devel libXrandr-devel libXrender-devel \
libexpat-devel freetype2-devel fontconfig-devel libbz2-devel \
libjpeg8-devel libva-devel ffmpeg-devel libopenssl-develgit clone https://github.com/TechxArtisanStudio/Openterface_QT.git
cd Openterface_QT
mkdir build && cd buildConfigure for your distro:
Ubuntu/Debian (x64):
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu/cmake/Qt6Fedora/RHEL (x64):
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=/usr/lib64/cmake/Qt6 \
-DOPENTERFACE_BUILD_STATIC=OFF \
-DUSE_SHARED_FFMPEG=ON \
-DFFMPEG_PREFIX=/usropenSUSE (x64):
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=/usr/lib64/cmake/Qt6 \
-DOPENTERFACE_BUILD_STATIC=OFF \
-DUSE_SHARED_FFMPEG=ON \
-DFFMPEG_PREFIX=/usr/lib64ARM64 (Raspberry Pi, etc.):
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=/usr/lib/aarch64-linux-gnu/cmake/Qt6 \
-DOPENTERFACE_BUILD_STATIC=OFF \
-DUSE_SHARED_FFMPEG=ON \
-DFFMPEG_PREFIX=/usr/lib/aarch64-linux-gnuCompile and install:
make -j$(nproc)
sudo make installWhat gets installed:
- Binary:
/usr/local/bin/openterfaceQT - Desktop entry:
/usr/share/applications/com.openterface.openterfaceQT.desktop - Icon:
/usr/share/icons/hicolor/256x256/apps/com.openterface.openterfaceQT.png
Update the desktop database so the menu entry appears:
sudo update-desktop-database /usr/share/applications/ 2>/dev/null || true
sudo gtk-update-icon-cache -f /usr/local/share/icons/hicolor 2>/dev/null || true- Pi 4 or 5 recommended; 4 GB+ RAM for smooth video decoding.
- Pi 3 works but has performance issues.
- Use 64-bit Raspberry Pi OS; 32-bit is not supported (Qt is too old).
- Hardware video decode via V4L2-M2M (VAAPI is Intel-only and not available on Pi).
Check available hardware accelerations:
ffmpeg -hwaccels| Option | Default | Description |
|---|---|---|
OPENTERFACE_BUILD_STATIC |
ON |
Link libraries statically where possible |
USE_SHARED_FFMPEG |
OFF |
Use shared FFmpeg (.so) — required on Fedora/openSUSE |
FFMPEG_PREFIX |
/opt/ffmpeg |
Path to FFmpeg install (headers + libs) |
CMAKE_PREFIX_PATH |
(auto) | Path to Qt6 CMake config |
Full build docs: BUILD.md.
- Confirm the serial node exists:
ls /dev/ttyUSB* /dev/ttyACM*
- If missing, check for BRLTTY stealing the device:
Mask it if active (see §2).
systemctl status brltty
- If present but
Permission denied, rerun the one-command setup in §2 and log out/in. - Try
sudo openterfaceQTto confirm it is a permission issue, not a hardware one.
Almost always BRLTTY. Mask it:
sudo systemctl mask brltty-udev.service brltty.service
sudo systemctl stop brltty-udev.service brltty.service- Verify the UVC device:
ls /dev/video* - Check your user is in the
videogroup:groups $USER | grep -q video && echo ok
- On Wayland, try forcing X11:
QT_QPA_PLATFORM=xcb openterfaceQT.
Set the Qt plugin paths explicitly:
export QT_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt6/plugins
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_PLUGIN_PATH/platforms
export QT_QPA_PLATFORM=xcb
openterfaceQTAdjust the path for your distro:
- Fedora:
/usr/lib64/qt6/plugins - openSUSE:
/usr/lib64/qt6/plugins
✗ Missing: /opt/ffmpeg/lib/libavdevice.a
CMake Error at cmake/FFmpeg.cmake:322
The build defaults to /opt/ffmpeg. Most distros install FFmpeg system-wide. Use shared FFmpeg and point at the real path:
# Fedora
cmake .. -DUSE_SHARED_FFMPEG=ON -DFFMPEG_PREFIX=/usr
# Ubuntu/Debian
cmake .. -DUSE_SHARED_FFMPEG=ON -DFFMPEG_PREFIX=/usr/lib/x86_64-linux-gnuFedora provides FFmpeg headers in /usr/include/ffmpeg/ — -DFFMPEG_PREFIX=/usr (not /usr/lib64) so both headers and libs are found.
footer