A modern control panel for the Virtual Display Driver (MttVDD). Electron + React + TypeScript, talking to the driver over its native named pipe.
- Dashboard — live driver status (PING heartbeat), an animated monitor stage, and one-click add/remove of
virtual displays via
SETDISPLAYCOUNT. Quick toggles for HDR+, SDR 10-bit, hardware cursor, custom EDID and logging apply instantly through the pipe. - Driver lifecycle — download & install the latest signed Virtual Display Driver
and Virtual Audio Driver releases: checksum-verified
download, signer trust,
pnputilstaging and SetupAPI device-node creation, plus restart-device and uninstall — one UAC prompt per operation. The audio driver supports multiple instances (1-4 independent speaker + mic pairs). - Audio — Windows endpoint control (volume, mute, default device for every playback/recording endpoint via Core Audio) and a live routing matrix: pump any microphone or the system output mix into any output device with per-route gain and level meters. Routes persist and re-arm on launch. Covers mic → speaker, speaker → speaker (System audio source) and speaker → mic (route into the virtual speaker; apps hear it on the virtual microphone).
- Displays — a live, to-scale desktop arrangement map of every attached monitor (physical and virtual, with
real placement, resolution, refresh rate and scale - virtual displays are flagged via PnP parent lookup), plus a
full editor for
vdd_settings.xmlresolutions: preset gallery (VGA → 8K, ultrawides, tablets), per-resolution and global refresh rates (fractional rates supported), preferred/fallback mode, and a to-scale size comparison. - HDR & Color — color format (RGB / YCbCr), HDR10 static metadata, gamma and color space, plus an interactive CIE 1931 chromaticity diagram with draggable R/G/B/white points.
- EDID Lab — drag-and-drop EDID decoder (pure TypeScript: identity, timings, chromaticity, CEA-861, HDR metadata).
One click exports an IddCx
monitor_profile.xml+user_edid.binand enables EDID integration. - GPU — adapter list from the driver (
GETALLGPUS) with WMI fallback, one-clickSETGPUassignment. - Console — unified live feed: driver file logs (tailed), every pipe command's streamed response, and app events. Filterable by severity/source, with a raw command input for power users.
- Settings — cursor, logging and auto-resolution options, a line-diff preview before every save, automatic timestamped backups with restore, themes (dark/light/system) and accent colors.
| Mechanism | Use |
|---|---|
\\.\pipe\MTTVirtualDisplayPipe |
Live control. Commands are sent UTF-16LE on one-shot connections; responses are read until disconnect. All calls are serialized with timeouts and a reload cooldown. |
C:\VirtualDisplayDriver\vdd_settings.xml |
Full typed read/write of every section, with atomic writes and automatic backups. |
C:\VirtualDisplayDriver\Logs\ |
Daily log files are tailed into the console feed. |
| PowerShell / WMI | Fallbacks for driver presence and GPU enumeration when the pipe is down. |
| GitHub releases API | Driver lifecycle for both drivers: fetches the latest driver package (x64/ARM64 picked automatically), verifies its published SHA-256, then installs through an elevated PowerShell script (signer → TrustedPublisher, pnputil /add-driver, SetupAPI root-device creation). Uninstall removes the devices and driver package but keeps your configuration. |
| Core Audio (COM interop) | Audio endpoint enumeration, volume/mute (IAudioEndpointVolume) and default-device switching (IPolicyConfig) - no elevation needed. |
| WebAudio + WASAPI loopback | The in-app routing engine: capture any input device or the system mix and play it to any output. Routes are active while the app runs. |
Electron screen API |
Desktop arrangement map with real bounds, scale, rotation and refresh rate for every display. |
RELOAD_DRIVER is intentionally never sent (upstream undefined behavior). Saving applies changes by writing the
XML and issuing SETDISPLAYCOUNT <current count>, which makes the driver reload its configuration safely.
The app runs fully offline as well: with no driver installed you can still edit, preview and save configuration.
npm install
npm run dev # hot-reloading dev session
npm run typecheck # strict TS for main + preload + renderer
npm run build # production bundles into out/
npm run build-portable # portable .exe via electron-builder (admin elevation)Requires Windows and Node 18+. Run elevated if you want to write to C:\VirtualDisplayDriver.
src/
main/ Electron main process: PipeClient, SettingsService, DriverService, LogService, IPC
preload/ contextBridge API (window.vdd) - the only door between renderer and system
renderer/ React UI: pages, components, zustand stores, design tokens
shared/ Types, vdd_settings schema defaults, EDID parser - imported by all processes
Security: contextIsolation + sandbox enabled, no nodeIntegration, every IPC input validated in the main process,
raw pipe commands restricted to a conservative charset, external links limited to https.