docs/assets
September 17, 2026 · View on GitHub
| File | What it is | How it was made |
|---|---|---|
lerobot.gif | The README hero. A real arm, a real model, no script: an SO-101 follower on lerobot:real, told wave to the camera with an extended arm, piloted by OpenAI's gpt-6-astra, filmed on a phone on 2026-09-15. Run 20260915-145349-goal: eight steps, ten LLM calls, 79 seconds, shown at ten times speed. The model chose report_state, then move_joints once to extend (shoulder_lift -39, elbow_flex 30), four times to roll the wrist (+28, -25, +25, -25) and once more to return it to centre (-4), then stop, which is the eight, and declared success off the joint readings because the webcam cropped the raised arm. What a viewer cannot see is written down in the README: the arm fell when the run ended, because that afternoon predates the rest pose; four earlier wave runs from the same afternoon sat in its prompt through memory, so the strategy was recalled as much as improvised; and the prompt told it 40 steps while --max-steps 10 was in force, a bug this recording found. | lerobot_hero.py --video, which shells out to ffmpeg: 640 pixels wide, 10 frames a second, a 128-colour palette chosen from what moves, Bayer dither, a light hqdn3d. The one file here allowed over the 2048 KB cap, with a cap of its own in that script and an exclude in .pre-commit-config.yaml — a render spends bytes on what moved and a photograph of a lab spends them on every pixel of every frame, so this does not fit at a width worth leading a page with. The first recording here with a model in the loop, and the only one made on hardware. quackd's own footage, no upstream licence. The video and the run's frames and transcript are kept outside the repository, beside the other eleven runs of that afternoon, on the machine that drove the arm. |
lerobot-what-it-saw.png | What the pilot saw, from the same run as the hero: three of the ten frames lerobot:real wrote to frames/ and sent to the model. 0000.png, the arm folded before the first call. 0003.png, after step 2, extended, with the webcam cropping the raised arm at the top of the picture, which is why the model verified its wave from joint angles rather than from this. 0009.png, after the stop, with a hand waving back. One USB webcam at opencv://2, 640x480, the only camera the run had. | lerobot_hero.py --run: each frame downscaled to 392 pixels wide with Lanczos and nothing else done to it, a caption strip under each naming the step. The frames are the model's actual input rather than a phone's view of the bench, which is the point of putting them beside the hero. |
social-preview.png | 1280×640 card for GitHub's Settings → Social preview (no API for this — upload it once by hand) and for link previews. Carries the one-liner, so it changes when the positioning does (ADR-0035). | social_preview.py — the mark is web/assets/duck-mark.png, which web/make_mark.py cuts out of quackd-web's duck, pasted at its own resolution after the card is resampled so it is never resized, and the two panels are real sim2d renders of a three-robot arena through the same render_topdown and render_duckcam a run's GIF uses. Until 0.9 the mark and the wordmark were logo.svg's geometry transcribed into Pillow, and before that this row claimed a script that was never committed, so the card could not be regenerated by anyone. |
quackd-on-off.gif | The README's simulator figure, and its hero until the real arm. One arena, recorded twice: on the left walk in a square with quackd, on the right the identical world, robot and walking policy with no quackd at all, where the duck stands because nothing in it reads English. Each pane carries a top-down inset of the path so far, because a chase camera on a 25 cm robot shows a duck walking and not a square. | hero3d.py — the left pane is a real run through the real loop with the scripted pilot and no API key, and it has to close: the pilot measures how far from its starting point four legs left it (0.14 m in this recording) and declares failure rather than success if that is more than one side, so a GIF of four legs walked in a line cannot ship as a square. The right pane is not a worse model, it is no model: the duck is sent no twist, which is what a Microduck gets when nothing is attached to it. The only file here that is not ours: it renders Pollen Robotics' Microduck model, whose 3D files are CC BY-NC-SA. See licenses.md. |
hero.gif | The README hero until the physics simulator landed, and still the cartoon reference shot: find-and-kick in the built-in sim2d simulator. Not in the README now, still used by LAUNCH.md. Left: world view. Right: what the duck's camera sees. | quackd record find-and-kick --provider fake --seed 3 --gif-size 320 — the scripted pilot, not an LLM (see ADR-0013). Real sim, real perception, real safety layer; the decisions are a rule. |
transcript-example.jsonl | The transcript of that run: system prompt, each observation, each tool call, each verb result, token counts. Predates the trace kinds (ADR-0029), so it carries llm, verb and frame and none of llm_request, verb_start, gate, intent, verb_end or note. Re-record it with the next hero, and move the replay test that reads it (tests/test_cli_trace.py) onto a fixture of its own first: it is the only old-shape transcript in the repository, and quackd trace has to keep reading one. | Copied from runs/<timestamp>/transcript.jsonl. |
flock.gif | Flock mode: three ducks split the search, auction the kick, the closest one takes it. Left: the shared world. Right: the claimant's camera. | quackd record flock-kick --provider fake --seed 3 — the scripted planner and deterministic coordinator, no LLM in the loop (docs/flock.md). |
open-duck.gif | The 0.5 headline body: an Open Duck Mini v2 finds the ball and walks up to it, because it has no kick. Left: the world from above. Right: the duck's camera. | quackd run open-duck-scout --robot open_duck:sim2d --provider fake --seed 3 --gif-size 320 — the scripted pilot, not an LLM, like every other asset here. |
transcripts/qwen2.5-coder-14b-lmstudio-find-and-kick-seed6-memory-read.jsonl | A real local model piloting find-and-kick: Qwen 2.5 Coder 14B through LM Studio, seed 6, success in 8 steps, with an earlier run's episode in the prompt and no remember call. | quackd run find-and-kick --provider lmstudio --model qwen/qwen2.5-coder-14b --seed 6, copied from runs/<timestamp>/transcript.jsonl with the contributor's home directory removed from duck_path; memory.path is relative because the runs used --memory-dir next to the checkout, not ~/.quackd. Read in docs/local-llms.md. |
transcripts/qwen2.5-coder-14b-lmstudio-find-and-kick-seed5-remember.jsonl | The same model and duck once remember sat in strategy step 5: seed 5, success in 4 steps, one remember call with a fact from the verb results. | Same command with --seed 5, same scrubbing. |
transcripts/qwen3-32b-awq-vllm-find-and-kick-seed1-thinking-on.jsonl | Qwen3 deliberating. Qwen3-32B-AWQ through a self-hosted vLLM, find-and-kick, success in 4 steps. All eight LLM calls carry a thinking field, its first call is refused by the verdict gate, and its remember call writes the note the next file reads. The control half of the only measurement anybody has of what --extra-body stops. | quackd run find-and-kick --provider local --model Qwen/Qwen3-32B-AWQ --base-url http://<host>:8011/v1 --robot microduck:sim2d --seed 1, on main at 739ff84 through uvx, copied from runs/<timestamp>/transcript.jsonl. The contributor made duck_path relative and wrote memory.path back as its unexpanded default ~/.quackd/memory/..., because uvx had left an absolute Windows cache path in the first and memory_dir's own expanduser had left a home directory in the second. Nothing else was touched, and no transcript records its seed, so the 1 is the contributor's word and not the file's. Read in docs/local-llms.md. |
transcripts/qwen3-32b-awq-vllm-find-and-kick-seed1-thinking-off.jsonl | The same thing told not to think. Same build, same seed, same server, --extra-body '{"chat_template_kwargs": {"enable_thinking": false}}' the only difference: success in 3 steps, not one thinking field in the file, and run_start carries the extra_body object so the run says for itself what it was told. Its prompt holds the note and the episode the run above wrote, which makes the pair the first published chain of quackd's memory. | Same command with the flag added, same scrubbing. |
contributors.svg | The circle of faces under Contributing in the README: everyone who has contributed, humans only, ordered by lines added, every avatar clipped to the same circle. | Generated by contributors.py from the GitHub contributors API, avatars inlined so the file needs no network. Regenerated by .github/workflows/contributors.yml on every push to main and weekly, committed only when it changes. |
The mark is not in this directory. The duck head the README opens with and the social
card is built around is web/assets/duck-mark.png, kept
once beside the browser demo that also serves it. It is the same drawing quackd.org shows in
a browser tab, though not the same file: web/assets/favicon-96.png is its own smaller
export. It is quackd's own art. logo.svg, the flat biped and the two-colour wordmark
that stood here until 0.9, is deleted rather than kept beside it: two marks is one more than a
project this size can keep honest.
Every simulator recording here is driven by the scripted pilot rather than a model, and every
caption says so. Two files are not: lerobot.gif and lerobot-what-it-saw.png are a real arm
under a real cloud model, OpenAI's gpt-6-astra, on 2026-09-15. The transcripts are the other
real model runs in this directory: four of them, two contributors, two local servers, no API key
and no frame between them. So one cloud model has been recorded here, on hardware, and none has
yet been recorded in either simulator.
For the quackd record and quackd run assets, replacing one with a real model run is
a matter of swapping --provider fake for --provider anthropic, copying
runs/<timestamp>/run.gif over the file, and dropping the word scripted from the caption and
this table.
quackd-on-off.gif is different again. hero3d.py builds the scripted pilot in code and exposes no provider
flag, and the square shape is that pilot's own strategy (square_strategy in
quackd/agent/providers/fake.py, keyed off the word square in the goal). A real model
recording means editing the script to take a provider and letting the model walk the square
itself, which is the more interesting recording and costs a key.
The hero is different from both. It is a phone pointed at a bench, so there is no script that
re-records it, only the one that re-cuts it: lerobot_hero.py takes a video and a run
directory and neither is in this repository. Re-recording it means an arm, a model and an
afternoon, and the next person to spend one is welcome to send a better clip.
On upstream's assets. This directory used to say that no Pollen Robotics asset would ever
live here, and for every file but one that is still true: the mark is our own art, and every
sim2d recording is our own cartoon. quackd-on-off.gif is the exception. It renders
Pollen's Microduck model, whose 3D files upstream's README licenses CC BY-NC-SA, and it is here
because a picture of the real robot walking on its real gait says something a drawing of a box
cannot. It is labelled in the table above, in licenses.md and in the README
caption; it is the only such file, and it is non-commercial and share-alike where the rest of
quackd is Apache-2.0. No upstream mesh, policy, logo or brand asset is committed here in its own
form, and none ever will be: the simulator fetches those at run time (see
adapters/microduck/src/quackd_microduck/sim3d/assets.py).