SteelClock supports GameDAC Gen 2 and Arctis Nova Pro base stations via the direct USB HID driver.
| Device | PID | Display | USB Interface |
|---|---|---|---|
| Arctis Nova Pro (Wired) | 12cb |
128x64 | mi_04 |
| Arctis Nova Pro Wireless (Base Station) | 12cd |
128x64 | mi_04 |
| Arctis Nova Pro Wireless (USB-C Dongle) | 12e0 |
128x64 | mi_04 |
| Arctis Nova Pro Wireless (Xbox) | 12e5 |
128x64 | mi_04 |
| Arctis Nova 5P (USB-C Dongle) | 225d |
128x64 | mi_04 |
| Arctis Nova Pro Omni | 2290 |
128x64 | mi_03 col 01 |
All devices use SteelSeries VID 1038. The correct USB interface is selected
automatically, so the interface config field is not needed.
Note on the Nova Pro Omni: it uses the same image protocol as the other Nova
Pro devices, but exposes its OLED on interface mi_03 (collection 01) with HID
feature report ID 0x01 instead of mi_04/0x06. SteelClock auto-detects this
at runtime (it picks the interface whose feature report is large enough for a
frame and discovers the accepted report ID), so no extra configuration is needed.
Note: GameDAC Gen 1 (PID 1280) is not supported due to an undocumented USB protocol. It may work via the GameSense backend on Windows if SteelSeries GG is running.
On Linux, USB access requires udev rules (one-time setup):
sudo cp profiles/99-steelseries.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm triggerThen unplug and replug the device, or reboot.
Create a profile JSON file (e.g. profiles/gamedac.json):
{
"$schema": ".schema/config.schema.json",
"config_name": "GameDAC",
"game_name": "STEELCLOCK",
"game_display_name": "SteelClock",
"refresh_rate_ms": 100,
"backend": "direct",
"display": {
"width": 128,
"height": 64,
"background": 0
},
"direct_driver": {
"vid": "1038",
"pid": "12cb",
"brightness": 5
},
"widgets": [
{
"type": "clock",
"enabled": true,
"position": { "x": 0, "y": 0, "w": 128, "h": 64 },
"mode": "segment",
"segment": {
"format": "%H:%M:%S",
"colon_blink": true
},
"update_interval": 0.1
}
]
}# With a specific profile:
./steelclock -config profiles/gamedac.json
# Or select from tray menu if placed in profiles/ directory{
"direct_driver": {
"vid": "1038",
"pid": "12cb",
"brightness": 5
}
}| Field | Type | Required | Description |
|---|---|---|---|
vid |
string | No | Vendor ID in hex (e.g. "1038"). Omit for auto-detection. |
pid |
string | No | Product ID in hex (e.g. "12cb"). Omit for auto-detection. |
brightness |
integer | No | Display brightness, 0 (darkest) to 10 (brightest). Omit to keep device default. |
The interface field is not needed for Nova Pro devices — the correct USB interface is auto-detected (mi_04 on most units, mi_03 on the Omni). SteelClock picks the interface whose HID feature report is large enough to carry a frame, so it adapts across device generations.
If you have only one SteelSeries device connected, you can omit vid and pid entirely:
{
"backend": "direct",
"display": { "width": 128, "height": 64, "background": 0 },
"direct_driver": {
"brightness": 5
}
}SteelClock scans all known device PIDs and connects to the first one found. For multi-device setups, explicit VID/PID is required.
SteelClock can drive multiple displays simultaneously. Use the devices array instead of top-level display/widgets:
{
"$schema": ".schema/config.schema.json",
"config_name": "Keyboard + GameDAC",
"game_name": "STEELCLOCK",
"game_display_name": "SteelClock",
"refresh_rate_ms": 100,
"devices": [
{
"id": "keyboard",
"display": { "width": 128, "height": 40, "background": 0 },
"backend": "direct",
"direct_driver": { "interface": "mi_01" },
"widgets": [
{
"type": "clock",
"enabled": true,
"position": { "x": 0, "y": 0, "w": 128, "h": 40 },
"mode": "segment",
"segment": { "format": "%H:%M", "colon_blink": true },
"update_interval": 0.1
}
]
},
{
"id": "gamedac",
"display": { "width": 128, "height": 64, "background": 0 },
"backend": "direct",
"direct_driver": { "vid": "1038", "pid": "12cb", "brightness": 5 },
"widgets": [
{
"type": "cpu",
"enabled": true,
"position": { "x": 0, "y": 0, "w": 64, "h": 32 },
"mode": "graph",
"update_interval": 0.5
},
{
"type": "memory",
"enabled": true,
"position": { "x": 64, "y": 0, "w": 64, "h": 32 },
"mode": "bar",
"update_interval": 1
},
{
"type": "clock",
"enabled": true,
"position": { "x": 0, "y": 32, "w": 128, "h": 32 },
"mode": "segment",
"segment": { "format": "%H:%M:%S", "colon_blink": true },
"update_interval": 0.1
}
]
}
]
}Each device has its own display dimensions, backend, driver settings, and widget set. Devices operate independently: if one device disconnects, the others continue running.
Set display brightness (0 to 10) in the direct_driver config. Applied once at startup.
When SteelClock exits, it sends a Return-to-UI command to the Nova Pro, restoring the native device screen (volume display, EQ settings, etc.). This happens automatically on clean shutdown.
| Backend | GameDAC Support | Brightness | Return-to-UI | Refresh Rate | Requirements |
|---|---|---|---|---|---|
direct |
Full | Yes | Yes | Up to 60 Hz | Device connected via USB |
gamesense |
None | No | No | — | Does not drive the OLED |
The direct backend is required for GameDAC / Nova Pro base stations — GameSense does not drive their
OLED (confirmed on the Arctis Nova Pro Omni; SteelSeries GG's own apps use that screen, but third-party
GameSense screen events do not reach it). Set "backend": "direct" explicitly: auto-select tries
GameSense first and connects without error, so it never falls through to direct and the screen stays blank.
Use the web editor to preview GameDAC layouts in a browser:
- Set
"backend": "webclient"in your config, or use the web editor's Apply button (it switches to webclient automatically) - Run SteelClock
- Open
http://localhost:27302 - The preview canvas renders at the configured display resolution (128x64 for GameDAC)
- In multi-device mode, each device appears as a separate tab with its own preview
lsusb | grep -i steelseries
Verify the device appears and note the PID. Make sure it matches your direct_driver.pid value.
Install the udev rules as described in the Quick Start section. The device must be unplugged and replugged after installing rules.
The direct driver opens the HID device with shared access, so it generally coexists with SteelSeries GG. However, GG may periodically redraw the base station's native screen (e.g. the volume overlay), briefly overwriting SteelClock's output. For a clean, uninterrupted display, close SteelSeries GG while using the direct backend. (GameSense is not an alternative here — it does not drive the base-station OLED.)
- Verify
display.widthanddisplay.heightmatch the device (128x64 for GameDAC Gen 2) - Check that
direct_driver.pidmatches the correct device - Review
steelclock.logfor protocol or connection errors