Community reverse-engineering notes for the Ulanzi D100H Dial Creative Controller — how it actually works at the HID level, how Ulanzi Studio stores its config, and the gotchas you'll hit building your own integration. Unofficial; gathered by poking at a real unit on Windows 11.
▶ Try the live interactive dial
Spin the knob, light the keys, or connect your real D100H over WebHID and watch it sync.
To drive it from the real dial, close Ulanzi Studio first — while it's running the dial is in online mode (Studio handles the input) and the page won't see it.
Layout + full specs confirmed against the official Ulanzi manual.
🌀 Also in this repo — an on-screen D100H you can drop into your own app. A picture of the dial that moves like the real one — turn the knob and the on-screen knob spins; press a key and it lights up. The image layers + how-to are in docs/dial-skin.md. (The dial images + GIF above were built from those layers with
rembgfor background removal + Pillow.)▶ Try it live: interactive dial viewer — drag the knob, click keys, or hit Connect to drive it from your real D100H over WebHID (Chrome/Edge; close Ulanzi Studio first so it isn't holding the dial).
- 🛒 Ulanzi D100H Dial Creative Controller — product page / specs / where to buy: https://www.ulanzi.com/products/d100h-dial-creative-controller-i003
- 📄 Manual: https://manuals.plus/ulanzi/d100h-dial-creative-controller-manual
- 📚 Ulanzi docs & user guides: https://www.ulanzi.com/pages/documentation
- ⬇️ Ulanzi Studio app + firmware downloads: https://www.ulanzi.com/pages/downloads
- 💬 Community forum (has a D100H FAQ thread): https://bbs.ulanzistudio.com/
- 🧩 UlanziDeck plugin SDK: https://github.com/UlanziTechnology/UlanziDeckPlugin-SDK
More — including the related D200 reverse-engineering projects — in docs/resources.md.
The D100H is a cheap, genuinely nice Bluetooth dial + 7-button macro pad. If you want to drive your own software with it instead of Ulanzi Studio's built-in presets, you run into a wall of undocumented behavior. This repo collects everything I found the hard way so you don't have to.
- It's Bluetooth-only (USB-C charges only, no data) and enumerates over HID as
KEHWIN / Dial_Lite, VID0xfff1PID0x0082— not an obvious "Ulanzi" ID. - Offline = fixed defaults. You cannot save a custom layout to the device. Any remap you make in Ulanzi Studio only works while Studio is running. Close Studio and the dial reverts to volume/media/copy-paste. (Tested directly — see docs/ulanzi-studio.md.)
- The defaults are standard HID: dial = volume up/down/mute (Consumer page, readable); 3 buttons
= media prev/play/next (readable); 4 buttons = Ctrl+C/V/Z/Y (Keyboard page — Windows blocks
apps from reading this, so those 4 are invisible to
node-hid). - So a no-app, HID-only homebrew tops out at: the dial + 3 buttons, and it'll move your volume. For all 7 buttons cleanly you need Studio running (a plugin, or a hotkey remap + a listener).
- Plugins work. A third-party UlanziDeck plugin's actions show up in Studio's action list and bind to the D100H's dial + keys fine. That's the clean path to custom behavior. This repo ships one — D100H Mirror — that mirrors the dial + all 7 keys to the on-screen viewer while Studio is running, and still replays each control's real function.
- The dial press only registers while plugged into USB (charging or not — a full battery doesn't help). Rotation works fine wirelessly; the click sends nothing over Bluetooth alone. So don't build a battery-only homebrew around knob-press. (Observed on one unit — see docs/hardware.md.)
- docs/hardware.md — specs, USB/HID IDs, the 5 HID interfaces it exposes
- docs/offline-protocol.md — exact default codes + report formats (sniff output)
- docs/ulanzi-studio.md — online mode, where/how Studio saves bindings, the saving gotchas
- docs/plugin-sdk.md — writing a UlanziDeck plugin + the SDK pitfalls
- docs/companion-plugin.md — D100H Mirror, a ready-to-install plugin that mirrors the dial + keys to the viewer while Studio runs (install / bind / configure)
- docs/resources.md — official docs, the plugin SDK, the forum, related open-source projects
- docs/dial-skin.md — on-screen interactive D100H (knob spins, keys light up) — assets + method
- docs/dial-viewer.html — interactive page: drive the dial with mouse/keyboard or your real D100H (WebHID) · live
- docs/dial-browser-source.html — the clean, transparent OBS browser source version (no chrome, auto-connects to the plugin) · live
- tools/sniff.js — a tiny
node-hidscript to dump what your unit sends
The transparent dial PNGs shown at the top (knob spins, keys flash white) live in
docs/images/. The interactive spin/press method + layered assets are in
docs/dial-skin.md (from chumthesizer).
Other Ulanzi projects by @brendanwelsh:
- chumthesizer (CHUM-1) — a browser/Electron groovebox synth you play with real hardware: the D100H dial warps the sound (turn = FX macro, press = play/stop) and its 7 keys switch the sounds, alongside an Apple Magic Trackpad and a Stream Deck pedal. A fun, musical example of driving software from the dial.
- ulanzi-camera-switcher — drive a live security-camera viewer from a hardware dial: rotate = next/prev camera, press = open/close a maximized mpv viewer, keys jump to a specific camera. Works with any RTSP/HTTP camera (UniFi Protect, Reolink, Frigate, ONVIF…) and ships as both a UlanziDeck plugin and a standalone HID daemon — a working example of the dial-driving approach these notes enable.
- ulanzi-pixel-clock-awtrix — guide + curated resources for the Ulanzi TC001 Pixel Clock on AWTRIX firmware: hardware, flashing, the MQTT/HTTP API, and Home Assistant integrations.
Unofficial; no affiliation with Ulanzi. Findings are from one D100H on Windows 11 — firmware or app updates may change behavior, and macOS may differ. Corrections and additions welcome via PR/issue.



