Open-source Linux replacement for L-Connect 3.
Fan speed control, RGB/LED effects, LCD streaming, and sensor gauges for all Lian Li devices.
| Device | Fan Control | RGB | LCD | Pump | Tested |
|---|---|---|---|---|---|
| UNI FAN SL / AL / SL Infinity / SL V2 / AL V2 | 4 groups | Yes | - | - | Yes |
| UNI FAN TL Controller | 4 ports | Yes | - | - | Yes |
| UNI FAN TL LCD | 4 ports | Yes | 400x400 | - | Yes |
| Galahad II Trinity AIO | Yes | Yes | - | Yes | - |
| HydroShift LCD AIO | Yes | Yes | 480x480 | Yes | Yes |
| Galahad II LCD / Vision AIO | Yes | Yes | 480x480 | Yes | -* |
* Galahad II LCD / Vision uses the same driver as HydroShift LCD AIO.
| Device | Fan Control | RGB | LCD | Pump | Tested |
|---|---|---|---|---|---|
| UNI FAN TL V2 (LCD / LED) | Yes | Yes | 400x400 | - | Yes |
| UNI FAN SL V3 (LCD / LED) | Yes | Yes | 400x400 | - | Yes |
| UNI FAN SL-INF | Yes | Yes | - | - | - |
| UNI FAN CL / RL120 | Yes | Yes | - | - | - |
| HydroShift Wireless AIO | Yes | Yes | - | Yes | - |
| HydroShift II Wireless AIO | Yes | Yes | - | Yes | - |
| Strimer Plus Wireless | - | Yes | - | - | - |
| Lancool 217 Wireless | - | Yes | - | - | - |
| Lancool V150 Wireless | Yes | Yes | - | - | - |
| Universal Screen 8.8" Wireless | - | Yes | - | - | - |
Both V1 (VID 0x0416) and V2 (VID 0x1A86) wireless dongles are supported.
Note: Wireless fans must be bound to a Wireless dongle using L-Connect 3 on Windows before they can be used here. If you don't have a Windows install, you can run L-Connect 3 in a VM and pass the USB dongle through to pair your devices. This is only required 1 time if you have never configured your fans on Windows.
Note 2: Wireless devices with LCDs still need to be plugged in via USB to control the LCD. LCD cannot be controlled through wireless dongle alone.
| Device | LCD | Tested | Notes |
|---|---|---|---|
| HydroShift II LCD Circle | 480x480 | Yes | |
| HydroShift II LCD Square | 480x480 | Yes | |
| Lancool 207 Digital | 1472x720 | Yes | |
| Universal Screen 8.8" | 1920x480 | - | |
| Universal Screen 8.8" LED Ring | - | - | RGB detection only (control TBD) |
Devices stuck in desktop/display mode are detected and can be switched back to LCD mode via the GUI.
| Device | RGB | Tested |
|---|---|---|
| Strimer Plus (wired) | Yes | - |
If you've tested a device that isn't marked above, please open an issue or PR to update this table.
lianli-daemon User service - fan control loop + LCD streaming
lianli-devices HID/USB device drivers
lianli-transport USB bulk transport (wireless protocol, display streaming)
lianli-media Image/video/GIF encoding, sensor gauge rendering
lianli-shared IPC types, config schema, device IDs
lianli-gui Slint desktop app - connects to daemon via Unix socket
The daemon runs as a user systemd service. USB access is granted via udev rules (no root required).
The GUI connects over $XDG_RUNTIME_DIR/lianli-daemon.sock.
yay -S lianli-linux-gitOr with any AUR helper (paru, trizen, etc.). This installs both binaries, udev rules, systemd service (auto-enabled), desktop entry, and icons. After installing, reboot or run:
sudo udevadm control --reload-rules && sudo udevadm trigger
systemctl --user daemon-reload && systemctl --user start lianli-daemon- Clone the repo and submodules:
git clone --recurse-submodules https://github.com/sgtaziz/lian-li-linux.git && cd lian-li-linuxIf you already cloned without
--recurse-submodules, run:git submodule update --init --recursive
- Install dependencies:
- Rust (stable, 1.75+)
- ffmpeg and ffprobe in
PATH(for video/GIF decoding) - System libraries:
# Arch
sudo pacman -S hidapi libusb ffmpeg fontconfig mesa libxkbcommon wayland libx11 libinput libdrm clang cmake pkg-config
# Ubuntu / Debian
sudo apt install libhidapi-dev libusb-1.0-0-dev libudev-dev libfontconfig-dev \
libxkbcommon-dev libwayland-dev libx11-dev libinput-dev libdrm-dev \
libgl-dev libegl-dev clang cmake pkg-config ffmpeg
# Fedora
sudo dnf install hidapi-devel libusb1-devel fontconfig-devel \
libxkbcommon-devel wayland-devel libX11-devel libinput-devel libdrm-devel \
mesa-libGL-devel mesa-libEGL-devel clang cmake pkg-config ffmpeg- Build:
cargo build --releaseBinaries: target/release/lianli-daemon and target/release/lianli-gui
- Install udev rules (required for USB access without root):
sudo cp udev/99-lianli.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger- Install and start the daemon:
# Copy binary
cp target/release/lianli-daemon ~/.local/bin/
# Install and start user systemd service
mkdir -p ~/.config/systemd/user
cp systemd/lianli-daemon.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now lianli-daemonA default config is created automatically at ~/.config/lianli/config.json on first run.
- Install the GUI (optional):
cp target/release/lianli-gui ~/.local/bin/
# Install icons
for size in 32x32 128x128 256x256; do mkdir -p ~/.local/share/icons/hicolor/$size/apps; done
cp assets/icons/32x32.png ~/.local/share/icons/hicolor/32x32/apps/lianli-gui.png
cp assets/icons/128x128.png ~/.local/share/icons/hicolor/128x128/apps/lianli-gui.png
cp assets/icons/128x128@2x.png ~/.local/share/icons/hicolor/256x256/apps/lianli-gui.png
# Install desktop entry
cp lianli-gui.desktop ~/.local/share/applications/
update-desktop-database ~/.local/share/applications/- Build the Docker image:
docker build -f docker/build.Dockerfile -t lianli-linux-builder \
--build-arg USER_ID="$(id -u)" \
--build-arg GROUP_ID="$(id -g)" \
.- Build the project:
docker run --rm -it \
-v "$PWD:/work" \
-v "$PWD/target:/work/target" \
-v "$PWD/.cache/cargo-registry:/home/builder/.cargo/registry" \
-v "$PWD/.cache/cargo-git:/home/builder/.cargo/git" \
lianli-linux-builderThen follow steps 4-6 from "From Source" above.
The daemon reads ~/.config/lianli/config.json. The GUI edits this file via the daemon's IPC socket.
Each LCD entry specifies a target device (by serial), media type, and orientation:
| Type | Description |
|---|---|
image |
Static image (JPEG, PNG, BMP, GIF) |
video |
Video file (decoded frame-by-frame via ffmpeg) |
gif |
Animated GIF |
color |
Solid RGB color |
sensor |
Live sensor gauge (CPU temp, GPU temp, etc.) |
Fan curves map a temperature source (any shell command) to a speed percentage. Points are linearly interpolated; temperatures outside the curve range clamp to the nearest point's speed.
| Mode | Description |
|---|---|
0 |
Off (0% PWM) |
"curve-name" |
Follow a named fan curve |
1-255 |
Constant PWM duty (1=0.4%, 128=50%, 255=100%) |
"__mb_sync__" |
Mirror motherboard PWM signal (hardware passthrough) |
Daemon won't start / no devices found:
# Check udev rules are loaded
sudo udevadm test /sys/bus/usb/devices/<your-device>
# Check daemon logs
journalctl --user -u lianli-daemon -fGUI says "Daemon offline":
# Verify daemon is running
systemctl --user status lianli-daemon
# Check socket exists
ls -la $XDG_RUNTIME_DIR/lianli-daemon.sockPermission denied on USB device:
# Re-trigger udev after plugging in device
sudo udevadm triggerMIT. See LICENSE.
This project is not affiliated with Lian Li Industrial Co., Ltd. Protocol information was obtained through reverse engineering for interoperability purposes.