Skip to content

Command-line tools

On Windows use python where this page says python3.

cptools is a shim for python3 tools/app_manager.py, run in a platform-idf checkout. With no arguments it opens the interactive manager (TUI).

commandoptionswhat it does
list--all, --jsonList available and installed apps (--all adds incompatible ones)
install APP--ref, --origin, --forceInstall an app as a submodule under components/ (--ref defaults to main)
remove APPnoneRemove an installed app
update [APP]--all, --force, --dry-runUpdate one app or all; --force backs up local work first
status [APP]--jsonTrack policy vs actual git state, all apps or one
track APP MODE--ref, --commit, --localSet what an app follows: release, development, version or mine (old names still work)
backup APPnoneSnapshot an app’s local work into .crosspad/backups/
restore APP [STAMP]--listRestore a backup (newest by default), or list them
new APP_ID--name, --description, --category, --private/--public, --owner, --no-installScaffold an app from the template; --private/--public also creates and pushes its GitHub repo
device--jsonDiff what the connected CrossPad was built from against this checkout; exit 2 when they differ
config-initnoneCreate crosspad.config.json from the current state
config [FLAG] [VALUE]--local, --genShow or set compile-time feature flags (on/off or an enum value)
profile ACTION [NAME]--remove-extra, --descriptionNamed build recipes: list, show, apply, save
syncnoneSync the manifest with the app submodules already on disk
tui--plainInteractive terminal UI; --plain drops colour and full-screen redraw (screen readers)
doctor--jsonCheck tools, board, network and project folder, with a fix for each; exit 1 if anything is wrong
supportnoneSave a zip with logs and findings to send to support
update-boardnoneThe “Update my CrossPad” flow without a screen: download, build, flash, check

track modes: development takes --ref (a branch), version takes --commit. The old names registry, branch, pinned and local still work. --local on track and config writes to crosspad.local.json; config --gen regenerates .crosspad/build_flags.*. new --category is music, audio, tools or other. profile apply --remove-extra removes apps the profile omits.

Terminal window
cptools list --all
cptools install sampler
cptools update --all --dry-run
cptools track sampler development --ref main
cptools restore sampler --list
cptools new my-app --name "My App"
cptools profile apply NAME
cptools tui --plain

More: Install and remove apps, Start from the template.

Run idf.py in the platform-idf root (the crosspad-idf shim does that for you). Every build or flash command needs -B build_v2 -DSDKCONFIG=sdkconfig.v2 (build_v1 / sdkconfig.v1 for a r16 / r19 board). The actions below come from idf_ext.py and mirror CP Tools.

actionoptionswhat it does
app-list--allList available and installed apps (--all includes incompatible ones)
app-install--app, --ref, --origin, --forceInstall an app as a git submodule in components/ (--ref defaults to main)
app-remove--appRemove an app submodule
app-update--app, --all, --force, --dry-runUpdate one or all installed apps; --force backs up local work first
app-syncnoneSync the manifest with existing app submodules
app-managenoneOpen the interactive app manager (TUI)
app-status--appTrack policy vs actual git state, all apps or one
app-track--app, --mode, --ref, --commit, --localSet what an app follows: --mode release | development | version | mine; --ref for development, --commit for version
app-backup--appSnapshot an app’s local work into .crosspad/backups/
app-restore--app, --stamp, --listRestore a backup (newest unless --stamp), or list them
app-config--flag, --value, --local, --genShow or set compile-time feature flags
app-profile--profile-action, --name, --remove-extra, --descriptionNamed build recipes: list (default), show, apply, save
app-devicenoneAsk the connected device what it was built from and diff against this checkout
app-new--app, --name, --description, --category, --private, --public, --ownerScaffold a new app from the template, optionally creating its GitHub repo
board--set, --board, --deviceShow the board revision that builds and flashes use; --set v1|v2 remembers one
Terminal window
idf.py app-install --app sampler
idf.py -B build_v2 -DSDKCONFIG=sdkconfig.v2 build

Only present if you installed with the one-liner. On Linux and macOS they live in the project’s bin/ and are linked into ~/.local/bin; on Windows they are .cmd files in C:\CrossPad\firmware\bin, which is on your user PATH. Each one except crosspad-sim sets up ESP-IDF before it runs, so no export.sh is needed.

commandrunspresent when
cptoolstools/app_manager.pyalways
crosspad-idfidf.py, from the project folderalways
crosspad-flashtools/ota_flash.pyalways
crosspad-filestools/fs_transfer.pyalways
crosspad-boardtools/crosspad_board.pyalways
crosspad-benchtools/bench.pyalways
crosspad-hilcrosspad-hil from the project’s .venvcrosspad-hil is installed in .venv
crosspad-simthe PC simulator binary, from its own folderthe simulator was built
crosspad-pcthe crosspad-pc app manager (scripts/app_manager.py)crosspad-pc is checked out

With the Arduino option the installer also adds crosspad-arduino and pio.

Run from the platform-idf root as python3 tools/<script>. The ESP scripts pick the build of the connected (or remembered) board revision by default.

Tools used only by the release pipeline are not listed here.

Flash firmware over USB CDC while the board runs. See Update firmware over USB.

optionwhat it does
firmwareImage to send (default: build_<rev>/CrossPad.bin of the board being flashed)
-p, --portSerial port (auto-detected if omitted)
--boardRevision of the image to take; needed when the board’s own revision is unknown
--devicecrosspad-hil device id, when several boards are connected
--deltaSend a delta patch instead of the full image (needs --base-fw)
--base-fwThe image currently on the device
--patchA pre-generated delta patch (skips patch generation)
--forceFlash an image built for another revision, or a board of unknown revision

Assets partition and file transfer over USB CDC. -p / --port (serial port, auto-detected if omitted) goes before the subcommand, for example python3 tools/fs_transfer.py -p <port> ls /sdcard.

subcommandwhat it does
assets [image]Flash a whole LittleFS assets image (default: the board’s build); --force skips the superblock check
push LOCAL REMOTECopy a file to the device
pull REMOTE [LOCAL]Copy a file from the device
dump LOCALRead the assets partition back as an image
ls REMOTEList a directory under /assets, /spiflash or /sdcard
rootsShow the mounts and their usage
stat REMOTESize and type of one path
rm REMOTEDelete a file or an empty directory
mkdir REMOTECreate a directory

Which board revision to build and flash for: --board, then the connected board, then the last choice in crosspad.local.json. Exit 2 when nothing is known.

optionwhat it does
nonePrint the decision and where it came from
--boardUse this revision (v1 or v2)
--devicecrosspad-hil device id, when several boards are connected
--setRemember this revision and stop
--idf-argsPrint the idf.py -B / -DSDKCONFIG arguments for the revision
--jsonMachine-readable output

One entry point for a test board; it finds the crosspad-hil venv itself. Exit codes follow crosspad-hil.

subcommandwhat it does
checkCheck the connected test setup and print a fix for each problem
readyPut the test board in a known state: CDC profile, mic route, a kit loaded
flash [--assets]Flash the build for the connected board and prove it landed; --assets also reflashes the assets partition
test SCENARIO...Run HIL scenarios with this bench’s flags
recoverReflash over UART through the STM bridge port, for a board that does not answer over USB CDC; --port, --build, --sdkconfig
hil ARGS...Raw crosspad-hil, venv resolved

Ask the ESP32-S3 to enter its ROM bootloader over MIDI SysEx or USB CDC.

optionwhat it does
--methodTransport order, comma-separated (default midi,cdc)
--devicePart of the device name to search for (default Crosspad)
--vidUSB vendor ID in hex, for CDC
--pidUSB product ID in hex, for CDC
--skip-bootloader-checkDo not check whether the device is already in bootloader mode

crosspad-hil 1.6.0, installed with pip install "crosspad-hil[all] @ git+https://github.com/CrossPad/crosspad-hil". Options every command takes: -d / --device (device id or port; implicit with one board), --json, --holder (the name you reserved a shared board with), --bench-force. Exit codes: 0 pass, 1 test failed on the device, 2 setup problem. See Test on hardware (HIL).

commandwhat it does
devicesList attached CrossPads and their ports; --watch re-lists every second
doctorCheck dependencies, permissions, port locks and devices
consoleSTM bridge console: tail it, or wait for --expect patterns
cdcSend a raw CDC verb and print the reply
applist, start NAME, stop, versions
kitlist, load ID, status, push DIR, from-fpc, to-fpc
padpress, release, pressure, stats, notes
uisnapshot, focus REF, press, rotate N
ledstate: the LED controller’s model as a 4x4 grid
memFree, largest and minimum internal and PSRAM memory; --blocks for the histogram
bleBoard BLE: status, start, stop, scan, devices, enable, connect, disconnect, send
ble host-*This computer’s radio: host-scan, host-listen, host-send, host-latency
midisysex HEX, note on|off N, echo; hub (host only) keeps fixed ALSA MIDI ports open for a DAW
companionSend one companion verb over SysEx (works in the audio profile)
usb-modeget, or set default|audio
audioroute, level, gain, tasks on|off; nodes (host only) exposes the board as PipeWire nodes
flHost only: FL Studio project template install / status
reaperHost only: REAPER control script install / status
snapshotOne-call device state: apps, UI, kit, LEDs, pads, memory, BLE
stimPlay the pads on a schedule; reports the PAD_STATS delta and drops
diagnoseDiagnostic bundle: reset reason, decoded backtrace, heap, console context
captureRecord the UAC2 capture endpoint to a WAV (switches profile and back)
analyzeOffline verdict on a WAV (onset, click, silence, multitone, velocity, psd…)
jamScript and analyse a live set offline: script, analyze, kits, synth
flashOTA-flash firmware over CDC (leaves the audio profile if needed); --delta, --base-fw
bootloaderRequest the ESP ROM bootloader (--esp, default) or STM DFU (--stm)
runRun a HIL scenario, e.g. crosspad-hil run smoke
benchReserve a shared test board: claim, renew, release, status, md
recordRecord a CDC transcript (commands from stdin) for replay tests
serveNDJSON daemon on stdio (used by crosspad-mcp)