Cross-platform .NET 10 LCD controller service for HID-based LCD screens.
LCDPossible is an open-source alternative to vendor-specific Windows-only software for controlling HID-based LCD displays found in AIO coolers and other PC components. It provides:
- Real-time system monitoring - CPU, GPU, RAM usage and temperatures
- Media playback - Animated GIFs, videos, YouTube, and web pages
- Screensavers - 14 built-in animated screensavers
- Slideshows - Automatic panel rotation with smooth transitions
- Plugin architecture - Extensible panel system
- Cross-platform - Windows, Linux, and macOS support
| Device | VID | PID | Resolution | Status |
|---|---|---|---|---|
| Thermalright Trofeo Vision 360 ARGB | 0x0416 | 0x5302 | 1280x480 | Fully Supported |
| Thermalright PA120 Digital | 0x0416 | 0x8001 | Segment | Driver Ready |
Additional HID-based LCD devices can be supported by implementing the ILcdDevice interface.
# List connected LCD devices
lcdpossible list
# Display system info
lcdpossible show basic-info
# Display CPU and GPU monitors
lcdpossible show cpu-usage-graphic,gpu-usage-graphic
# Run a screensaver
lcdpossible show starfield
# Start the service with default slideshow
lcdpossible serveInstall LCDPossible with all dependencies using a single command:
Windows (PowerShell as Administrator):
irm https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/install-windows.ps1 | iexUbuntu/Debian:
curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/install-ubuntu.sh | bashFedora/RHEL:
curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/install-fedora.sh | bashArch Linux:
curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/install-arch.sh | bashmacOS:
curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/install-macos.sh | bashProxmox VE (run as root):
curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/install-proxmox.sh | bashThese scripts will:
- Install all required dependencies (LibVLC, fonts)
- Download the latest release
- Set up USB device permissions (Linux)
- Install and enable the service (systemd/launchd/Windows Service)
Windows (Manual)
- Download the latest
lcdpossible-x.x.x-win-x64.zipfrom Releases - Extract to a folder (e.g.,
C:\Program Files\LCDPossible) - Run
LCDPossible.exefrom the command line or add to PATH
Install as Windows Service:
# Run as Administrator
sc.exe create LCDPossible binPath= "C:\Program Files\LCDPossible\LCDPossible.exe serve --service" start= auto
sc.exe start LCDPossibleLinux (Manual)
# Install dependencies (Ubuntu/Debian)
sudo apt install vlc libvlc-dev fonts-dejavu-core
# Download and extract
wget https://github.com/DevPossible/LCDPossible/releases/latest/download/lcdpossible-x.x.x-linux-x64.tar.gz
sudo mkdir -p /opt/lcdpossible
sudo tar -xzf lcdpossible-*.tar.gz -C /opt/lcdpossible
# Install udev rules for USB access
sudo tee /etc/udev/rules.d/99-lcdpossible.rules << 'EOF'
SUBSYSTEM=="usb", ATTR{idVendor}=="0416", ATTR{idProduct}=="5302", MODE="0666", TAG+="uaccess"
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0416", MODE="0666", TAG+="uaccess"
EOF
sudo udevadm control --reload-rules && sudo udevadm trigger
# Add to PATH
echo 'export PATH="/opt/lcdpossible:$PATH"' >> ~/.bashrc
source ~/.bashrcmacOS (Manual)
# Install dependencies
brew install vlc
# Download and extract
curl -LO https://github.com/DevPossible/LCDPossible/releases/latest/download/lcdpossible-x.x.x-osx-x64.tar.gz
mkdir -p ~/.local/share/lcdpossible
tar -xzf lcdpossible-*.tar.gz -C ~/.local/share/lcdpossible
# Add to PATH
echo 'export PATH="$HOME/.local/share/lcdpossible:$PATH"' >> ~/.zshrc
source ~/.zshrcRequires .NET 10 SDK.
git clone https://github.com/DevPossible/LCDPossible.git
cd LCDPossible
# Build
./build.ps1
# or: dotnet build src/LCDPossible.sln
# Run tests
./test-full.ps1
# Package for distribution
./package.ps1 -Version "1.0.0"Remove LCDPossible using a single command:
Windows (PowerShell as Administrator):
irm https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/uninstall-windows.ps1 | iexUbuntu/Debian/Proxmox:
curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/uninstall-ubuntu.sh | sudo bashFedora/RHEL:
curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/uninstall-fedora.sh | sudo bashArch Linux:
curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/uninstall-arch.sh | sudo bashmacOS:
curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/uninstall-macos.sh | bashThese scripts will:
- Stop and remove the service (systemd/launchd/Windows Service)
- Remove the symlink or PATH entry
- Remove installed files from the installation directory
- Preserve configuration files by default
To also remove configuration files, use the --remove-config flag:
# Linux/macOS
curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/uninstall-ubuntu.sh | sudo bash -s -- --remove-config
# Windows
irm https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/uninstall-windows.ps1 -OutFile uninstall.ps1; .\uninstall.ps1 -RemoveConfigIf you have the repository cloned, you can use the local scripts:
# Windows
.\scripts\uninstall-windows.ps1
.\scripts\uninstall-windows.ps1 -RemoveConfig # Also remove config
# Linux/macOS
sudo ./scripts/uninstall-ubuntu.sh
sudo ./scripts/uninstall-ubuntu.sh --remove-configUse uninstall-local.ps1 to uninstall from a remote Linux/macOS host:
# Basic uninstall
.\scripts\uninstall-local.ps1 -TargetHost myserver.local
# Specify distro and remove config
.\scripts\uninstall-local.ps1 -TargetHost 192.168.1.100 -Distro proxmox -RemoveConfig
# macOS target
.\scripts\uninstall-local.ps1 -TargetHost mymac -User admin -Distro macosAvailable distros: ubuntu, debian, proxmox, fedora, arch, macos
lcdpossible list # List connected LCD devices
lcdpossible test-pattern # Display test pattern on all devices
lcdpossible test-pattern -d 0 # Display test pattern on device 0
lcdpossible set-brightness 80 # Set brightness to 80%
lcdpossible set-image -p image.jpg # Display a static image# Show single panel
lcdpossible show cpu-info
# Show multiple panels (slideshow)
lcdpossible show cpu-info,gpu-info,ram-info
# Custom duration per panel (seconds)
lcdpossible show cpu-info|@duration=30
# Custom update interval (seconds)
lcdpossible show cpu-usage-graphic|@interval=2
# Use wildcards
lcdpossible show cpu-* # All CPU panels
lcdpossible show *-graphic # All graphic panels
lcdpossible show * # ALL panelslcdpossible profile new myprofile # Create profile
lcdpossible profile list # List all profiles
lcdpossible profile show myprofile # Show profile details
lcdpossible profile append-panel cpu-usage-graphic # Add panel to default profile
lcdpossible profile append-panel gpu-info -p myprofile -d 15 # Add to specific profile
lcdpossible profile remove-panel 0 # Remove panel at index 0
lcdpossible profile move-panel 0 2 # Move panel from index 0 to 2
lcdpossible profile set-defaults --interval 5 # Set default update interval
lcdpossible profile delete myprofile # Delete profilelcdpossible serve # Start service (foreground)
lcdpossible serve --service # Run as Windows Service
lcdpossible stop # Stop the service
lcdpossible status # Show service statuslcdpossible test # Render default panels to files
lcdpossible test cpu-* # Render matching panels to files
lcdpossible test "*" # Render ALL panels to files
lcdpossible list-panels # List all available panel types
lcdpossible help-panel cpu-info # Show help for specific panel
lcdpossible sensors # List hardware sensors (Windows)
lcdpossible debug # Run diagnosticsFull Documentation: See docs/panels/README.md for detailed panel documentation with screenshots.
| Panel | Description |
|---|---|
cpu-info |
Detailed CPU information including model, usage, temperature, frequency, and power |
cpu-usage-graphic |
CPU usage with graphical bars including per-core breakdown |
cpu-usage-text |
CPU usage displayed as large text percentage |
| Panel | Description |
|---|---|
gpu-info |
GPU information including model, usage, temperature, and VRAM |
gpu-usage-graphic |
GPU usage with graphical bars |
gpu-usage-text |
GPU usage displayed as large text |
| Panel | Description |
|---|---|
animated-gif: |
Plays animated GIF files or URLs with full animation support |
image-sequence: |
Plays a sequence of numbered images from a folder at 30fps |
video: |
Plays video files, streaming URLs, or YouTube links |
| Panel | Description |
|---|---|
ram-info |
Memory information including total, used, and available |
ram-usage-graphic |
RAM usage with graphical bar |
ram-usage-text |
RAM usage displayed as large text |
| Panel | Description |
|---|---|
network-info |
Network configuration including hostname, IP addresses, gateway, and DNS |
| Panel | Description |
|---|---|
proxmox-summary |
Proxmox cluster overview with node status and resource usage |
proxmox-vms |
List of VMs and containers with status and resource usage |
| Panel | Description |
|---|---|
clock |
Analog clock with smooth second hand |
asteroids |
Asteroids game simulation with vector graphics |
bouncing-logo: |
Customizable text bouncing off screen edges (DVD screensaver style) with color, size, 3D, and rotation options |
bubbles |
Floating, bouncing translucent bubbles |
falling-blocks: |
Tetris-style falling blocks simulator with AI gameplay |
fire |
Classic demoscene fire effect with palette animation |
game-of-life |
Conway's cellular automaton with colorful patterns |
matrix-rain |
Digital rain effect inspired by The Matrix |
missile-command |
Defend cities from incoming missiles |
mystify |
Bouncing connected polygons with color trails |
pipes |
3D pipes growing in random directions (classic Windows) |
plasma |
Classic demoscene plasma effect |
rain |
Falling raindrops with splash effects |
screensaver: |
Plays a random screensaver effect or cycles through all |
spiral |
Hypnotic rotating spiral pattern |
starfield |
Classic starfield warp effect with stars streaming from center |
noise |
TV static / white noise effect |
warp-tunnel |
Flying through a colorful warp tunnel |
| Panel | Description |
|---|---|
basic-info |
Basic system information including hostname, OS, and uptime |
basic-usage-text |
Simple CPU/RAM/GPU usage summary |
| Panel | Description |
|---|---|
cpu-thermal-graphic |
CPU temperature with graphical gauge display |
gpu-thermal-graphic |
GPU temperature with graphical gauge display |
system-thermal-graphic |
Combined CPU and GPU temperature display with vertical thermometers |
| Panel | Description |
|---|---|
html: |
Renders a local HTML file using headless browser |
web: |
Renders a live website from URL |
# Animated GIF
lcdpossible show animated-gif:https://upload.wikimedia.org/wikipedia/commons/2/2c/Rotating_earth_%28large%29.gif
# Video from URL (CC-BY Big Buck Bunny)
lcdpossible show video:https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4
# YouTube video
lcdpossible show video:https://www.youtube.com/watch?v=aqz-KE-bpKQ
# Live weather display
lcdpossible show web:https://wttr.in/London
# Local HTML dashboard
lcdpossible show html:/path/to/dashboard.htmlProfiles are stored in platform-specific locations:
- Windows:
%APPDATA%\LCDPossible\ - Linux:
~/.config/LCDPossible/ - macOS:
~/Library/Application Support/LCDPossible/
Example profile (profile.yaml):
name: "My Display Profile"
description: "System monitoring slideshow"
# Defaults for all slides
default_duration: 15
default_update_interval: 5
default_transition: crossfade
default_transition_duration: 800
# Color scheme
colors:
background: "#0F0F19"
text_primary: "#FFFFFF"
accent: "#0096FF"
usage_low: "#32C864"
usage_medium: "#0096FF"
usage_high: "#FFB400"
usage_critical: "#FF3232"
# Slideshow panels
slides:
- panel: basic-info
duration: 10
- panel: cpu-usage-graphic
duration: 15
update_interval: 2
- panel: gpu-usage-graphic
duration: 15
transition: slide-left
- panel: ram-usage-graphic
duration: 10
- panel: starfield
duration: 30| Transition | Description |
|---|---|
none |
Instant switch |
fade |
Fade from black |
crossfade |
Dissolve between panels |
slide-left/right/up/down |
Directional slide |
wipe-left/right/up/down |
Wipe effect |
zoom-in/out |
Scale transition |
push-left/right |
Push old frame out |
random |
Random selection (default) |
| Variable | Description |
|---|---|
LCDPOSSIBLE_DATA_DIR |
Override user data directory |
LCDPossible can display real-time metrics from your Proxmox VE cluster.
- Log into Proxmox web interface
- Navigate to Datacenter > Permissions > API Tokens
- Click Add and create a token (e.g.,
monitor@pve!lcdpossible) - Copy the token secret (shown only once)
pveum aclmod / -user monitor@pve -role PVEAuditorAdd to appsettings.json:
{
"LCDPossible": {
"Proxmox": {
"Enabled": true,
"ApiUrl": "https://proxmox.local:8006",
"TokenId": "monitor@pve!lcdpossible",
"TokenSecret": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"IgnoreSslErrors": true,
"PollingIntervalSeconds": 5,
"ShowVms": true,
"ShowContainers": true,
"ShowAlerts": true,
"MaxDisplayItems": 10
}
}
}| Option | Default | Description |
|---|---|---|
Enabled |
false |
Enable Proxmox integration |
ApiUrl |
"" |
Proxmox API URL (e.g., https://proxmox.local:8006) |
TokenId |
"" |
API token ID (format: user@realm!tokenid) |
TokenSecret |
"" |
API token secret |
IgnoreSslErrors |
false |
Skip SSL verification (for self-signed certs) |
PollingIntervalSeconds |
5 |
How often to fetch metrics |
ShowVms |
true |
Show VM status in panels |
ShowContainers |
true |
Show container status in panels |
ShowAlerts |
true |
Show cluster alerts |
MaxDisplayItems |
10 |
Max items per category |
Create /etc/udev/rules.d/99-lcdpossible.rules:
# Thermalright LCD devices
SUBSYSTEM=="usb", ATTR{idVendor}=="0416", ATTR{idProduct}=="5302", MODE="0666", TAG+="uaccess"
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0416", MODE="0666", TAG+="uaccess"
Then reload:
sudo udevadm control --reload-rules
sudo udevadm triggerLCDPossible/
├── .github/ # CI/CD workflows
├── docs/ # Documentation
│ ├── LCD-Technical-Reference.md # USB HID protocol details
│ ├── Implementation-Plan.md # Architecture documentation
│ └── devices/ # Per-device specifications
├── scripts/ # Build and deployment scripts
├── src/
│ ├── LCDPossible.sln # Solution file
│ ├── LCDPossible/ # Main executable (CLI + service)
│ ├── LCDPossible.Core/ # Core library
│ ├── LCDPossible.Sdk/ # Plugin SDK
│ └── LCDPossible.Plugins.*/ # Built-in plugins
├── tests/
│ ├── LCDPossible.Core.Tests/ # Unit tests
│ └── LCDPossible.FunctionalTests/ # Functional tests
├── build.ps1 # Build script
├── package.ps1 # Package for distribution
├── start-app.ps1 # Run service
├── test-smoke.ps1 # Quick tests
└── test-full.ps1 # Full test suite
| Package | Purpose |
|---|---|
| HidSharp | Cross-platform USB HID |
| SixLabors.ImageSharp | Image processing |
| LibVLCSharp | Video playback |
| PuppeteerSharp | Headless browser |
| YoutubeExplode | YouTube stream extraction |
| LibreHardwareMonitorLib | Hardware monitoring (Windows) |
| Microsoft.Extensions.Hosting | Service hosting |
Contributions are welcome! Please read the Implementation Plan for architecture details.
We use Conventional Commits:
feat: add new panel type # Minor version bump
fix: correct USB timeout handling # Patch version bump
feat!: redesign device driver API # Major version bump (breaking)
docs: update installation guide # No version bump
- Create a driver class implementing
ILcdDeviceinsrc/LCDPossible.Core/Devices/Drivers/{Manufacturer}/ - Register the driver in the driver registry
- Add device documentation to
docs/devices/{VID-PID}/ - Add tests
- Create a new project implementing
IPanelPlugin - Reference
LCDPossible.Sdk - Implement panel types with
IDisplayPanel - Build to the
plugins/directory
MIT License - see LICENSE file.
- thermalright-lcd-control - Python GUI for Thermalright LCDs
- trlcd_libusb - C implementation with libusb
- digital_thermal_right_lcd - Python reference for PA120
- HidSharp - Cross-platform HID library