Skip to main content

Device specs

Every field of every DeviceModel, generated from ts/src/devices/registry.ts. This is the page to read when you are porting a deck or chasing a black panel; if you just want to know whether your deck works, read Supported devices instead.

The three tables below are live: type to filter rows, click a header to sort, and use the chips to show the columns you care about — most start hidden. Column names are abbreviated: hover a dotted header (or a column chip) for what the field means.

How much to trust a value:

  • Measured — anything on a deck marked tested. The image tuning and key maps of the MK.2, 293V3, 293S, K1 Pro, D6 rev. 2 and Mini were derived on hardware.
  • Inherited — the rebadges copy a tested board field-for-field, by construction, so they cannot drift; what is untested is the assumption that the board is the same.
  • Inferred — read out of a reference implementation. Each device lists its sources.
  • Probed at runtime — only packetSizeCandidates: when set, the real output-report size is read from the HID report descriptor at open() and overrules packetSize, but only if it is one of the listed values. A wrong packet size is otherwise silent — short writes are discarded while hid_write still returns success, and the panel just stays black.

Adding a deck of your own? Adding a device is the workflow.

Identity​

showing 18 of 18
Columns
— = not set. Elgato models omit usagePage/usage: they are matched on product id alone.
Stream Deck MK.2elgatoelgato-gen20x0fd90x0080 0x006d 0x00a51553
Stream Deck Minielgatoelgato-gen10x0fd90x0063 0x0090 0x00b3 0x00b8632
Mirabox 293V3miraboxmirabox-cora0x66030x1005 0x1006 0x1010 0x10141553
Mirabox 293S Stream Deckmiraboxmirabox-cora-v10x55480x66701553
Mirabox K1 Promiraboxmirabox-cora0x66030x1015 0x1019632
AJAZZ AKP05Eajazzajazz-akp050x03000x30041052
AJAZZ AKP05ajazzajazz-akp050x03000x30061052
Ajazz AKP153E (rev. 2)ajazzmirabox-cora0x03000x30101553
Ajazz AKP153R (rev. 2)ajazzmirabox-cora0x03000x30111553
Fifine AmpliGame D6fifinemirabox-cora0x31420x00071553
Fifine AmpliGame D6 (rev. 2)fifinemirabox-cora0x31420x00601553
Ajazz AKP153ajazzmirabox-cora-v10x55480x66741553
Ajazz AKP153E (rev. 1)ajazzmirabox-cora-v10x03000x10101553
Ajazz AKP153R (rev. 1)ajazzmirabox-cora-v10x03000x10201553
Mars Gaming MSD-ONEmars-gamingmirabox-cora-v10x0b000x10001553
Mad Dog GK150Kmad-dogmirabox-cora-v10x0c000x10001553
Risemode Vision 01risemodemirabox-cora-v10x0a000x10011553
TMICE Stream Controllertmicemirabox-cora-v10x05000x10011553

Image spec​

How a CORA frame becomes the bytes this panel wants. The format: 'bmp' short-circuit in image-pipeline runs before any of this; transform: 'passthrough' sends the CORA JPEG unchanged and is only valid at CORA-native resolution with no rotation, flip or size cap.

showing 18 of 18
Columns
— = field omitted; the effective default applies — resizeFilter triangle · resizeMode resize · padFill edge · crop 0 · sharpen 0 · blur 0 · bmpPpm none (JPEG).
Stream Deck MK.2jpeg72720°no cap0.95passthrough
Stream Deck Minibmp808090°no cap—passthrough
Mirabox 293V3jpeg1121120°102400.9sidecar
Mirabox 293S Stream Deckjpeg858590°51200.7sidecar
Mirabox K1 Projpeg64640°40960.9sidecar
AJAZZ AKP05Ejpeg1121120°655350.9sidecar
AJAZZ AKP05jpeg112112180°655350.9sidecar
Ajazz AKP153E (rev. 2)jpeg959590°102400.9sidecar
Ajazz AKP153R (rev. 2)jpeg1121120°102400.9sidecar
Fifine AmpliGame D6jpeg1121120°102400.9sidecar
Fifine AmpliGame D6 (rev. 2)jpeg1121120°102400.9sidecar
Ajazz AKP153jpeg858590°51200.7sidecar
Ajazz AKP153E (rev. 1)jpeg858590°51200.7sidecar
Ajazz AKP153R (rev. 1)jpeg858590°51200.7sidecar
Mars Gaming MSD-ONEjpeg858590°51200.7sidecar
Mad Dog GK150Kjpeg858590°51200.7sidecar
Risemode Vision 01jpeg858590°51200.7sidecar
TMICE Stream Controllerjpeg858590°51200.7sidecar

Wire spec​

Device-owned HID sizes and low-level behavior. Protocol strategies own framing algorithms; they never own packet or input report sizes.

showing 18 of 18
Columns
— = optional field omitted — reportId 0x00 · heartbeat none · synthesizeKeyUp false · sendStpAfterImage false · chunkPadByte false · chunkDelayMs 0 · sharedSerial false · packetSizeCandidates none, so packetSize is used as written.
Stream Deck MK.21024512————
Stream Deck Mini1024512————
Mirabox 293V310245128000noyes—
Mirabox 293S Stream Deck5125128000yesno—
Mirabox K1 Pro10245122000noyes0x04
AJAZZ AKP05E1024512———0x00
AJAZZ AKP051024512———0x00
Ajazz AKP153E (rev. 2)10245128000noyes—
Ajazz AKP153R (rev. 2)10245128000noyes—
Fifine AmpliGame D65125128000noyes—
Fifine AmpliGame D6 (rev. 2)10245128000noyes—
Ajazz AKP1535125128000yesno—
Ajazz AKP153E (rev. 1)5125128000yesno—
Ajazz AKP153R (rev. 1)5125128000yesno—
Mars Gaming MSD-ONE5125128000yesno—
Mad Dog GK150K5125128000yesno—
Risemode Vision 015125128000yesno—
TMICE Stream Controller5125128000yesno—

Key maps and CORA identity​

Per device: the CORA-index ↔ wire-id mapping drawn as a grid (a wrong map is visible at a glance), the raw keyMap, what the device advertises to the Elgato app, and the splash transform override. Image and input are resolved independently — coraToWireImage[i] ?? i + imageOffset ?? i for images, wireInputToCora[code] ?? code - inputOffset ?? code for presses.

Stream Deck MK.2​

mk2 · elgato-gen2 · ✓ tested (macOS, 2026-09-15) · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 0 1 2 3 4
5 6 7 8 9 5 6 7 8 9
10 11 12 13 14 10 11 12 13 14
keyMap: {}
cora: {
"productId": 0x0080,
"usePhysicalIdentity": true
}
splash: {
"transformOverride": {
"rotate": 180
}
}

Derived from: own hardware test (macOS, PID 0x0080)

Stream Deck Mini​

mini · elgato-gen1 · ✓ tested (macOS) · compare entry

mk2 index → wire image id (3×2, row-major)

0 1 2 0 1 2
3 4 5 3 4 5
keyMap: {}
cora: {
"productId": 0x0063,
"usePhysicalIdentity": true
}
splash: {
"transformOverride": {
"rotate": 90,
"flipH": true
}
}

Mirabox 293V3​

mirabox-293 · mirabox-cora · ✓ tested (macOS) · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 11 12 13 14 15
5 6 7 8 9 6 7 8 9 10
10 11 12 13 14 1 2 3 4 5
keyMap: {
"coraToWireImage": [
11,
12,
13,
14,
15,
6,
7,
8,
9,
10,
1,
2,
3,
4,
5
],
"inputOffset": 1
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 180
}
}

Derived from: opendeck-akp153 · keydeck (Mirabox-HSV293SV3-0x1005.json)

Mirabox 293S Stream Deck​

mirabox-293s · mirabox-cora-v1 · ✓ tested (macOS) · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 13 10 7 4 1
5 6 7 8 9 14 11 8 5 2
10 11 12 13 14 15 12 9 6 3

extra keys (outside the CORA grid): 16, 17, 18
keyMap: {
"coraToWireImage": [
13,
10,
7,
4,
1,
14,
11,
8,
5,
2,
15,
12,
9,
6,
3
],
"wireInputToCora": [
-1,
4,
9,
14,
3,
8,
13,
2,
7,
12,
1,
6,
11,
0,
5,
10,
-1,
-1,
-1
],
"extraKeys": [
16,
17,
18
]
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 270
}
}

Derived from: opendeck-akp153 · keydeck (Mirabox-HSV293S.json)

Mirabox K1 Pro​

mirabox-k1pro · mirabox-cora · ✓ tested (macOS) · compare entry

mini index → wire image id (3×2, row-major)

0 1 2 5 3 1
3 4 5 6 4 2
keyMap: {
"coraToWireImage": [
5,
3,
1,
6,
4,
2
],
"wireInputToCora": [
-1,
2,
5,
1,
4,
0,
3
]
}
cora: {
"productId": 0x0063,
"advertiseAs": "mini",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 90,
"flipH": false
}
}

Derived from: keydeck · .claude/plans/K1Pro/jpeg-artifact-findings.md

AJAZZ AKP05E​

ajazz-akp05e · ajazz-akp05 · ✓ tested (macOS, 2026-09-21) · compare entry

mk2 index → wire image id (5×2, row-major)

0 1 2 3 4 11 12 13 14 15
5 6 7 8 9 6 7 8 9 10
keyMap: {
"coraToWireImage": [
11,
12,
13,
14,
15,
6,
7,
8,
9,
10
],
"wireInputToCora": [
-1,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
]
}
cora: {
"productId": 0x00a5,
"usePhysicalIdentity": false,
"emulations": {
"stream-deck-plus": {
"image": {
"format": "jpeg",
"width": 112,
"height": 112,
"rotate": 180,
"flipH": false,
"flipV": false,
"colorMode": "rgb",
"maxBytes": 65535,
"quality": 0.9,
"resizeFilter": "lanczos3",
"sharpen": 0.6,
"transform": "sidecar"
},
"keyMap": {
"coraToWireImage": [
11,
12,
13,
14,
6,
7,
8,
9
],
"wireInputToCora": [
-1,
0,
1,
2,
3,
-1,
4,
5,
6,
7,
-1
],
"extraKeys": [
15,
10
],
"extraKeyInputs": [
5,
10
]
}
}
}
}
splash: {
"transformOverride": {
"rotate": 180
}
}

Derived from: own hardware capture (macOS, PID 0x3004, mise run akp05-capture) · ambiso/opendeck-akp05 src/device.rs + src/inputs.rs · zeccola/ajazz-akp05 akp05_device.py · 4ndv/mirajazz src/device.rs + src/state.rs

AJAZZ AKP05​

ajazz-akp05 · ajazz-akp05 · — untested · compare entry

stream-deck-plus index → wire image id (4×2, row-major)

0 1 2 3 11 12 13 14
4 5 6 7 6 7 8 9

extra keys (outside the CORA grid): 15, 10
keyMap: {
"coraToWireImage": [
11,
12,
13,
14,
6,
7,
8,
9
],
"wireInputToCora": [
-1,
0,
1,
2,
3,
-1,
4,
5,
6,
7,
-1
],
"extraKeys": [
15,
10
],
"extraKeyInputs": [
5,
10
]
}
cora: {
"productId": 0x0084,
"usePhysicalIdentity": false,
"emulations": {
"stream-deck-plus": {
"image": {
"format": "jpeg",
"width": 112,
"height": 112,
"rotate": 180,
"flipH": false,
"flipV": false,
"colorMode": "rgb",
"maxBytes": 65535,
"quality": 0.9,
"resizeFilter": "lanczos3",
"sharpen": 0.6,
"transform": "sidecar"
},
"keyMap": {
"coraToWireImage": [
11,
12,
13,
14,
6,
7,
8,
9
],
"wireInputToCora": [
-1,
0,
1,
2,
3,
-1,
4,
5,
6,
7,
-1
],
"extraKeys": [
15,
10
],
"extraKeyInputs": [
5,
10
]
}
}
},
"advertiseAs": "stream-deck-plus"
}
splash: {
"transformOverride": {
"rotate": 180
}
}

Derived from: ambiso/opendeck-akp05 src/mappings.rs · ambiso/opendeck-akp05 CHANGELOG.md v0.9.3

Ajazz AKP153E (rev. 2)​

ajazz-akp153e-rev2 · mirabox-cora · ✓ tested (Windows, 2026-09-15) · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 13 10 7 4 1
5 6 7 8 9 14 11 8 5 2
10 11 12 13 14 15 12 9 6 3
keyMap: {
"coraToWireImage": [
13,
10,
7,
4,
1,
14,
11,
8,
5,
2,
15,
12,
9,
6,
3
],
"wireInputToCora": [
-1,
4,
9,
14,
3,
8,
13,
2,
7,
12,
1,
6,
11,
0,
5,
10
]
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 180
}
}

Derived from: issue #67 · opendeck-akp153 (src/mappings.rs) · keydeck (Ajazz-AKP153E-0x3010.json)

Ajazz AKP153R (rev. 2)​

ajazz-akp153r-rev2 · mirabox-cora · — untested · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 11 12 13 14 15
5 6 7 8 9 6 7 8 9 10
10 11 12 13 14 1 2 3 4 5
keyMap: {
"coraToWireImage": [
11,
12,
13,
14,
15,
6,
7,
8,
9,
10,
1,
2,
3,
4,
5
],
"inputOffset": 1
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 180
}
}

Derived from: opendeck-akp153 (src/mappings.rs) · keydeck

Fifine AmpliGame D6​

fifine-d6 · mirabox-cora · — untested · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 11 12 13 14 15
5 6 7 8 9 6 7 8 9 10
10 11 12 13 14 1 2 3 4 5
keyMap: {
"coraToWireImage": [
11,
12,
13,
14,
15,
6,
7,
8,
9,
10,
1,
2,
3,
4,
5
],
"inputOffset": 1
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 180
}
}

Derived from: companion-surface-mirabox-stream-dock PR #49 · opendeck-ampgd6 · FifineOpenSource · jasonkoon/sd-connect

Fifine AmpliGame D6 (rev. 2)​

fifine-d6-rev2 · mirabox-cora · ✓ tested (macOS, 2026-09-11) · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 11 12 13 14 15
5 6 7 8 9 6 7 8 9 10
10 11 12 13 14 1 2 3 4 5
keyMap: {
"coraToWireImage": [
11,
12,
13,
14,
15,
6,
7,
8,
9,
10,
1,
2,
3,
4,
5
],
"inputOffset": 1
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 180
}
}

Derived from: opendeck-ampgd6 PR #4, #5, #6, #7 · companion-surface-mirabox-stream-dock PR #49 · FifineOpenSource · own hardware capture (ts/src/dev/d6-capture.ts)

Ajazz AKP153​

ajazz-akp153 · mirabox-cora-v1 · — untested · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 13 10 7 4 1
5 6 7 8 9 14 11 8 5 2
10 11 12 13 14 15 12 9 6 3

extra keys (outside the CORA grid): 16, 17, 18
keyMap: {
"coraToWireImage": [
13,
10,
7,
4,
1,
14,
11,
8,
5,
2,
15,
12,
9,
6,
3
],
"wireInputToCora": [
-1,
4,
9,
14,
3,
8,
13,
2,
7,
12,
1,
6,
11,
0,
5,
10,
-1,
-1,
-1
],
"extraKeys": [
16,
17,
18
]
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 270
}
}

Derived from: opendeck-akp153 · keydeck

Ajazz AKP153E (rev. 1)​

ajazz-akp153e · mirabox-cora-v1 · — untested · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 13 10 7 4 1
5 6 7 8 9 14 11 8 5 2
10 11 12 13 14 15 12 9 6 3

extra keys (outside the CORA grid): 16, 17, 18
keyMap: {
"coraToWireImage": [
13,
10,
7,
4,
1,
14,
11,
8,
5,
2,
15,
12,
9,
6,
3
],
"wireInputToCora": [
-1,
4,
9,
14,
3,
8,
13,
2,
7,
12,
1,
6,
11,
0,
5,
10,
-1,
-1,
-1
],
"extraKeys": [
16,
17,
18
]
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 270
}
}

Derived from: opendeck-akp153 · keydeck

Ajazz AKP153R (rev. 1)​

ajazz-akp153r · mirabox-cora-v1 · — untested · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 13 10 7 4 1
5 6 7 8 9 14 11 8 5 2
10 11 12 13 14 15 12 9 6 3

extra keys (outside the CORA grid): 16, 17, 18
keyMap: {
"coraToWireImage": [
13,
10,
7,
4,
1,
14,
11,
8,
5,
2,
15,
12,
9,
6,
3
],
"wireInputToCora": [
-1,
4,
9,
14,
3,
8,
13,
2,
7,
12,
1,
6,
11,
0,
5,
10,
-1,
-1,
-1
],
"extraKeys": [
16,
17,
18
]
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 270
}
}

Derived from: opendeck-akp153 · keydeck

Mars Gaming MSD-ONE​

mars-msd-one · mirabox-cora-v1 · — untested · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 13 10 7 4 1
5 6 7 8 9 14 11 8 5 2
10 11 12 13 14 15 12 9 6 3

extra keys (outside the CORA grid): 16, 17, 18
keyMap: {
"coraToWireImage": [
13,
10,
7,
4,
1,
14,
11,
8,
5,
2,
15,
12,
9,
6,
3
],
"wireInputToCora": [
-1,
4,
9,
14,
3,
8,
13,
2,
7,
12,
1,
6,
11,
0,
5,
10,
-1,
-1,
-1
],
"extraKeys": [
16,
17,
18
]
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 270
}
}

Derived from: opendeck-akp153 · keydeck

Mad Dog GK150K​

maddog-gk150k · mirabox-cora-v1 · — untested · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 13 10 7 4 1
5 6 7 8 9 14 11 8 5 2
10 11 12 13 14 15 12 9 6 3

extra keys (outside the CORA grid): 16, 17, 18
keyMap: {
"coraToWireImage": [
13,
10,
7,
4,
1,
14,
11,
8,
5,
2,
15,
12,
9,
6,
3
],
"wireInputToCora": [
-1,
4,
9,
14,
3,
8,
13,
2,
7,
12,
1,
6,
11,
0,
5,
10,
-1,
-1,
-1
],
"extraKeys": [
16,
17,
18
]
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 270
}
}

Derived from: opendeck-akp153 · keydeck

Risemode Vision 01​

risemode-vision-01 · mirabox-cora-v1 · — untested · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 13 10 7 4 1
5 6 7 8 9 14 11 8 5 2
10 11 12 13 14 15 12 9 6 3

extra keys (outside the CORA grid): 16, 17, 18
keyMap: {
"coraToWireImage": [
13,
10,
7,
4,
1,
14,
11,
8,
5,
2,
15,
12,
9,
6,
3
],
"wireInputToCora": [
-1,
4,
9,
14,
3,
8,
13,
2,
7,
12,
1,
6,
11,
0,
5,
10,
-1,
-1,
-1
],
"extraKeys": [
16,
17,
18
]
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 270
}
}

Derived from: opendeck-akp153 · keydeck

TMICE Stream Controller​

tmice-stream-controller · mirabox-cora-v1 · — untested · compare entry

mk2 index → wire image id (5×3, row-major)

0 1 2 3 4 13 10 7 4 1
5 6 7 8 9 14 11 8 5 2
10 11 12 13 14 15 12 9 6 3

extra keys (outside the CORA grid): 16, 17, 18
keyMap: {
"coraToWireImage": [
13,
10,
7,
4,
1,
14,
11,
8,
5,
2,
15,
12,
9,
6,
3
],
"wireInputToCora": [
-1,
4,
9,
14,
3,
8,
13,
2,
7,
12,
1,
6,
11,
0,
5,
10,
-1,
-1,
-1
],
"extraKeys": [
16,
17,
18
]
}
cora: {
"productId": 0x00a5,
"advertiseAs": "mk2",
"usePhysicalIdentity": false
}
splash: {
"transformOverride": {
"rotate": 270
}
}

Derived from: opendeck-akp153 · keydeck