Troubleshooting
Common issues and how to fix them.
Nodes can't discover each other
Symptom: Two nodes are running on the same machine or LAN but neither receives messages from the other. No connection errors — just silence.
Cause: mDNS requires multicast UDP packets to reach all nodes. This is blocked in several common configurations:
- Docker / WSL2 — the virtual network interface doesn't forward multicast by default
- VPN — most VPN clients suppress multicast
- Multiple network interfaces — Spine may bind to the wrong interface
- Firewall — UDP 5353 (mDNS) and the Spine port are blocked
Fix:
- Confirm both nodes are on the same physical network segment (same Wi-Fi, same LAN)
- Temporarily disable VPN and retest
- On Linux, check which interface multicast traffic uses:
ip route show | grep 224.0.0.0 - Run both nodes on the same host first to isolate network vs. discovery issues
AES decryption failure / "namespace key mismatch"
Symptom: A node connects but messages are dropped or logged as invalid. You see errors like cipher: message authentication failed or similar.
Cause: Two nodes are using different namespace keys. All nodes in a namespace must share the same AES-256 key.
Fix:
- Confirm both nodes are started with the same
--namespace-keyflag (or equivalent config) - Keys are case-sensitive byte strings — a trailing space or newline will produce a different key
- If keys are loaded from environment variables, confirm the variable is set identically in both shells
CrackHead crashes on startup
Symptom: crack-head exits immediately, often with Failed to load model or a segmentation fault.
Cause: MuJoCo cannot find the scene XML file, or the MuJoCo library is not on the linker path.
Fix:
- Confirm
MUJOCO_PATHpoints to your MuJoCo install directory (the one containinglib/andinclude/) - Confirm the scene file path is correct — by default CrackHead looks for
scenes/phantom_cornea.xmlrelative to the working directory - On Linux, run
ldd ./build/crack-head | grep mujocoto check the library is linked correctly - On macOS, ensure MuJoCo is not quarantined:
xattr -dr com.apple.quarantine /path/to/mujoco
High latency or jitter in arm response
Symptom: The arm responds to input but with noticeable delay or stuttering.
Cause: Several possible sources:
- Purifier's Kalman filter
process_noiseis too high, causing over-smoothing - KCP retransmission is firing due to packet loss
- The Kinematics Engine is running on an overloaded CPU
Fix:
- Check packet loss on the link:
ping -c 100 <node-host>— any loss > 0.5% will cause KCP retransmits - Lower
process_noisein the Purifier config to reduce smoothing lag - Run the Kinematics Engine on a dedicated core:
taskset -c 2 ./kinematics-engine(Linux) - Confirm that CrackHead and the Kinematics Engine are not on the same CPU core as the Spine message loop
Keyboard node not responding
Symptom: The keyboard node is running but pressing keys has no effect.
Cause: The terminal running the keyboard node does not have keyboard focus, or the node is not publishing to the topic the rest of the pipeline subscribes to.
Fix:
- Click on the terminal window running the keyboard node to give it focus — key events are captured from the focused terminal
- Confirm the node is publishing to
input/raw(check with a debug subscriber) - Confirm Purifier is subscribed to
input/rawand publishinginput/clean
iPhone IMU node: no data received
Symptom: The iPhone IMU node is running but input/raw receives no messages.
Cause: The iPhone and the computer running the IMU node are on different network segments, or the UDP port is firewalled.
Fix:
- Confirm the iPhone and the computer are on the same Wi-Fi network — the IMU streams over Wi-Fi/UDP
- Check if a firewall is blocking the UDP port used by the IMU node (default: see the repo README)
- Confirm the iPhone app has permission to access the local network (iOS 14+: Settings → Privacy → Local Network)
Build errors with spine-cpp
Symptom: CMake configure or build fails with missing headers or linker errors.
Cause: The C++ toolchain does not meet the requirements, or the Spine library path is not set.
Fix:
- Confirm you have a C++17-capable compiler:
g++ --versionshould show GCC 9+ or Clang 10+ - Run CMake with the explicit path:
cmake -B build -DSPINE_ROOT=/path/to/spine-cpp - On macOS with Apple Silicon, ensure you are building for
arm64:cmake -B build -DCMAKE_OSX_ARCHITECTURES=arm64
Still stuck?
Open an issue on the relevant GitHub repository: