Supported devices
Every deck DeckBridge can drive, generated straight from the device registry
(ts/src/devices/registry.ts), so it cannot drift from the code that talks to the
hardware. Looking for the values themselves — image spec, wire framing, key maps?
Those are on Device specs.
DeckBridge is tested on macOS only, and the GitHub releases ship macOS builds only. Linux and Windows support exists in the code but is untested. "Untested" below means no one has run DeckBridge against that physical deck — the model is derived from a board that was tested, or from the reference implementations.
Elgato
Elgato's own hardware, driven over native HID. No CORA panel emulation needed.
| Device | Vendor | USB VID:PID | Keys (grid) | Panel px | Image | Extra keys | Tested |
|---|---|---|---|---|---|---|---|
| Stream Deck MK.2 | elgato | 0x0fd9:0x00800x0fd9:0x006d0x0fd9:0x00a5 | 15 (5×3) | 72×72 | JPEG | — | ✓ tested (macOS, 2026-09-15) |
| Stream Deck Mini | elgato | 0x0fd9:0x00630x0fd9:0x00900x0fd9:0x00b30x0fd9:0x00b8 | 6 (3×2) | 80×80 | BMP | — | ✓ tested (macOS) |
Mirabox v3 board
The 293V3 board and its rebadges: 1024-byte CRT packets (512 on the D6 rev. 1), JPEG keys, press and release events.
| Device | Vendor | USB VID:PID | Keys (grid) | Panel px | Image | Extra keys | Tested |
|---|---|---|---|---|---|---|---|
| Mirabox 293V3 | mirabox | 0x6603:0x10050x6603:0x10060x6603:0x10100x6603:0x1014 | 15 (5×3) | 112×112 | JPEG | — | ✓ tested (macOS) |
| Mirabox K1 Pro | mirabox | 0x6603:0x10150x6603:0x1019 | 6 (3×2) | 64×64 | JPEG | — | ✓ tested (macOS) |
| Ajazz AKP153E (rev. 2) | ajazz | 0x0300:0x3010 | 15 (5×3) | 95×95 | JPEG | — | ✓ tested (Windows, 2026-09-15) |
| Ajazz AKP153R (rev. 2) | ajazz | 0x0300:0x3011 | 15 (5×3) | 112×112 | JPEG | — | — untested |
| Fifine AmpliGame D6 | fifine | 0x3142:0x0007 | 15 (5×3) | 112×112 | JPEG | — | — untested |
| Fifine AmpliGame D6 (rev. 2) | fifine | 0x3142:0x0060 | 15 (5×3) | 112×112 | JPEG | — | ✓ tested (macOS, 2026-09-11) |
Mirabox v1 board
The 293S board and its rebadges: 512-byte packets, keydown-only firmware, a shared hardcoded serial, and a 6th key column outside the emulated MK.2 grid.
| Device | Vendor | USB VID:PID | Keys (grid) | Panel px | Image | Extra keys | Tested |
|---|---|---|---|---|---|---|---|
| Mirabox 293S Stream Deck | mirabox | 0x5548:0x6670 | 15 (5×3) | 85×85 | JPEG | 3 | ✓ tested (macOS) |
| Ajazz AKP153 | ajazz | 0x5548:0x6674 | 15 (5×3) | 85×85 | JPEG | 3 | — untested |
| Ajazz AKP153E (rev. 1) | ajazz | 0x0300:0x1010 | 15 (5×3) | 85×85 | JPEG | 3 | — untested |
| Ajazz AKP153R (rev. 1) | ajazz | 0x0300:0x1020 | 15 (5×3) | 85×85 | JPEG | 3 | — untested |
| Mars Gaming MSD-ONE | mars-gaming | 0x0b00:0x1000 | 15 (5×3) | 85×85 | JPEG | 3 | — untested |
| Mad Dog GK150K | mad-dog | 0x0c00:0x1000 | 15 (5×3) | 85×85 | JPEG | 3 | — untested |
| Risemode Vision 01 | risemode | 0x0a00:0x1001 | 15 (5×3) | 85×85 | JPEG | 3 | — untested |
| TMICE Stream Controller | tmice | 0x0500:0x1001 | 15 (5×3) | 85×85 | JPEG | 3 | — untested |
AJAZZ AKP05 family
Dedicated 1024-byte CRT protocol: ten JPEG keys (CRT BAT uploads committed with CRT ULEND), four rotary encoders, a four-zone touch strip, and a 10 s keepalive.
| Device | Vendor | USB VID:PID | Keys (grid) | Panel px | Image | Extra keys | Tested |
|---|---|---|---|---|---|---|---|
| AJAZZ AKP05E | ajazz | 0x0300:0x3004 | 10 (5×2) | 112×112 | JPEG | — | ✓ tested (macOS, 2026-09-21) |
| AJAZZ AKP05 | ajazz | 0x0300:0x3006 | 10 (5×2) | 112×112 | JPEG | 2 | — untested |
Devices in detail
Stream Deck MK.2
Elgato's own 15-key deck. Driven natively over HID (no CORA emulation of the panel itself), so DeckBridge forwards the app's JPEG unchanged.
| USB | 0x0fd9:0x0080 0x006d 0x00a5 |
| Keys | 15 (5×3) |
| Panel | 72×72 JPEG |
| Protocol | elgato-gen2 |
| Tested | ✓ tested (macOS, 2026-09-15) |
- Hardware testing with PID 0x0080 confirmed the native 72×72 JPEG passthrough and
image.rotate: 0. The other accepted PIDs (0x006d and 0x00a5) remain source-derived. - The only non-Elgato-emulating model:
cora.usePhysicalIdentityis true, so the deck's real serial and firmware version are forwarded to the app.
Stream Deck Mini
Elgato's 6-key deck. BMP panel, not JPEG: the app's bitmap is forwarded as-is by the format: 'bmp' short-circuit in image-pipeline.
| USB | 0x0fd9:0x0063 0x0090 0x00b3 0x00b8 |
| Keys | 6 (3×2) |
| Panel | 80×80 BMP |
| Protocol | elgato-gen1 |
| Tested | ✓ tested (macOS) |
- BGR pixel order plus a 90° CW rotation, matching the reference 6-key implementation's
rotate + yFlip. - Fixed-size payload: 54-byte BMP header + 80×80×3 = 19254 bytes, 20 packets per key.
- Splash sources are upright, so the splash path overrides the transform to rotate 90 + flipH.
Mirabox 293V3
The reference v3 board, and the device every other v3 model in this table is derived from. 15 JPEG keys at 112×112, 1024-byte CRT packets, press and release events.
Also sold as: HSV293SV3 / "293S V3" refresh (PID 0x1014)
| USB | 0x6603:0x1005 0x1006 0x1010 0x1014 |
| Keys | 15 (5×3) |
| Panel | 112×112 JPEG |
| Protocol | mirabox-cora |
| Tested | ✓ tested (macOS) |
- Four PIDs: 0x1005 is the hardware-verified one; 0x1006 (EN variant) and 0x1010 (v2.5) come from the vendor's own PID tables; 0x1014 is the HSV293SV3 refresh. The last three are untested here.
- Upscales 72×72 CORA frames to 112×112, so it uses the
lanczos3filter plus a 0.6 unsharp pass to claw back the softness.
Mirabox 293S Stream Deck
The reference v1 board: physically 3×6 = 18 keys, of which the left 5 columns are exposed as a 15-key MK.2 and the right column becomes DeckBridge-native extra keys.
| USB | 0x5548:0x6670 |
| Keys | 15 (5×3) + 3 extra |
| Panel | 85×85 JPEG |
| Protocol | mirabox-cora-v1 |
| Tested | ✓ tested (macOS) |
- Keydown-only firmware — the driver synthesizes the key-up event.
- The app sends MK.2-native 72×72 but the panel is 85×85, so the image is padded (pixels stay 1:1) with an edge-clamped border instead of being upscaled.
- Net image transform is the anti-transpose (rotate 90 ∘ flipV). The opendeck-akp153 guess of rotate90 + flipH + flipV reduces to a plain rotate270 and renders vertically flipped.
- The right column's wire ids (16, 17, 18) are derived from the opendeck-akp153 wire-id namespace, not hardware-verified.
- v1 firmware reports one hardcoded serial (
355499441494) on every unit of every v1 model, sosharedSerialmakes the settings key include the model id.
Mirabox K1 Pro
6 LCD keys (3×2) plus 3 rotary encoders, advertised to the Elgato app as a Stream Deck Mini. The encoders are not wired up — their input codes fall outside the key map and are dropped.
| USB | 0x6603:0x1015 0x1019 |
| Keys | 6 (3×2) |
| Panel | 64×64 JPEG |
| Protocol | mirabox-cora |
| Tested | ✓ tested (macOS) |
- Report ID 0x04, not the 0x00 the rest of the family uses.
- Firmware drops the last byte of every full 1024-byte image chunk.
chunkPadBytewire-encodes a sacrificial byte after everypacketSize - 1payload bytes so the drop only ever eats padding — hardware-verified clean at q90–q100 for 2/3/5-chunk files. - The app sends an 80×80 Mini BMP whose outer edge is dead border, so 6 px is cropped from every side before the 64×64 resize.
- JPEG must stay baseline with a single interleaved scan (the vendored jpeg-encoder fork), with the header through SOS inside the first 1023 payload bytes.
AJAZZ AKP05E
AJAZZ AKP05E (VID 0x0300, PID 0x3004): ten 112×112 LCD keys in a 2×5 grid, plus four rotary encoders (press + rotate, emitted as CORA dial events) and a touch strip whose four zones render DeckBridge widget displays (or a Stream Deck + window image when re-paired as a Plus). Dedicated protocol driver: CRT VER on open, the CRT DIS / LIG / CLE / STP init sequence, CRT BAT uploads committed with CRT ULEND, and a CRT CONNECT keepalive.
| USB | 0x0300:0x3004 |
| Keys | 10 (5×2) |
| Panel | 112×112 JPEG |
| Protocol | ajazz-akp05 |
| Tested | ✓ tested (macOS, 2026-09-21) |
- Only PID 0x3004 is hardware-tested; the retail AKP05 (0x3006) is registered from opendeck-akp05 evidence. Do not add Pro, Mirabox, or hub siblings without their own evidence packet.
- The firmware reports nothing until it receives the init sequence (CRT DIS, CRT LIG, CRT CLE 0xff, CRT STP). Without it images still paint, but no key report ever arrives.
- The host is dropped after roughly 15 s of silence: the panel blanks and key reporting stops until a key press partially wakes it. The keepalive runs every 10 s and repeats CRT DIS + CRT LIG before CRT CONNECT — CONNECT alone leaves the panel refusing further image updates (zeccola/ajazz-akp05 0.10.1, reverted in 0.10.2). The LIG carries the live brightness so a tick cannot reset it.
- Input codes are not the image wire ids: keys report 0x01–0x0a in row order, while their images address wire ids 11–15 (top row) and 6–10 (bottom row).
- The touch strip is 800×112 at wire id 1, rotated 180°. Wire ids 1–4 are also 176×112 slot windows at x = 0 / 204 / 406 / 610 (26–28 px gaps). Every BAT upload draws in place over the strip without clearing it, so an 800-wide image at wire 1 covers the whole strip and a 176-wide one only its slot. A whole-strip frame from the app goes out as one upload; a partial frame re-sends only the slots it touches (settings.json
touchStripZoneFit/touchStripUpload, see docs/side-keys.md). - The firmware decodes only about the first 10 100 B of an image upload and drops the rest; the lost tail shows as noise or old content at the top of the image. A 10 123 B full-strip frame lost its top-left corner, so the earlier 10 240 B cap was too high; 10 100 B and 9 216 B caps drew it intact. Pacing and the terminator (ULEND or STP) make no difference. Strip images therefore use
maxBytes: 10100. CLE 0xff + STP clears the strip. BGPIC positioned frames and BE32-length BAT uploads do nothing. - The CRT VER reply never arrives. The firmware version is read from feature report 0x01 (20 B) at open instead; key input keeps working after the read.
- Encoder press and twist codes are decoded as dial events: press 0x37 / 0x35 / 0x33 / 0x36 left to right (state 1, no release report, so the driver synthesizes the release), twist 0xa0-0xa1 / 0x50-0x51 / 0x90-0x91 / 0x70-0x71 (CCW-CW, state always 0). Touch-strip swipes 0x38 / 0x39 are decoded as left/right swipes; taps 0x40–0x43 (one per zone, left to right, no coordinates) are decoded as taps at each zone's centre. Dials, swipes and taps reach the Elgato app only when the device is re-paired as a Stream Deck + — the native MK.2-PID pairing advertises no encoders or strip. Re-paired as a Plus, the 4×2 grid covers the left four columns; the right column (input codes 0x05/0x0a, images 15/10) becomes DeckBridge side keys with a widget and an optional press command. A 7-byte header-only report with no code byte also appears and carries nothing.
AJAZZ AKP05
Retail AJAZZ AKP05 (VID 0x0300, PID 0x3006). It uses the AKP05 dedicated driver, with ten 112×112 LCD keys, CRT BAT uploads, CRT ULEND commits, and CRT LIG brightness.
| USB | 0x0300:0x3006 |
| Keys | 10 (5×2) + 2 extra |
| Panel | 112×112 JPEG |
| Protocol | ajazz-akp05 |
| Tested | — untested |
- VID, PID, vendor HID collection, protocol version 3 and 112×112 JPEG format come from ambiso/opendeck-akp05; the key transform is the AKP05E's (upright keys, 180° splash). DeckBridge hardware has not tested this SKU.
- Pairs as Stream Deck + by default. Shares the AKP05E init sequence, CRT CONNECT keepalive, Plus key map, encoder, swipe and tap decoding, and the AKP05E strip geometry and 10 100 B upload cap (both untested on this SKU). See the AKP05E notes for the captured input codes.
- Close sends no disconnect command — the firmware can wedge after speculative commands. Unplug and replug if the panel wedges.
Ajazz AKP153E (rev. 2)
The Mirabox 293V3 protocol behind VID 0x0300, with hardware-confirmed 95×95 key images and AKP153E-specific input/image mapping.
| USB | 0x0300:0x3010 |
| Keys | 15 (5×3) |
| Panel | 95×95 JPEG |
| Protocol | mirabox-cora |
| Tested | ✓ tested (Windows, 2026-09-15) |
- Issue #67 hardware testing confirmed 95×95 images; inherited 112×112 images were clipped and became centered only after overriding both dimensions to 95.
- Issue #67 also confirmed the AKP153E-specific input and image mapping. AKP153R remains unverified and deliberately keeps inherited defaults.
- Do not confuse rev. 2 (PID 0x3010, v3, 1024-byte packets) with rev. 1 (PID 0x1010, v1, 512-byte packets). Same VID, adjacent PIDs, completely different protocol.
Ajazz AKP153R (rev. 2)
The Mirabox 293V3 board behind VID 0x0300, PID 0x3011. Identical to the AKP153E rev. 2 apart from the PID.
| USB | 0x0300:0x3011 |
| Keys | 15 (5×3) |
| Panel | 112×112 JPEG |
| Protocol | mirabox-cora |
| Tested | — untested |
- Not hardware-tested; inherits the 293V3's hardware-verified tuning verbatim.
- Rev. 1 of the same name (PID 0x1020) is a v1 board and is a separate model in this table.
Fifine AmpliGame D6
Rev. 1 of the Fifine AmpliGame D6 (PID 0x0007) — the 293V3 board behind VID 0x3142, writing at 512-byte packets.
| USB | 0x3142:0x0007 |
| Keys | 15 (5×3) |
| Panel | 112×112 JPEG |
| Protocol | mirabox-cora |
| Tested | — untested |
- Not hardware-tested. The 512-byte packet size is inferred, and its own source called it surprising ("Not sure why, but it works with it").
packetSizeCandidateslets the HID report descriptor overrule it at open(). - Upstream runs this board at mirajazz v1 for writes but forces the event reader to v3, which is why the model is tagged
mirabox-corawithsynthesizeKeyUp: falserather thanmirabox-cora-v1. sharedSerialis deliberately false. If two rev. 1 units ever collide on one settings key, setting it true on this model alone is the fix.
Fifine AmpliGame D6 (rev. 2)
Rev. 2 of the Fifine AmpliGame D6 (PID 0x0060) — the 293V3 board behind VID 0x3142, writing at 1024-byte packets.
Also sold as: "D6 Pro" in Fifine's own Windows software (the retail box just says D6)
| USB | 0x3142:0x0060 |
| Keys | 15 (5×3) |
| Panel | 112×112 JPEG |
| Protocol | mirabox-cora |
| Tested | ✓ tested (macOS, 2026-09-11) |
- Hardware-verified on macOS: enumerates via the 0xffa0/1 usage path, all 15 keys render full-bleed, press and release both map correctly.
- 512-byte writes render BLACK on this revision. The board reports
MaxOutputReportSize = 1024, so every 513-byte write is discarded by the firmware whilewrite()still returns success — the deck enumerates and reports presses while the screen stays black. Do not unify the packet size with rev. 1. - The 112×112 panel size cannot be probed and the reference projects are split four ways (95 / 100 / 105 / 112). 112 is the value two independent owners derived from the hardware, and it holds up on a real unit.
- The HID report descriptor was captured off a real unit (macOS,
mise run d6-capture) and is checked in atts/test/fixtures/fifine-d6-rev2.report-descriptor.json: 54 bytes, one unnumbered vendor collection declaring a 1024-byte output report and a 512-byte input report. Bothwire.packetSize: 1024andwire.inSize: 512therefore come from the device's own self-description rather than from inference. - Serials are per-unit, not the shared mirajazz
355499441494. Two independent 0x0060 samples share the81D0DA78prefix and differ in the tail —81D0DA784037from the companion issue #32 dump, a different tail on the unit captured here — sosharedSerialstays false. maxBytes: 10240is headroom, not a ceiling: a size ladder on real hardware (mise run d6-capture -- s3) rendered 7.9 / 10.8 / 14.0 / 22.7 / 22.9 KB keys intact. The cap is left as inherited because desktop keys arrive at 1.9–4.8 KB, so it almost never binds, and every extra KB is another 1024-byte HID write per key.
Ajazz AKP153
A v1 rebadge of the Mirabox 293S board (VID 0x5548, PID 0x6674). Every field is inherited from the 293S model by construction, so it cannot drift out of sync.
| USB | 0x5548:0x6674 |
| Keys | 15 (5×3) + 3 extra |
| Panel | 85×85 JPEG |
| Protocol | mirabox-cora-v1 |
| Tested | — untested |
- Not hardware-tested; see the 293S for the tuning rationale and its own caveats.
- Shares VID 0x5548 with the 293S; only the PID separates them.
Ajazz AKP153E (rev. 1)
Rev. 1 of the AKP153E — a v1 rebadge of the Mirabox 293S board (VID 0x0300, PID 0x1010).
| USB | 0x0300:0x1010 |
| Keys | 15 (5×3) + 3 extra |
| Panel | 85×85 JPEG |
| Protocol | mirabox-cora-v1 |
| Tested | — untested |
- Not hardware-tested; inherits the 293S model verbatim.
- Do not merge with
ajazz-akp153e-rev2(PID 0x3010): same VID, adjacent PIDs, completely different protocol.
Ajazz AKP153R (rev. 1)
Rev. 1 of the AKP153R — a v1 rebadge of the Mirabox 293S board (VID 0x0300, PID 0x1020).
| USB | 0x0300:0x1020 |
| Keys | 15 (5×3) + 3 extra |
| Panel | 85×85 JPEG |
| Protocol | mirabox-cora-v1 |
| Tested | — untested |
- Not hardware-tested; inherits the 293S model verbatim.
- Do not merge with
ajazz-akp153r-rev2(PID 0x3011).
Mars Gaming MSD-ONE
A v1 rebadge of the Mirabox 293S board (VID 0x0b00, PID 0x1000).
| USB | 0x0b00:0x1000 |
| Keys | 15 (5×3) + 3 extra |
| Panel | 85×85 JPEG |
| Protocol | mirabox-cora-v1 |
| Tested | — untested |
- Not hardware-tested; inherits the 293S model verbatim.
Mad Dog GK150K
A v1 rebadge of the Mirabox 293S board (VID 0x0c00, PID 0x1000).
| USB | 0x0c00:0x1000 |
| Keys | 15 (5×3) + 3 extra |
| Panel | 85×85 JPEG |
| Protocol | mirabox-cora-v1 |
| Tested | — untested |
- Not hardware-tested; inherits the 293S model verbatim.
Risemode Vision 01
A v1 rebadge of the Mirabox 293S board (VID 0x0a00, PID 0x1001).
| USB | 0x0a00:0x1001 |
| Keys | 15 (5×3) + 3 extra |
| Panel | 85×85 JPEG |
| Protocol | mirabox-cora-v1 |
| Tested | — untested |
- Not hardware-tested; inherits the 293S model verbatim.
TMICE Stream Controller
A v1 rebadge of the Mirabox 293S board (VID 0x0500, PID 0x1001).
| USB | 0x0500:0x1001 |
| Keys | 15 (5×3) + 3 extra |
| Panel | 85×85 JPEG |
| Protocol | mirabox-cora-v1 |
| Tested | — untested |
- Not hardware-tested; inherits the 293S model verbatim.