— team
Built with Victor.
— intro
Walnut is a sub-$100 desk quadruped built to feel alive without demanding attention. Victor and I started from the sesame quadruped and reachy mini, built a sesame to find its limits, and wrote our own spec: a natural gait, hearing and expression, and always-on presence. A robot that can sit through a conversation nearby without interrupting it.
— hardware
Dual compute: a xiao ESP32-S3 runs the motors, IMU, and the locomotion policy, while a pi zero 2 W handles peripherals and the slower intelligence. Power was the real constraint, since eight servos stall near 1 A each. We went with a 1S LiPo and separate charge and discharge paths, a charge-only USB-C board on one side and a 10–15 A path into a 5.2 V boost converter on the other, to get around the ~3 A cutoff on common protection boards. Packaging into sesame's original footprint came down to a component map in onshape with variables driving the downstream design. Slow, but it meant component swaps never broke the layout.
The feetech SCS0009s were poorly documented, so we built scs-suite on top of binh pham's sts-suite and added the motor support upstream in rustypot.
— locomotion
A small PPO policy trained in mujoco with mjlab, constrained to what walnut can actually measure and compute: IMU, joint encoders, previous action, and a command, running as a float32 MLP directly on the ESP32-S3 at 50 Hz. The whole actor is 66 → 128 → 128 → 8, about 100 kB with its normalizer, small enough to keep several policies in flash and swap live.
We trained 16,384 randomized walnuts in parallel, with a curriculum that added turning, clearance, reverse, and friction and latency variation only after the basic gait formed. Most of the effort went into closing off cheap tricks: in sim, a 2 mm foot lift counted as a step that real backlash would turn into a slide, so the gait reward is gated on measured clearance. No lift, no reward.
— personality
Three speeds instead of one model in charge: reflexes (picked up, falling, told to stop) act without waiting, an idle loop adds blinks and chirps, and a slower model loop handles context and deliberate actions. A small priority system shares the body between them, idle below cognition below human below reflex, and reflexes report what they did so the model remembers reacting. The face is procedural, a few values for lids, gaze, size, and tilt. Speech is rare by design: the model's text is internal dialogue, and only what it puts in say-tags is spoken.