Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/gueritta/primemixxx/llms.txt

Use this file to discover all available pages before exploring further.

The developer deploy workflow uses SCP and SSH to push the compiled MIXXX bundle from your build machine to the Denon Prime Go or Prime 4 over the network. The device is reachable via a USB Ethernet gadget or WiFi, and the entire deployment — including an automatic SD card backup — runs from a single script.
The repo is always the source of truth. Every change must exist in both the local repo and on the device — they must never diverge.
  • Commit locally first, then deploy to the device.
  • Never edit files directly on the device without updating the repo.
  • Never commit without deploying.
If you edit mixxx_launcher.sh on the device and forget to commit it, the next dev-deploy-to-device.sh run will overwrite your changes.

Prerequisites

  1. SSH access to the device (see connectivity table below).
  2. MIXXX compiled — run ./scripts/dev-collect-mixxx-bundle.sh first to produce mixxx-bundle/.
  3. sshpass installed on your build machine (optional but recommended — without it you will be prompted for the password on each SCP/SSH call):
    sudo apt install sshpass
    

Device Connectivity

Use USB Ethernet (192.168.42.1) for large file transfers and long debugging sessions. Connect a USB-C cable from your computer to the device — the USB Ethernet gadget auto-starts at boot and gives a stable, drop-free connection with no keepalive needed.
MethodAddressNotes
USB Ethernet (RNDIS)192.168.42.1Preferred for SCP / long sessions. Needs usb-gadget-eth.service installed.
WiFi (mDNS)primego.localConvenient for quick commands.
WiFi (static/DHCP)Set DEVICE_IP env varFind the IP on your router or from device shell.
Passworddenonprime4Used for both SSH and SCP.
WiFi SSH connections drop after approximately 30 seconds of silence. To keep a session alive during a long deploy, run a keepalive ping in a separate terminal:
ping -i 25 <device-ip> > /dev/null &

Quick Start Deploy Flow

# 1. Collect MIXXX + all dependencies from Buildroot output
./scripts/dev-collect-mixxx-bundle.sh

# 2. Deploy bundle to device (backs up SD card, copies files, installs services)
DEVICE_IP=primego.local ./scripts/dev-deploy-to-device.sh

# 3. Switch to MIXXX
ssh root@primego.local switch-to-mixxx

# 4. Switch back to Engine OS
ssh root@primego.local switch-to-engine
You can also target the USB Ethernet address directly:
DEVICE_IP=192.168.42.1 ./scripts/dev-deploy-to-device.sh

What Gets Deployed

Everything lives on the SD card — nothing is written to the device’s internal eMMC storage during a normal deploy.
Path on SD cardContents
tkgl_bootstrap_DenonPrimeGO/mixxx-bundle/lib/bin/mixxxMIXXX 2.5.6 ARMv7 binary (~10 MB, working)
tkgl_bootstrap_DenonPrimeGO/mixxx-bundle/bin/mixxxSymlink → ../lib/bin/mixxx
tkgl_bootstrap_DenonPrimeGO/mixxx-bundle/lib/66+ shared libraries (Qt 5.15.8, ALSA, codecs)
tkgl_bootstrap_DenonPrimeGO/mixxx-bundle/qt-plugins/Qt 5.15.8 EGLFS platform + image + SQL plugins
tkgl_bootstrap_DenonPrimeGO/mixxx-bundle/mixxx-mapping/MIDI controller mappings (Prime Go + Prime 4)
tkgl_bootstrap_DenonPrimeGO/mixxx-bundle/mixxx_launcher.shLauncher: env vars, Mali fix, CPU shielding
tkgl_bootstrap_DenonPrimeGO/modules/mod_mixxx/TKGL module — launches MIXXX via systemd-run
tkgl_bootstrap_DenonPrimeGO/scripts/tkgl_bootstrapBootstrap entry point

SD Card Backup

dev-deploy-to-device.sh automatically backs up key directories from /media/TKGL_BOOTSTRAP/tkgl_bootstrap_DenonPrimeGO/mixxx-bundle/ on the device before overwriting anything. The backup is saved locally to:
sdcard-backup-YYYYMMDD-HHMMSS/
The backup captures controllers/, skins/, settings/, and mixxx_launcher.sh — the files most likely to have been modified on-device. Large binary directories (lib/, bin/) are excluded to keep the backup fast.

Device Services

scripts/dev-install-device-services.sh is called automatically by dev-deploy-to-device.sh, but can also be run standalone to repair or reinstall services without redeploying the full MIXXX bundle:
DEVICE_IP=<ip> ./scripts/dev-install-device-services.sh
ServicePurposeAuto-start
usb-gadget-eth.serviceUSB Ethernet gadget (RNDIS) — SSH via USB cableYes (boot)
fix-mdns.serviceFixes mDNS hostname to primego.localYes (boot, oneshot)
powerbutton-monitor.serviceGraceful shutdown on power button pressNo (MIXXX sessions only)
99-usb-automount.rulesAuto-mount USB drives for music libraryYes (udev)
99-wifi-power-save.rulesDisable WiFi power save to prevent SSH dropsYes (udev)

Boot Verification

After deploying and switching to MIXXX, verify the process is running correctly:
# Check MIXXX process is alive
ssh root@<ip> 'ps | grep mixxx'

# Check systemd unit status
ssh root@<ip> 'systemctl status mixxx-app.service'

# Confirm SD card is mounted
ssh root@<ip> 'mount | grep TKGL_BOOTSTRAP'

Important Paths on Device

PathPurpose
/media/TKGL_BOOTSTRAP/TKGL SD card root (label TKGL_BOOTSTRAP, mounted by TKGL stub)
/media/az01-internal/Internal eMMC az01 partition (optional fast-load mirror for MIXXX binaries)
/data/Internal eMMC storage
/data/mixxx/mixxxThin delegator script (points to SD card launcher)
/etc/systemd/system/engine.serviceModified engine service (TKGL stub)
/etc/systemd/system/engine.service.origBackup of original Engine OS service
/usr/bin/switch-to-mixxxSSH-accessible switcher command
/usr/bin/switch-to-engineSSH-accessible switcher command

Build docs developers (and LLMs) love