An IVNS product. A free, open-source Windows service that streams live system stats to the Thermalright Stream Vision AIO-cooler USB LCD (the "USBDISPLAY" screen) and optionally drives a temperature/load‑based fan curve — all controlled from a secure web panel.
It exists because the factory software (TR‑VISION HOME) talks to the screen over ADB and may fail to detect it, leaving the LCD dark. This service drives the panel directly over WinUSB instead, so the screen works regardless — and it adds real CPU/GPU temperatures and fan control the factory app never had.
- Live system monitor on the 640×480 LCD: hostname, clock/date, CPU load, CPU temp, GPU temp, RAM, and fan RPMs.
- Multiple modes: system monitor, custom text, an uploaded image, or a solid color.
- Real sensors via LibreHardwareMonitor (CPU package temp, per‑GPU core temp, fan tachometers).
- Temperature/load fan curve driving the motherboard Super‑I/O fan headers, with hard safety rails (see below).
- Secure web control panel (token‑authenticated) reachable from the PC or any device on your LAN/phone.
- Runs as a proper Windows service under
LocalSystem, auto‑starts on boot, auto‑restarts on failure. - Settings persist across restarts.
This software can override your motherboard's BIOS fan curve. Read this before enabling fan control:
- Fan control is OFF by default. Nothing is changed until you enable it in the panel.
- Your AIO pump header is pinned to 100% and can never be placed on a curve.
- A minimum‑PWM floor prevents fans from stopping, and a critical‑temperature failsafe forces 100%.
- When the service stops (or crashes), all controlled fans are released back to BIOS control.
- Still, you use this at your own risk. Verify your fan/pump headers and curve, and watch temperatures after enabling. The software is provided "as is" with no warranty (see LICENSE).
- Not affiliated with or endorsed by Thermalright. Product names and trademarks belong to their respective owners.
- Windows 10/11 (x64).
- A Thermalright Stream Vision–class USB LCD that enumerates as WinUSB device
VID 87AD/PID 70DB(ChiZhu Tech "USBDISPLAY", modelSSCRM-V1, 640×480, JPEG frames). The screen must be bound to the WinUSB driver (it self‑registers its device interface GUID, so Windows usually does this automatically). - Fan control additionally requires a motherboard whose Super‑I/O chip is supported by LibreHardwareMonitor (developed/tested on ASRock B550 / Nuvoton NCT6796D). The fan‑header identifiers and the pump header are configurable.
- To build from source: the .NET 9 SDK. To run a published build: the .NET 9 Runtime (the
Install-Service.ps1deploys a framework‑dependent build that uses the shared runtime; SYSTEM can access it).
The screen is driven by the SSCRM bulk protocol, so other coolers in the same family (GrandVision, Mjolnir Vision, Wonder Vision Pro, etc.) may also work. Fan‑header IDs differ per board — adjust them in the panel.
git clone https://github.com/tomasrch/STREAM-VISION-AIO-DISPLAY-SERVICE.git
cd STREAM-VISION-AIO-DISPLAY-SERVICE
dotnet publish -c Release -o publish
# then, in an elevated PowerShell:
powershell -ExecutionPolicy Bypass -File .\Install-Service.ps1Install-Service.ps1 (run as Administrator) copies the build to
C:\Program Files\IVNS\Stream Vision AIO Display Service\, registers the
StreamVisionDisplay service as LocalSystem with auto‑start + auto‑restart,
and starts it.
On start the service prints (to the Windows Event Log) and writes the control‑panel URL with its API key. The key is stored at:
C:\ProgramData\StreamVisionDisplay\api.key
Open the panel:
http://localhost:8770/?key=<the key from api.key>
From another device on your network, replace localhost with the PC's LAN IP. The browser remembers the key after the first visit.
Run as Administrator:
powershell -ExecutionPolicy Bypass -File .\Uninstall-Service.ps1- Display section — pick a mode and tune it live:
- Monitor: set the title (defaults to the PC name), toggle Clock, CPU load, CPU temp, GPU temp, RAM, and Fan RPM; choose background/text/accent colors.
- Text: show any multi‑line text at a chosen size.
- Image: upload a picture (centered and scaled to fit).
- Color: a solid fill.
- FPS and Rotate (0/90/180/270) apply to every mode.
- Fan curve section — see below. A live preview of exactly what's on the LCD is shown top‑left, alongside service status (display connected, frame count, admin, temp source, fan state).
- Check the Curve box next to each fan header you want the curve to drive. (Headers that aren't spinning show
-RPM.) - The pump (Fan #2 / WP) is in the 100% column by default — leave it there.
- Choose what drives the curve (CPU temp, CPU load, or GPU temp), set the min PWM, the critical °C → 100% threshold, and the curve as
temp:pwmpairs (e.g.30:30, 45:35, 65:60, 85:100). - Flip Enable software fan control. Watch RPMs change live. Turn it off (or stop the service) to hand control back to BIOS.
| Path | Purpose |
|---|---|
C:\Program Files\IVNS\Stream Vision AIO Display Service\ |
Installed binaries |
C:\ProgramData\StreamVisionDisplay\config.json |
Saved display + fan settings |
C:\ProgramData\StreamVisionDisplay\api.key |
Web API key |
C:\ProgramData\StreamVisionDisplay\uploads\ |
Uploaded images |
sc.exe stop StreamVisionDisplay
sc.exe start StreamVisionDisplay
sc.exe query StreamVisionDisplayAll endpoints except GET / require the API key, supplied as an X-Api-Key header or a ?key= query parameter. The bare GET / returns only the (data‑free) HTML shell.
| Method | Endpoint | Description |
|---|---|---|
GET |
/ |
Control‑panel HTML |
GET |
/api/state |
{ config, fan, status, fans } |
POST |
/api/config |
Patch display config (JSON of changed keys) |
POST |
/api/fan |
Patch fan config (JSON of changed keys) |
POST |
/api/upload?name=<file> |
Upload an image (raw body) and switch to image mode |
GET |
/preview.jpg |
The current rendered frame (JPEG) |
The server binds LAN‑wide (http://+:8770/) but every data/control/preview route is gated by a constant‑time key check. To restrict it to localhost only, change the bind prefix in WebServer.cs.
A single .NET 9 Worker Service (Microsoft.NET.Sdk.Worker + AddWindowsService) runs three things: a render/stream loop, a fan loop, and the web server.
| File | Responsibility |
|---|---|
Program.cs |
Host bootstrap; registers the Windows service + Worker. |
Worker.cs |
BackgroundService: the stream loop (render → send at FPS) and the fan loop (read sensors → apply curve every 2 s). Releases fans to BIOS on stop. |
WinUsbDisplay.cs |
WinUSB device access via P/Invoke (setupapi + winusb). Finds the screen by its device‑interface GUID, handshakes, and bulk‑writes frames. |
Hardware.cs |
LibreHardwareMonitor wrapper: CPU/GPU/RAM reads and Super‑I/O fan PWM control. |
Renderer.cs |
Draws the 640×480 frame with SixLabors.ImageSharp and encodes JPEG. |
WebServer.cs |
HttpListener server: API‑key auth + JSON endpoints. |
Html.cs |
The embedded control‑panel page. |
AppState.cs |
Shared config/status + JSON persistence. |
The screen is a vendor‑specific WinUSB device (interface class 0xFF) with two bulk endpoints: 0x01 OUT, 0x81 IN.
- Handshake: write a 64‑byte packet
12 34 56 78 …with the command type1(DEV_INFO) at byte 56; read the device‑info response. The model string (SSCRM-V1) and panel code are in the reply. - Frame: a 64‑byte header followed by a 640×480 JPEG. Header layout: bytes 0–3 =
12 34 56 78; byte 4 (uint32 LE) =2(JPEG); bytes 8/12 = width/height; byte 56 (uint32 LE) =2(PICTURE command); byte 60 (uint32 LE) = payload length. A zero‑length packet is sent when the frame length is a multiple of 512. - The firmware does not latch a frame, so the service streams continuously (default 5 fps).
Protocol details were derived from the open reverse‑engineering work in
Lexonight1/thermalright-trcc-linux.
dotnet build -c Release # compile
dotnet publish -c Release -o publish # framework-dependent deploymentDependencies (NuGet): LibreHardwareMonitorLib, SixLabors.ImageSharp,
SixLabors.ImageSharp.Drawing, Microsoft.Extensions.Hosting(.WindowsServices).
- Panel says "Display: not found". Confirm the LCD enumerates as
VID_87AD&PID_70DBand is on the WinUSB driver (Device Manager → Details → Driver =winusb.inf). - CPU temp shows
n/a/ fans missing. The service must run with administrator/SYSTEM rights (it does as an installed service). Running the exe directly as a normal user can't access the sensor driver. - Can't open the panel. Get the key from
C:\ProgramData\StreamVisionDisplay\api.keyand use…/?key=<key>. - Two services after upgrading. The installer removes a previous
StreamVisionDisplay/TomasDisplayServicebefore reinstalling.
- LibreHardwareMonitor — sensors & fan control.
- SixLabors.ImageSharp — rendering.
- thermalright-trcc-linux — SSCRM USB protocol reference.
Released under the MIT License. Copyright © 2026 IVNS.
- Web: ivns.net
- Email: info@ivns.net
