Skip to content Link Search Menu Expand Document
ModalAI DOCS
Store

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

  1. Table of Contents
  2. Decode a SKU
  3. Inspect SKU
  4. Anatomy of the SKU Number
  5. Field Reference Tables
    1. Family codes
    2. Board codes
    3. RC transmitter configs
    4. Modem configs
    5. Extras configs
  6. Configure SKU
    1. Interactive: the wizard
    2. Scripted: command-line arguments
  7. Using the SKU in Your Own Scripts
  8. 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:

FieldPrefixExampleMeaningDefault if absent
Family codeMRB-D0014The product the board is installed in (see table below)required
Board code4Which VOXL compute board (see table below)required
Hardware versionVV1Hardware revision of the productrequired
Camera configCC27Numbered 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.txtrequired
RC transmitterTT7RC receiver hardware (see table below)0 (none)
Modem configMM7Modem / datalink hardware (see table below)0 (none)
Extras configXX8Additional 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

CodeProduct
MRB-D0001M500
MCM-C0001VOXLCAM
MRB-D0003Seeker (legacy)
MRB-D0004RB5 Flight
MRB-D0005Starling 1 (discontinued)
MRB-D0006Sentinel
MRB-D0008Seeker Vision 5”
MRB-D0010Starling (custom)
MRB-D0011PX4 Autonomy Dev Kit
MRB-D0012Starling 2 Max
MRB-D0013Stinger
MRB-D0014Starling 2
MRB-D0015Fixed Wing
MRB-D0016Sparrow
MRB-D0017Shikra
MRB-D0019Seeker Vision 7”
MRB-D0020Seeker Vision 10”
MDK-F0001Flight Deck
MDK-F0002VOXL Deck
MDK-F0006VOXL 2 Flight Deck
MCCA-M0054VOXL 2 board only
MCCA-M0104VOXL 2 Mini board only
MVX-T0001VOXL 2 Mini VTX
MVX-R0001VOXL 2 Mini VRX
MVX-T0002VTX Gen2
MVX-R0002VRX Gen2
MVX-H0001VRX Hub
MVX-S0001VRX Spire
TF-M0054 / TF-M0104 / TF-M0197factory test fixtures

Board codes

CodeCompute board
1VOXL (original)
2VOXL Flight
3RB5
4VOXL 2
5Flight Core V2
6VOXL 2 Mini
7VOXL 2 Mini VRX
8Betaflight FC
9M0197

RC transmitter configs

CodeReceiver
0none
1Spektrum
6TBS Crossfire
7ELRS (Beta FPV)
8ELRS (M0184)
9Ghost
10ELRS (M0193)

Modem configs

Run print-modem-options on target for the authoritative list. Commonly used codes:

CodeModem / datalink
0none
3Microhard v2, no radio (M0048-3)
4LTE v2, 7610 NA (M0030)
7VOXL 2 5G Quectel (M0067/M0090-3-01)
9VOXL 2 5G Telit (M0090-1-03)
10Microhard v2, pMDDL2350 (M0048)
11Microhard v2, pMDDL2450 (M0048)
18Doodle RM-2450, 2.4 GHz
19Doodle RM-2025, hex band
20M0130 RC7611 (Americas)
21M0130 RC7620 (EMEA)
23Doodle Mini-OEM RM-1700-22M3
25VTX (M0176 + M0175)
26VTX (M0185)
27Microhard, pMDDL1621 (M0059-1)
30VRX (M0206, Mini Pini)
31VRX (M0206, SparkLAN)
33Silvus
34Ethernet
35DTC

Four-digit codes combine an LTE modem with a VTX or VRX (for example 2026 = M0130 RC7611 + M0185 VTX).

Extras configs

CodeExtra hardware
0none
1CADDX Air Unit
2USB Boson
3CADDX Vista + USB Boson
4HD-Zero
5CADDX Vista
8Lepton
12HD-Zero + Lepton
14Walksnail + Lepton
15Walksnail GT
16Walksnail GT + Lepton
SStrike
SLStrike 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-sku does nothing except update the sku.txt file 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
FlagMeaning
-f, --familyproduct family, by name or code (required)
-b, --boardboard code or name (normally derived from the family)
-v, --versionhardware version
-c, --camcamera config number
-t, --txRC transmitter code
-m, --modemmodem code
-d, --dry-rundo everything except write to disk
-q, --quietwrite to disk only, no printout
-w, --wizardrun 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.