The ZMK-based Keychron keyboards, for example, V6 Ultra 8K, work with Via!
The short version: By changing the USB product ID in a JSON file for a similar keyboard, to that, for example, of a Keychron V6 Ultra 8K ‘ISO‘, it is possible to change keymappings, record macros, and execute macros from Via for a ZMK-based Keychron keyboard, including using the so-called standalone version of Via!
The underlying reason is that Keychron has implemented the Via protocol for their ZMK-based keyboards.
Base change: USB identity
Example: Start JSON file: For V6 Max ‘ISO’ knob (from this page). It has the exact same physical key layout as the V6 Ultra 8K ‘ISO’.
The first three lines:
"name": "Keychron V6 Max ISO Knob",
"vendorId": "0x3434",
"productId": "0x0961",
The USB product ID for V6 Ultra 8K ‘ISO’ is 0x0C61 (it can, for example, be found in the operating system somewhere). Thus, change it and the name, to:
"name": "Keychron V6 Ultra 8K ISO",
"vendorId": "0x3434",
"productId": "0x0C61",
JSON files blues
But it isn’t sufficient. Even for a keyboard with the exact same physical key layout, there are differences, which must be expressed in the JSON file.
ZMK blues
Compared to a QMK-based keyboard, there is a shift in some key positions, e.g., for the four extra keys above the numeric keypad.
Example 1: If a key is mapped (in Via) to the first in that group of four (according to the V6 JSON file/QMK keymap), activation requires to use the key two to the right, the third key in that group of four…
Example 2: If a key is mapped to the fourth (last) in that group of four (according to the V6 JSON file/QMK keymap), activation requires to use key 6 on the numpad(!) It is far away from anything that could be explained by a simple shift in the key order (the two keys are swapped).
In fact, all of the four extra keys above the numeric keypad are in different positions. For the 1st, 2nd, and 4th, they are mapped (using that JSON file) to keys on the numeric keypad, “*”, “-“, and “6”, respectively.
Also, some of the keys on the numeric keypad are also shuffled around.
Perhaps it is due to a keyboard firmware bug? That was tested with version 1.0.1/2025-11-28 (other notations are “1.01” and “1.1”) of the V6 Ultra 8K ‘ISO’ keyboard firmware. There is currently a version 1.0.2, but I haven’t tested it yet.
JSON files blues
Order of keys: Vertical keys:
- Enter key (‘ISO‘ only)
- + key (numeric keypad)
- Enter key (numeric keypad)
There isn’t any consistency between Keychron keyboards if a vertical key belongs to the upper or lower row when it comes to the key order. Thus, the original JSON file may not reflect the actual key order for the ‘Ultra’ keyboard. Or in other words, it is easiest to choose a JSON file to clone and change that has the same key order.
| Keyboard | Key Enter(main) | Key +(numerickeypad) | Key Enter(numerickeypad) |
|---|---|---|---|
| V6 ‘ISO’ | Lower | Upper | Upper |
| V6 Max ‘ISO’ | Lower | Lower | Lower |
| V6 Ultra 8K ‘ANSI’ | – | Lower | Lower |
| V6 Ultra 8K ‘ISO’ | Upper | Lower | Lower |
Thus, if using the V6 Max ‘ISO’ JSON file as the basis and not corrected for, some keys would be shifted by one, starting with keys after the Enter key (on the main keyboard). This problem would show itself when changing keymappings; the keymapping (for some keys) would change for another key than the intended.
Note that this discrepancy will not show up in the Via key tester, as it uses key codes, not the key order.
Rotary knob blues
The rotary knob does not seem to be supported, at least with the tested firmware version 1.0.1 of the V6 Ultra 8K ‘ISO’.
Another selection criterion for the starting JSON file is a rotary knob for the keyboard (and variant), but the V6 Max does have a rotary knob (and is thus represented in the JSON file).
References
- V6 JSON files for Via. Near “V6 knob version ISO keymap”. E.g., v6_max_iso_encoder_v1.0.0_2404091021.json and v6_us_knob_v1.3.json.zip. Note: The JSON section should not be confused with the firmware section. As of 2026-07-13, it does not include the JSON files for V6 V2 (which is based on another microcontroller).
- V6 Ultra 8K default keymap (‘ANSI’)
- V6 Max default keymap (‘ISO’)
- Via integration with ZMK #57. 2022-10-28. Mostly about licensing issues related to an implementation.
Leave a Reply