The maintainer's loop for testing a change on a real RK3588 device. Release packages are not built in the cloud; only the WSL2 host below produces them. Buildroot/image changes land as code plus build and verify steps, not as prebuilt images.
Mac (Claude Code Remote Control, ~/Downloads/RustLang/rustkvm)
└─ ssh foxx@192.168.1.173 Windows jump host (OpenSSH for Windows, default shell cmd.exe)
└─ wsl.exe → WSL2 repo: /home/foxx/obj/RK3588/jetkvm/rustkvm (only place packages are built)
Device: ssh root@192.168.1.6 RK3588, dropbear
- IPs are LAN addresses and may change after a device reboot.
192.168.1.221is a different host whose SSH host key changed; do not treat it as the device. - Mac: key
~/.ssh/id_ed25519, loaded into the keychain / ssh-agent. - Windows:
foxxis an administrator, so authorized keys live inC:\ProgramData\ssh\administrators_authorized_keys, not~/.ssh.ssh-copy-iddoes not work there; append the public key to that file by hand. - Device: keys live in
/userdata/dropbear/.ssh/authorized_keys. - Never commit passwords or private keys.
- Build (in WSL, on the branch under test). If the frontend changed, run
trunk build --releaseincrates/rkvm-webfirst, since the app embedsdist/.A cold release build takes several minutes.ssh foxx@192.168.1.173 'wsl.exe -e bash -lc "cd /home/foxx/obj/RK3588/jetkvm/rustkvm && git status -sb | head -1 && cargo +stage2 build -Z build-std=std,panic_abort --target aarch64-unknown-linux-gnu -p rustkvm --bin rustkvm_app --release"' - Stop the app with SIGTERM (never
-9, see below):ssh root@192.168.1.6 'pkill -TERM -x rustkvm_app' - Copy
target/aarch64-unknown-linux-gnu/release/rustkvm_appfrom WSL to/userdata/rustkvm/bin/rustkvm_appon the device (scp from WSL, or via the Mac). - Restart:
ssh root@192.168.1.6 '/etc/init.d/S99rustkvm restart' - Verify: tail
/userdata/rustkvm/log/rustkvm_app.log, and load the web UI at https://192.168.1.6/ (http also serves).
dev_deploy.sh is not used in this loop: it uses fuser -k (watchdog reboot risk) and ends in an interactive ssh.
- Watchdog:
killall -9/fuser -kon a runningrustkvm_appreboots the device. Only exception:Text file busyon redeploy. - Strict config:
/userdata/rustkvm/config.tomlis parsed withdeny_unknown_fields. A key from a newer or older build crashes startup (deprecatedai_*keys are ignored with a warning; others are not). Back the file up (cp config.toml config.toml.bak.<tag>) before editing, and remove only the offending key. - Harmless log line:
Failed listening on '22'comes from the init script's SSH daemon, not the app. - Claude Code auto mode on the Mac: plain
ssh foxx@192.168.1.173 '...'andssh root@192.168.1.6 '...'are allowed by rules in~/.claude/settings.json(rules load only in a new session; do not put options like-obefore the host, it breaks the prefix match). These get blocked: piping a script intowsl.exe, chaining a local command after an ssh command, and running curl from the Mac against the device (curl from the device itself works). cmd.exe quoting is fragile, so a committed deploy script run through one of the allowed prefixes is the preferred next step.