Inspect and Configure SKU
Your VOXL or VOXL development kit ships with a SKU number written to a persistent data partition at /data/modalai/sku.txt. The SKU describes exactly what product the compute board is installed in — which vehicle, which compute board, which cameras, radios, and add-ons — and it is the single input that drives all automatic configuration: voxl-configure-mpa reads it to decide which services to enable and how each should be configured.
Because /data is a persistent partition, the SKU survives system image flashes: a reflashed VOXL still remembers what vehicle it is in.
Generally speaking, you should not need to change the SKU unless you are transferring a VOXL to a different product or changing which cameras it is connected to. However, it is useful to know what it is and what it means.
Table of Contents
- Table of Contents
- Decode a SKU
- Inspect SKU
- Anatomy of the SKU Number
- Field Reference Tables
- Configure SKU
- Using the SKU in Your Own Scripts
- Source Code
Decode a SKU
Paste any ModalAI SKU to break it into its parts (decoded with the same tables voxl-configurator uses on the vehicle):
Inspect SKU
To inspect the SKU of your device, first access the device with adb shell. Then use the voxl-inspect-sku command to get a printout like this:
voxl2:/$ voxl-inspect-sku
family code: MRB-D0014 (starling-2)
compute board: 4 (voxl2)
hw version: 1
cam config: 27
modem config: 0 (none)
tx config: 7 (elrs_beta_fpv)
extras config: 0 (none)
SKU: MRB-D0014-4-V1-C27-T7
A few useful options:
voxl-inspect-sku --json # same information as machine-readable JSON
voxl-inspect-sku --quiet # validate only; exit code says if the SKU parses
voxl-inspect-sku --sku MRB-D0006-4-V2-C6 # parse any SKU string without touching the device's own
The --sku form is handy for previewing what a SKU you are about to set actually means, and --json is the right interface for scripts and programs that need SKU fields.
Anatomy of the SKU Number
ModalAI SKU numbers follow this structure:
MRB-D0014 - 4 - V1 - C27 - T7 - M0 - X0
│ │ │ │ │ │ └── extras config
│ │ │ │ │ └── modem config
│ │ │ │ └── RC transmitter config
│ │ │ └── camera config
│ │ └── hardware version
│ └── board code
└── family code
The first two fields — family code and board code — are fixed and always present. Every field after them is a letter-prefixed tag, so their order does not matter and missing fields simply take their defaults:
| Field | Prefix | Example | Meaning | Default if absent |
|---|---|---|---|---|
| Family code | — | MRB-D0014 | The product the board is installed in (see table below) | required |
| Board code | — | 4 | Which VOXL compute board (see table below) | required |
| Hardware version | V | V1 | Hardware revision of the product | required |
| Camera config | C | C27 | Numbered camera configuration; run print-camera-configs on target for the list, or see Configure Cameras. CC selects a user-defined custom config from /data/modalai/custom_camera_config.txt | required |
| RC transmitter | T | T7 | RC receiver hardware (see table below) | 0 (none) |
| Modem config | M | M7 | Modem / datalink hardware (see table below) | 0 (none) |
| Extras config | X | X8 | Additional payload hardware (see table below) | 0 (none) |
An E-prefixed experimental field also exists for internal development tweaks; production SKUs do not carry it.
Two families are special cases with simpler SKUs: board-only families (MCCA-…) imply their board code and hardware version, and VRX receiver families (MVX-R…) only carry a hardware version and modem config since they have no cameras or RC input.
Field Reference Tables
These tables reflect voxl-configurator 1.1.39. The tables printed on-target are always authoritative — voxl-print-family-table, voxl-print-board-table, print-camera-configs, print-modem-options, and print-extras-options are available in any shell on VOXL.
Family codes
| Code | Product |
|---|---|
| MRB-D0001 | M500 |
| MCM-C0001 | VOXLCAM |
| MRB-D0003 | Seeker (legacy) |
| MRB-D0004 | RB5 Flight |
| MRB-D0005 | Starling 1 (discontinued) |
| MRB-D0006 | Sentinel |
| MRB-D0008 | Seeker Vision 5” |
| MRB-D0010 | Starling (custom) |
| MRB-D0011 | PX4 Autonomy Dev Kit |
| MRB-D0012 | Starling 2 Max |
| MRB-D0013 | Stinger |
| MRB-D0014 | Starling 2 |
| MRB-D0015 | Fixed Wing |
| MRB-D0016 | Sparrow |
| MRB-D0017 | Shikra |
| MRB-D0019 | Seeker Vision 7” |
| MRB-D0020 | Seeker Vision 10” |
| MDK-F0001 | Flight Deck |
| MDK-F0002 | VOXL Deck |
| MDK-F0006 | VOXL 2 Flight Deck |
| MCCA-M0054 | VOXL 2 board only |
| MCCA-M0104 | VOXL 2 Mini board only |
| MVX-T0001 | VOXL 2 Mini VTX |
| MVX-R0001 | VOXL 2 Mini VRX |
| MVX-T0002 | VTX Gen2 |
| MVX-R0002 | VRX Gen2 |
| MVX-H0001 | VRX Hub |
| MVX-S0001 | VRX Spire |
| TF-M0054 / TF-M0104 / TF-M0197 | factory test fixtures |
Board codes
| Code | Compute board |
|---|---|
| 1 | VOXL (original) |
| 2 | VOXL Flight |
| 3 | RB5 |
| 4 | VOXL 2 |
| 5 | Flight Core V2 |
| 6 | VOXL 2 Mini |
| 7 | VOXL 2 Mini VRX |
| 8 | Betaflight FC |
| 9 | M0197 |
RC transmitter configs
| Code | Receiver |
|---|---|
| 0 | none |
| 1 | Spektrum |
| 6 | TBS Crossfire |
| 7 | ELRS (Beta FPV) |
| 8 | ELRS (M0184) |
| 9 | Ghost |
| 10 | ELRS (M0193) |
Modem configs
Run print-modem-options on target for the authoritative list. Commonly used codes:
| Code | Modem / datalink |
|---|---|
| 0 | none |
| 3 | Microhard v2, no radio (M0048-3) |
| 4 | LTE v2, 7610 NA (M0030) |
| 7 | VOXL 2 5G Quectel (M0067/M0090-3-01) |
| 9 | VOXL 2 5G Telit (M0090-1-03) |
| 10 | Microhard v2, pMDDL2350 (M0048) |
| 11 | Microhard v2, pMDDL2450 (M0048) |
| 18 | Doodle RM-2450, 2.4 GHz |
| 19 | Doodle RM-2025, hex band |
| 20 | M0130 RC7611 (Americas) |
| 21 | M0130 RC7620 (EMEA) |
| 23 | Doodle Mini-OEM RM-1700-22M3 |
| 25 | VTX (M0176 + M0175) |
| 26 | VTX (M0185) |
| 27 | Microhard, pMDDL1621 (M0059-1) |
| 30 | VRX (M0206, Mini Pini) |
| 31 | VRX (M0206, SparkLAN) |
| 33 | Silvus |
| 34 | Ethernet |
| 35 | DTC |
Four-digit codes combine an LTE modem with a VTX or VRX (for example 2026 = M0130 RC7611 + M0185 VTX).
Extras configs
| Code | Extra hardware |
|---|---|
| 0 | none |
| 1 | CADDX Air Unit |
| 2 | USB Boson |
| 3 | CADDX Vista + USB Boson |
| 4 | HD-Zero |
| 5 | CADDX Vista |
| 8 | Lepton |
| 12 | HD-Zero + Lepton |
| 14 | Walksnail + Lepton |
| 15 | Walksnail GT |
| 16 | Walksnail GT + Lepton |
| S | Strike |
| SL | Strike XL |
Configure SKU
The voxl-configure-sku tool is the only supported way to change the SKU. It validates every field, constructs a correctly formatted SKU string, and writes it to /data/modalai/sku.txt.
Running
voxl-configure-skudoes nothing except update thesku.txtfile on disk. To actually reconfigure the services on VOXL to match, run voxl-configure-mpa afterwards — it will read the new SKU and rebuild every service’s configuration from it.
Interactive: the wizard
For humans, use the wizard. It walks through each field with menus, suggesting the current SKU (if valid) and per-family defaults along the way:
voxl2:/$ voxl-configure-sku --wizard
The wizard asks, in order: product family, hardware version, camera config (ENTER accepts the family default; C selects a custom config), then — only for families where they apply — RC receiver, modem, and extra hardware. Before writing anything it previews the constructed SKU through voxl-inspect-sku so you can confirm every field parsed the way you intended.
Scripted: command-line arguments
For production lines and CI scripts, every field can be supplied as an argument. Only the family is required — the board code is derived from the family automatically, and other fields fall back to that family’s defaults:
voxl-configure-sku --family starling-2 -v 1 # Starling 2, defaults for the rest
voxl-configure-sku -f sentinel -v 2 -m 10 # Sentinel V2 with Microhard pMDDL2350
voxl-configure-sku -f MRB-D0008 -c 6 -t 8 # family by code, explicit cam + ELRS
voxl-configure-sku -f starling-2 -v 1 --dry-run # validate and print, write nothing
| Flag | Meaning |
|---|---|
-f, --family | product family, by name or code (required) |
-b, --board | board code or name (normally derived from the family) |
-v, --version | hardware version |
-c, --cam | camera config number |
-t, --tx | RC transmitter code |
-m, --modem | modem code |
-d, --dry-run | do everything except write to disk |
-q, --quiet | write to disk only, no printout |
-w, --wizard | run the interactive wizard |
Using the SKU in Your Own Scripts
All of the parsing and table logic used by these tools lives in one shell library, /home/root/.profile.d/modalai_sku_definitions.sh, which is sourced into every shell on VOXL. Your own scripts can use it directly:
source /home/root/.profile.d/modalai_sku_definitions.sh
voxl-parse-and-export-sku-variables $(cat /data/modalai/sku.txt)
echo "$VOXL_FAMILY_NAME on $VOXL_BOARD_NAME, camera config $VOXL_CAM_NUM"
After parsing, the fields are exported as environment variables: VOXL_FAMILY_CODE/VOXL_FAMILY_NAME, VOXL_BOARD_CODE/VOXL_BOARD_NAME, VOXL_HW_VERSION, VOXL_CAM_NUM, VOXL_MODEM_NUM/VOXL_MODEM_NAME, VOXL_TRANSMITTER_NUM/VOXL_TRANSMITTER_NAME, and VOXL_EXTRAS_CODE/VOXL_EXTRAS_NAME. This is exactly how voxl-configure-mpa consumes the SKU internally. For non-shell programs, parse the output of voxl-inspect-sku --json instead.
Source Code
The source code for all of the above — the tools and the definitions library — is in the voxl-configurator repository.