Hardware Visualizer (75% Compact • 85 Keys)
Real-Time Lighting & Sensor FeedbackReady to Configure APEX 200
Configure RGB lighting, analog actuation depth, Rapid Trigger sensitivity, and onboard profiles directly in your browser without installing proprietary software.
Interactive Lighting Canvas
Live 85-Key RGB PreviewEffect Preset & Animation
Per-Key Custom Color Studio
Esc (Key 0)0x11 — read-modify-write against 0x16, then full-table readback verification.
Advanced Protocol Operations & Readbacks
| Action | Command | Changes | Keeps |
|---|---|---|---|
| Apply effect, brightness & speed | 0x13 | effect index, brightness, speed | colour and device-owned bytes |
| Apply colour to this effect | 0x13 | R, G, B for this effect | brightness, speed, device-owned bytes |
| Make this the active effect | 0x19 | which effect is running | every config byte |
Interactive 85-Key Sensor Map
Analog Actuation & Rapid Trigger Sensitivity
Profiles & Memory Layout
+0x88
(PROTOCOL.md §8.24). Add (0x58) is keyed to the profile
index you give it — the Windows app passes the currently selected
row. Delete (0x59) refuses to run when only one profile
remains, exactly as FUN_1400228a0 does.
0x56
name frame, then 0x57/0x50/0x11/
0x14/0x20/0x23/0x40/
0x28, each fired by the previous write's last-page ack).
It is not wired here, because a correct import is only as safe as the
gated writes it replays, and none of them has been hardware-validated.
Device Backup & Snapshot
SyncConfigUtil collects before it pushes a configuration back
(PROTOCOL.md 8.17).
Take one before changing anything. Writes to this board can only be recovered with a factory reset, which discards every profile and binding. This snapshot is the only record of the current state that can be made from the host.
Every call is a read. Nothing here can damage the device, and the JSON is plain text you can keep or diff.
Hardware Performance & Debounce Settings
| Setting | Device value | New |
|---|---|---|
| Touch Optimize Accidental touch suppression | - | |
| Press Debounce Delay Key-down filter delay (ms, u16) | - | |
| Release Debounce Delay Key-up release delay (ms, u16) | - | |
| Polling Rate Index USB report rate frequency index | - | |
| Anti-Shake Sensitivity Key jitter stabilization filter | - | |
| Factory Calibration Hardware calibration active flag | - | |
| Sports Mode Ultra-low latency competitive gaming mode | - | |
| Active Function Layer 0 = Base layer, 1 = Function layer | - |
0x50/0x5E
blob. The field names come from the params_table DDL the app
ships inside GameKeyboard.exe, and the widths come from reading
that table back out of SQLite (PROTOCOL.md 8.14).
Values are shown as raw device numbers, not decoded. The columns tell us which byte is which, but not what
0 and
1 mean for the switches, nor which polling rate maps to which
byte - so the form does not pretend otherwise.
Applying reads the device first and rewrites only the rows you changed; the other six settings and the reserved bytes come from the device unchanged. Every write is read back and reported.
Key map
KeySetForm. Records are 3 bytes and the third is a HID usage
ID, so entries decode to real key names; anything unmapped stays numeric
rather than being guessed.
Writes are not offered:
0x20 and 0x24 are two
distinct commands, and both are now decoded byte-for-byte
(§8.19, §8.21.3-8.21.4). They stay gated because neither has run
against hardware and each replaces a whole layer. The first test must be
read → write back byte-identical → read and compare.
keyItem is implied by position and never sent; the three wire
bytes are type, hValue, lValue
(§8.19).
Macros
| # | Key | Action | Delay (ms) |
|---|
type, state, lValue, hValue,
and a 16-bit little-endian time in milliseconds. The key is a
HID usage split across lValue/hValue, and
state is 1 for down, 0 for up.
Bytes 0 and 1 are transposed on the wire. This form works in struct order and the driver applies the transposition, so what you see here is what is stored.
The field names come from the
key_macro_table DDL that the app
ships inside GameKeyboard.exe to persist exactly this data
(PROTOCOL.md 8.12).
Fn layer and advanced modifiers
0x23 is not a per-key edit: it is a paged 19-byte bulk write used only by
the Windows app's config-import worker, and is not wired here (§8.21.8).
HighKeyForm stores six advanced per-key
modifiers here — DKS (Dynamic Key Stroke),
MT (Hold/Click), TGL (Toggle),
RS (Radial Sensing),
SOCD (Simultaneous Opposing Cardinal Directions, with four
resolution modes) and OKS (Key Override on Release).
They live in these bindings rather than in the plain keymap, so a driver
that only exposes keycodes cannot express them.
Every modifier's record code and length are decoded (PROTOCOL.md §8.3.2). The codes do not run in label order:
TGL=0, MT=1, DKS=2, RS=3, OKS=4, SOCD=5, while the app lays
the dialogs out as DKS, MT, TGL, RS, SOCD, OKS. SOCD is fully specified
(key, type, key1, key2, resolution mode); the other modifiers' data bytes
are still unnamed, so those stay a raw hex field.
Device Diagnostics
HID collections
not connected
Report descriptor
Detection check — measured from this device
| Vendor / product | 314B:1026 — APEX APEX200, matches the Windows app's filter |
| Config interface | USB interface 0 → /dev/hidraw0 (the only interface with IN + OUT endpoints) |
| Usage page | 0xFF02 (vendor defined) — not a protected usage, so WebHID can reach it |
| Report IDs | none — the implicit report ID is 0, so sendReport(0, frame) |
| Report size | 64 bytes in and out → 58-byte payload budget after the 6-byte header |
| Other interfaces | 1 keyboard, 2 pointer, 3 keyboard+digitizer — all protected usages |
0x0006) is a protected usage and
Chrome will not expose it, which is correct — the config channel is the vendor
collection. If the picker lists several entries, choose the one whose collection
tree contains usage page 0xFF02.