Skip to content

DevPossible/LCDPossible

Repository files navigation

LCDPossible

Cross-platform .NET 10 LCD controller service for HID-based LCD screens.

CI Release License

Overview

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

Supported Devices

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.

Quick Start

# 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 serve

Installation

One-Line Install (Recommended)

Install LCDPossible with all dependencies using a single command:

Windows (PowerShell as Administrator):

irm https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/install-windows.ps1 | iex

Ubuntu/Debian:

curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/install-ubuntu.sh | bash

Fedora/RHEL:

curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/install-fedora.sh | bash

Arch Linux:

curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/install-arch.sh | bash

macOS:

curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/install-macos.sh | bash

Proxmox VE (run as root):

curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/install-proxmox.sh | bash

These 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)

Manual Installation

Windows (Manual)
  1. Download the latest lcdpossible-x.x.x-win-x64.zip from Releases
  2. Extract to a folder (e.g., C:\Program Files\LCDPossible)
  3. Run LCDPossible.exe from 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 LCDPossible
Linux (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 ~/.bashrc
macOS (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 ~/.zshrc

Build from Source

Requires .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"

Uninstall

One-Line Uninstall

Remove LCDPossible using a single command:

Windows (PowerShell as Administrator):

irm https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/uninstall-windows.ps1 | iex

Ubuntu/Debian/Proxmox:

curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/uninstall-ubuntu.sh | sudo bash

Fedora/RHEL:

curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/uninstall-fedora.sh | sudo bash

Arch Linux:

curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/uninstall-arch.sh | sudo bash

macOS:

curl -sSL https://raw.githubusercontent.com/DevPossible/LCDPossible/main/scripts/uninstall-macos.sh | bash

These 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

Remove Configuration Files

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 -RemoveConfig

Local Uninstall Script

If 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-config

Remote Uninstall via SSH

Use 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 macos

Available distros: ubuntu, debian, proxmox, fedora, arch, macos

CLI Commands

Device Management

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

Panel Display

# 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 panels

Profile Management

lcdpossible 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 profile

Service Control

lcdpossible serve                   # Start service (foreground)
lcdpossible serve --service         # Run as Windows Service
lcdpossible stop                    # Stop the service
lcdpossible status                  # Show service status

Testing & Debugging

lcdpossible 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 diagnostics

Available Panels

Full Documentation: See docs/panels/README.md for detailed panel documentation with screenshots.

CPU

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

GPU

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

Media

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

Memory

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

Network

Panel Description
network-info Network configuration including hostname, IP addresses, gateway, and DNS

Proxmox

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

Screensaver

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

System

Panel Description
basic-info Basic system information including hostname, OS, and uptime
basic-usage-text Simple CPU/RAM/GPU usage summary

Thermal

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

Web

Panel Description
html: Renders a local HTML file using headless browser
web: Renders a live website from URL

Media Panel Examples

# 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.html

Configuration

YAML Display Profiles

Profiles 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

Available Transitions

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)

Environment Variables

Variable Description
LCDPOSSIBLE_DATA_DIR Override user data directory

Proxmox VE Integration

LCDPossible can display real-time metrics from your Proxmox VE cluster.

Creating an API Token

  1. Log into Proxmox web interface
  2. Navigate to Datacenter > Permissions > API Tokens
  3. Click Add and create a token (e.g., monitor@pve!lcdpossible)
  4. Copy the token secret (shown only once)

Required Permissions

pveum aclmod / -user monitor@pve -role PVEAuditor

Configuration

Add 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

Linux USB Permissions

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 trigger

Project Structure

LCDPossible/
├── .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

Technology Stack

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

Contributing

Contributions are welcome! Please read the Implementation Plan for architecture details.

Commit Message Format

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

Adding a New Device Driver

  1. Create a driver class implementing ILcdDevice in src/LCDPossible.Core/Devices/Drivers/{Manufacturer}/
  2. Register the driver in the driver registry
  3. Add device documentation to docs/devices/{VID-PID}/
  4. Add tests

Adding a New Panel Plugin

  1. Create a new project implementing IPanelPlugin
  2. Reference LCDPossible.Sdk
  3. Implement panel types with IDisplayPanel
  4. Build to the plugins/ directory

License

MIT License - see LICENSE file.

Acknowledgments

About

Cross-platform .NET LCD controller for HID-based LCD screens (Thermalright Trofeo Vision, etc.)

Resources

License

Security policy

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •