zeroclaw-labs/zeroclaw · error

Failed to start Bridge app. Ensure arduino-app-cli is instal

Error message

Failed to start Bridge app. Ensure arduino-app-cli is installed on Uno Q.

What it means

deploy_remote finishes by running `arduino-app-cli app start ~/ArduinoApps/uno-q-bridge` over ssh and bails when it exits non-zero. The copy succeeded; starting the app on the board failed — most often because the arduino-app-cli runtime is not installed on the Uno Q, which the message calls out.

Source

Thrown at crates/zeroclaw-hardware/src/peripherals/uno_q_setup.rs:72

        .context("scp failed")?;
    if !status.success() {
        anyhow::bail!("Failed to copy Bridge app");
    }

    println!("Starting Bridge app on Uno Q...");
    let status = Command::new("ssh")
        .args([
            "--",
            &ssh_target,
            "arduino-app-cli",
            "app",
            "start",
            "~/ArduinoApps/uno-q-bridge",
        ])
        .status()
        .context("arduino-app-cli start failed")?;
    if !status.success() {
        anyhow::bail!("Failed to start Bridge app. Ensure arduino-app-cli is installed on Uno Q.");
    }

    println!("ZeroClaw Bridge app started. Add to config.toml:");
    println!("  [[peripherals.boards]]");
    println!("  board = \"arduino-uno-q\"");
    println!("  transport = \"bridge\"");
    Ok(())
}

fn validated_ssh_target(value: &str) -> Result<String> {
    let mut parts = value.split('@');
    let first = parts.next().unwrap_or_default();
    let second = parts.next();
    if parts.next().is_some() {
        anyhow::bail!("Uno Q host must contain at most one '@'");
    }

    let (user, host) = match second {

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Run it by hand to see the real output: `ssh arduino@<host> 'arduino-app-cli app start ~/ArduinoApps/uno-q-bridge'`
  2. If the command is not found, install arduino-app-cli on the Uno Q
  3. If the CLI exists, rerun the setup to re-copy a complete app directory over the corrupt partial copy
Defensive patterns

Strategy: try-catch

Validate before calling

let probe = std::process::Command::new("ssh")
    .args(["--", &format!("arduino@{host}"), "command", "-v", "arduino-app-cli"])
    .output()?;
if !probe.status.success() {
    anyhow::bail!("arduino-app-cli missing on {host}; install it before deploy");
}

Try / catch

match setup_uno_q_bridge(Some(host)) {
    Err(e) if format!("{e}").contains("Failed to start Bridge app") => {
        // ssh in and run `arduino-app-cli app start ~/ArduinoApps/uno-q-bridge`
        // manually to see the real error, then re-deploy a clean copy
    }
    rest => rest,
}

Prevention

When it happens

Trigger: setup_uno_q_bridge(Some(host)) onto a board without arduino-app-cli; the copied app directory incomplete or invalid (missing app.yaml); the app starting then exiting immediately with its own error, surfaced through the ssh exit code.

Common situations: New Uno Q boards shipped without the app runtime; an interrupted earlier deploy leaving a half-written app directory; app.yaml referencing missing sketch/python files.

Related errors


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/9a4e730d91cfe7b0. Report an issue: GitHub.