{
 "schema_version": 1,
 "generated": "2026-10-20",
 "id": "rokbenko-quackd--command-a-real-lerobot-arm-by-goal",
 "repo": "rokbenko/quackd",
 "repo_url": "https://github.com/rokbenko/quackd",
 "repo_slug": "rokbenko-quackd",
 "title": "Command a real SO-101 arm with a plain-English goal",
 "page_title": "How to command a real SO-101 arm with a plain-English goal with Quackd",
 "summary": "Give an SO-101 arm a goal from the terminal and let an LLM pick each joint call.",
 "who": "A maker with a LeRobot SO-101 arm on a bench who wants to test LLM-driven motion on real hardware.",
 "problem": "Scripting each arm motion by hand takes time, and the arm cannot yet react to a goal stated in plain words.",
 "outcome": "The arm performs the stated goal, such as a wave, one model-chosen call at a time, and the transcript shows each call.",
 "steps": [
  "Install Quackd with the LeRobot adapter and register the arm by name, with a rest pose, as described in the README (inferred, check the README)",
  "Set your model key or start a local model server, following the README",
  "Run: Quackd run --goal \"Wave to the camera with an extended arm\"",
  "Stop the run if the arm moves unexpectedly, and review the transcript of calls"
 ],
 "agent_prompt": "Using the rokbenko/quackd repo, register an SO-101 arm over lerobot:real under the name <arm-name> with a rest pose, then run quackd run --goal \"Wave to the camera with an extended arm\". Report the list of calls the model made and whether the arm returned to rest. Verify that the arm is at its rest pose after the run before starting another goal.",
 "agents": [
  "any"
 ],
 "difficulty": "Advanced",
 "time": "120 minutes",
 "basis": "readme",
 "caveat": "The README reports that the arm fell at the end of its runs because LeRobot drops torque on disconnect, so set a rest pose and keep hands clear of the arm.",
 "category": "Software and DevOps",
 "tags": [
  "Software and DevOps"
 ],
 "lang": "python",
 "requirements": [
  "Python installed on a laptop or computer",
  "An API key for one hosted model (Claude, OpenAI, Gemini, Grok and others), or a local model served by Ollama, vLLM, llama.cpp or LM Studio",
  "For the simulated duck: the quackd[microduck] extra",
  "For real hardware: a supported robot such as the SO-101 arm over LeRobot, plus its serial or USB connection"
 ],
 "risk": "dual-use",
 "seen_in_the_wild": false,
 "mentioned_publicly": false,
 "risks": [
  {
   "tag": "credentials",
   "notice": "The model API key you set for the pilot lets the model act on a physical arm, so keep the key out of shared scripts and logs."
  }
 ],
 "best": false,
 "score": 0.9,
 "evidence": [],
 "url": "https://dedupedai.com/use-cases/rokbenko-quackd/command-a-real-lerobot-arm-by-goal/",
 "md": "https://dedupedai.com/use-cases/rokbenko-quackd/command-a-real-lerobot-arm-by-goal/index.md",
 "disclaimer": "Deduped lists open-source repositories that belong to other people. We do not own, maintain, audit, or vouch for any of them, and a repo appearing here is not an endorsement or a safety check. The use cases, steps, and prompts are written by AI and may be incomplete, outdated, or just wrong. Where a use case is marked \"Seen in the wild\", we link to public posts where someone described something similar, but we have not verified those posts and the use case itself is still our AI's own write-up. Use all of this at your own risk. Only run code, commands, or agents on systems and accounts you are authorized to use, and read the code and every command before you run it, especially anything that touches credentials, files, or the network. Nothing here is professional, security, legal, or financial advice. All trademarks and project names belong to their respective owners, and their use here does not imply affiliation. Content is provided as is, without warranties of any kind. Found a mistake, a safety problem, or something you want removed? Email hello@dedupedai.com and we will look at it promptly.",
 "api": "https://dedupedai.com/api/v1/usecases/rokbenko-quackd--command-a-real-lerobot-arm-by-goal.json",
 "api_version": "v1"
}
