I started with a deterministic baseline that barely reached the screwdriver. I ended with a flow matching policy that uses correlated noise to pick it up and place it in the box. I built all of it on a $300 arm with one laptop GPU.
Each version fixed the failures of the last one. v1 taught me what does not work. v2 added the right inductive biases. v3 upgraded the eyes.
I trained this on 83 teleoperation episodes. It used a ViT-Tiny vision encoder, a PaliGemma tokenizer (which received zeros), a 4 layer self-attention transformer, and 50 step action chunking with L1 loss. It reached for the screwdriver but could not grasp it consistently.
The failures taught me a lot. Self-attention let the action queries contaminate each other before they saw the scene. Deterministic regression averaged out the multimodal demonstrations. The unfrozen backbone overfitted in 2000 steps.
Instead of predicting one average trajectory, the model starts from noise shaped like real robot motions and refines it step by step into precise actions. I added cross-attention so the decoder looks at the scene before it decides what to do.
DINOv2 ViT-S/14 replaces ViT-Tiny. Its self-supervised pretraining on 142M images means the backbone encodes where objects are in space, not only what class they are. It gives 384 dimensional embeddings and 256 tokens per camera, which is 2.6x more visual information.
I released the architecture, the training scripts, the deployment code, the model weights, the dataset, and the mistakes along the way.