Microduck Studio

An app for people who own — or are waiting for — a Microduck. It reads the trained networks that drive the robot, lets you write motions for it, and measures what those motions actually do in physics.

Nobody has the hardware yet. Pollen Robotics' first Microduck deliveries are around Christmas 2026. Everything here runs against a trained policy on your phone, a physics bench on your own network, or a recorded motion. Nothing on this site is talking to a robot, and the app says so on every screen where it matters.

What it does

Policies

Load a trained .onnx, see what is inside it, and check whether it is one of Pollen's. Blend two into a third and find out whether the result still does anything.

Motions

Write a motion keyframe by keyframe, or describe it in words and let a language model draft it. Every angle it writes is checked against the robot's own joint travel before you see it.

The bench

A phone has no physics engine. Point the app at a machine that does and it will run a policy or a motion properly, and tell you how often it worked — not whether it looked good once.

The Lab

A life-size duck on your floor in AR, seven synthesised duck calls, soccer, and a room-capture that writes real scene geometry.

The bench

This is the piece that turns a preview into a measurement. It is a small Node program that runs MuJoCo on a computer you already own — a Mac, a PC, a Raspberry Pi — and the app talks to it over your own network.

Download the bench · 12 MB sha256

Starting it

# Windows: right-click start.ps1 → Run with PowerShell
# macOS / Linux:
./start.sh

The first start installs MuJoCo and onnxruntime and takes a couple of minutes. Every start after that is seconds. It prints the address to type into the app.

Use the Tailscale address it prints, not a Wi-Fi one. A 192.168 address works right up until your phone prefers cellular or you leave the room — and it fails looking exactly like a bench that has gone down.

What travels with it

The bundle carries scene.mjb, the physics world every measurement is made against, and its digest. A number measured against a different world is not comparable to one measured here, which is why the world ships with the code rather than just its filename.

File formats

Every format the app writes is its own, and it reads back everything it writes. That was not always true and fixing it is why these are documented.

ExtensionWhat it holds
.duckmove
duck-move/2
A motion: keyframe times and fifteen joint angles each. Poses and times interpolated — no physics ran.
.duckplan
duck-plan/1
A fetch plan: the measured object and what was asked for. The steps are derived when it is read, so a plan cannot go stale and disagree with the app that opens it.
.duckintent A recording of a policy running in physics, with the world it was recorded in named inside it.
.onnx A trained policy. 61 inputs, 14 outputs, and the app will tell you exactly why it refuses one that is not.

What is honest about this

Two claims are easy to make about a robot app and neither is made here. A preview on a phone is what you asked for, not what the robot would do: the four authored stair motions in the app get up their flight 0 times in 16 when a physics engine is asked. And a success rate is not an answer on its own — the bench's criterion is "ends standing", which a duck standing perfectly still passes every time.