so101-assembly-guide / index.html
Guillaume-Georges's picture
Upload folder using huggingface_hub
ff91e7b verified
Raw History Blame Contribute Delete
41.2 kB
<!doctype html>
<!--
Hugging Face static Space KitSmith/so101-assembly-guide, generated by scripts/src/build-hf-space.ts
from deploy/hf-space/index.template.html. Edit the template, then `pnpm build-hf-space` and
`hf upload KitSmith/so101-assembly-guide deploy/hf-space/dist . --type space`.
Every 3D view is iframed from kitsmith.dev (nothing copied here). Step text, screws, checks and
sources stay on kitsmith.dev, and every step links there.
-->
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>SO-101 Assembly Guide in 3D</title>
<meta
name="description"
content="Every step of the kitsmith.dev SO-101 assembly guide in 3D. The full step-by-step guide lives at kitsmith.dev/so101."
/>
<link rel="canonical" href="https://kitsmith.dev/so101/" />
<style>
:root {
--bg: #f6f7fa;
--bg-2: #ffffff;
--fg: #101827;
--muted: #4b5a72;
--accent: #0b57d0;
--accent-fg: #ffffff;
--line: #d9dee7;
--link: #0b57d0;
--tap: 44px;
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #101827;
--bg-2: #182337;
--fg: #eef2f7;
--muted: #9fabbe;
--accent: #4da3ff;
--accent-fg: #101827;
--line: #22314a;
--link: #8ec4ff;
}
}
* {
box-sizing: border-box;
}
body {
margin: 0;
padding-block: 1.5rem 2.5rem;
padding-inline: 1rem;
background: var(--bg);
color: var(--fg);
font:
16px/1.5 system-ui,
-apple-system,
'Segoe UI',
Roboto,
sans-serif;
}
main {
max-width: 76rem;
margin: 0 auto;
}
h1 {
font-size: 1.6rem;
line-height: 1.2;
margin: 0 0 0.4rem;
}
h2 {
font-size: 1.15rem;
margin: 2rem 0 0.5rem;
}
p {
margin: 0 0 0.75rem;
}
a {
color: var(--link);
}
.lede {
color: var(--muted);
max-width: 48rem;
}
.layout {
display: grid;
grid-template-columns: minmax(0, 1fr) 19rem;
gap: 1.25rem;
align-items: start;
margin-top: 1.25rem;
}
.now {
margin: 0;
color: var(--muted);
font-size: 0.9rem;
font-variant-numeric: tabular-nums;
}
.now-title {
margin: 0.1rem 0 0.6rem;
font-size: 1.2rem;
}
.frame {
width: 100%;
aspect-ratio: 4 / 3;
max-height: 75vh;
border: 1px solid var(--line);
border-radius: 0.75rem;
overflow: hidden;
background: var(--bg-2);
}
.frame iframe {
display: block;
width: 100%;
height: 100%;
border: 0;
}
.controls {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin-top: 0.75rem;
}
.controls button {
min-height: var(--tap);
padding: 0.4rem 0.9rem;
border: 1px solid var(--line);
border-radius: 0.6rem;
background: var(--bg-2);
color: var(--fg);
font: inherit;
cursor: pointer;
}
.controls button:disabled {
opacity: 0.45;
cursor: default;
}
.cta {
display: inline-flex;
align-items: center;
min-height: var(--tap);
padding: 0.4rem 1.1rem;
border-radius: 0.6rem;
background: var(--accent);
color: var(--accent-fg);
font-weight: 600;
text-decoration: none;
}
.steps {
max-height: min(40rem, 80vh);
overflow-y: auto;
border: 1px solid var(--line);
border-radius: 0.75rem;
background: var(--bg-2);
padding: 0 0 0.5rem;
}
.steps h3 {
position: sticky;
top: 0;
margin: 0;
padding: 0.5rem 0.9rem;
background: var(--bg-2);
border-bottom: 1px solid var(--line);
font-size: 0.9rem;
}
.steps ol {
list-style: none;
margin: 0;
padding: 0.25rem 0;
}
.steps a {
display: flex;
gap: 0.5rem;
min-height: 2.25rem;
padding: 0.35rem 0.9rem;
color: var(--fg);
text-decoration: none;
line-height: 1.3;
font-size: 0.92rem;
}
.steps a span {
color: var(--muted);
font-variant-numeric: tabular-nums;
flex: none;
}
.steps a:hover {
background: var(--bg);
}
.steps a[aria-current='step'] {
background: var(--bg);
box-shadow: inset 3px 0 0 var(--accent);
font-weight: 600;
}
.held {
margin-top: 1rem;
color: var(--muted);
font-size: 0.9rem;
}
/* Screenshot strip: upright cards, all visible on a wide screen, snap-scrolled with the next
card peeking on a phone. Captions are text, not pixels, so they read at any width. */
.shots {
display: grid;
grid-auto-flow: column;
grid-auto-columns: minmax(13rem, 1fr);
gap: 1rem;
margin: 0.75rem 0 0;
padding: 4px 0 0.75rem;
list-style: none;
overflow-x: auto;
scroll-snap-type: x mandatory;
overscroll-behavior-x: contain;
}
.shots li {
scroll-snap-align: start;
}
.shots a {
display: flex;
flex-direction: column;
gap: 0.3rem;
color: var(--fg);
text-decoration: none;
border-radius: 1rem;
}
.shots img {
display: block;
width: 100%;
height: auto;
aspect-ratio: 430 / 760;
margin-bottom: 0.5rem;
border: 1px solid var(--line);
border-radius: 1rem;
background: #101827;
box-shadow:
0 1px 2px rgb(16 24 39 / 0.08),
0 8px 24px rgb(16 24 39 / 0.12);
transition: transform 0.15s ease;
}
.shots strong {
font-size: 1rem;
line-height: 1.3;
}
.shots span {
color: var(--muted);
font-size: 0.9rem;
line-height: 1.4;
}
.shots a:hover img {
transform: translateY(-3px);
}
.shots a:hover strong {
color: var(--link);
}
.shots a:focus-visible {
outline: 3px solid var(--accent);
outline-offset: 4px;
}
@media (prefers-reduced-motion: reduce) {
.shots img {
transition: none;
}
.shots a:hover img {
transform: none;
}
}
.cta:focus-visible,
.controls button:focus-visible,
.steps a:focus-visible {
outline: 3px solid var(--accent);
outline-offset: 2px;
}
ul.links {
padding-left: 1.2rem;
margin: 0.25rem 0 0;
}
ul.links li {
margin: 0.3rem 0;
}
footer {
margin-top: 2.5rem;
padding-top: 1rem;
border-top: 1px solid var(--line);
color: var(--muted);
font-size: 0.9rem;
}
@media (max-width: 52rem) {
.layout {
grid-template-columns: minmax(0, 1fr);
}
.frame {
aspect-ratio: 3 / 4;
}
.steps {
max-height: 24rem;
}
.shots {
grid-auto-columns: 72%;
}
}
</style>
</head>
<body>
<main>
<h1>SO-101 Assembly Guide in 3D</h1>
<p class="lede">
Every step of the
<a href="https://kitsmith.dev/so101/" target="_blank" rel="noopener">kitsmith.dev SO-101 guide</a> in 3D:
the step's parts highlighted, the arm built so far beneath them, later parts ghosted. Pick a
step and drag to turn the model. Each step's page on kitsmith.dev has its check, the screws
and tools where it needs them, and the source for every fact.
</p>
<div class="layout">
<section aria-labelledby="now-title">
<p class="now" id="now">F-001 · Follower arm · step 1 of 26</p>
<h2 class="now-title" id="now-title">Remove support material from all printed parts</h2>
<div class="frame">
<iframe
id="viewer"
title="3D view of step F-001"
src="https://kitsmith.dev/so101/embed/follower/001-follower-clean-printed-parts/"
allow="fullscreen"
></iframe>
</div>
<div class="controls">
<button
type="button"
id="prev"
aria-keyshortcuts="ArrowLeft"
title="Shortcut: ←"
disabled
>
← Previous
</button>
<button type="button" id="next" aria-keyshortcuts="ArrowRight" title="Shortcut: →">
Next →
</button>
<a class="cta" id="cta" href="https://kitsmith.dev/so101/follower/001-follower-clean-printed-parts/" target="_blank" rel="noopener"
>Open F-001 on kitsmith.dev: the full step with its check and sources ↗</a
>
</div>
</section>
<nav class="steps" id="steps" aria-label="All steps"><section><h3>Follower arm</h3><ol><li><a href="https://kitsmith.dev/so101/follower/001-follower-clean-printed-parts/" data-id="F-001" target="_blank" rel="noopener"><span>F-001</span>Remove support material from all printed parts</a></li><li><a href="https://kitsmith.dev/so101/follower/002-follower-set-servo-ids/" data-id="F-002" target="_blank" rel="noopener"><span>F-002</span>Set motor IDs 1–6 and baud rate before assembly</a></li><li><a href="https://kitsmith.dev/so101/follower/003-follower-preinstall-cables/" data-id="F-003" target="_blank" rel="noopener"><span>F-003</span>Plug one 3-pin cable into each motor before building</a></li><li><a href="https://kitsmith.dev/so101/follower/010-follower-joint1-horns/" data-id="F-010" target="_blank" rel="noopener"><span>F-010</span>Fit both horns on motor 1 (shoulder pan)</a></li><li><a href="https://kitsmith.dev/so101/follower/011-follower-joint1-motor-into-base/" data-id="F-011" target="_blank" rel="noopener"><span>F-011</span>Seat motor 1 in the base</a></li><li><a href="https://kitsmith.dev/so101/follower/012-follower-joint1-motor-holder/" data-id="F-012" target="_blank" rel="noopener"><span>F-012</span>Slide the first motor holder over motor 1</a></li><li><a href="https://kitsmith.dev/so101/follower/013-follower-joint1-shoulder/" data-id="F-013" target="_blank" rel="noopener"><span>F-013</span>Attach the shoulder to the motor 1 horns</a></li><li><a href="https://kitsmith.dev/so101/follower/014-follower-joint1-shoulder-motor-holder/" data-id="F-014" target="_blank" rel="noopener"><span>F-014</span>Add the shoulder motor holder</a></li><li><a href="https://kitsmith.dev/so101/follower/020-follower-joint2-horns/" data-id="F-020" target="_blank" rel="noopener"><span>F-020</span>Fit both horns on motor 2 (shoulder lift)</a></li><li><a href="https://kitsmith.dev/so101/follower/021-follower-joint2-motor/" data-id="F-021" target="_blank" rel="noopener"><span>F-021</span>Slide motor 2 in from the top and fasten</a></li><li><a href="https://kitsmith.dev/so101/follower/022-follower-joint2-upper-arm/" data-id="F-022" target="_blank" rel="noopener"><span>F-022</span>Attach the upper arm to the motor 2 horns</a></li><li><a href="https://kitsmith.dev/so101/follower/030-follower-joint3-horns/" data-id="F-030" target="_blank" rel="noopener"><span>F-030</span>Fit both horns on motor 3 (elbow flex)</a></li><li><a href="https://kitsmith.dev/so101/follower/031-follower-joint3-motor/" data-id="F-031" target="_blank" rel="noopener"><span>F-031</span>Insert motor 3 into the upper arm</a></li><li><a href="https://kitsmith.dev/so101/follower/032-follower-joint3-forearm/" data-id="F-032" target="_blank" rel="noopener"><span>F-032</span>Connect the forearm to the motor 3 horns</a></li><li><a href="https://kitsmith.dev/so101/follower/040-follower-joint4-horns/" data-id="F-040" target="_blank" rel="noopener"><span>F-040</span>Fit both horns on motor 4 (wrist flex)</a></li><li><a href="https://kitsmith.dev/so101/follower/041-follower-joint4-motor-holder/" data-id="F-041" target="_blank" rel="noopener"><span>F-041</span>Slide motor holder 4 onto the forearm</a></li><li><a href="https://kitsmith.dev/so101/follower/042-follower-joint4-motor/" data-id="F-042" target="_blank" rel="noopener"><span>F-042</span>Slide in motor 4 and fasten</a></li><li><a href="https://kitsmith.dev/so101/follower/050-follower-joint5-motor/" data-id="F-050" target="_blank" rel="noopener"><span>F-050</span>Insert motor 5 into the wrist holder</a></li><li><a href="https://kitsmith.dev/so101/follower/051-follower-joint5-horn/" data-id="F-051" target="_blank" rel="noopener"><span>F-051</span>Fit one horn only on motor 5 (wrist roll)</a></li><li><a href="https://kitsmith.dev/so101/follower/052-follower-joint5-wrist-to-motor4/" data-id="F-052" target="_blank" rel="noopener"><span>F-052</span>Secure the wrist to the motor 4 horns</a></li><li><a href="https://kitsmith.dev/so101/follower/060-follower-gripper-body/" data-id="F-060" target="_blank" rel="noopener"><span>F-060</span>Attach the gripper body to the motor 5 horn</a></li><li><a href="https://kitsmith.dev/so101/follower/061-follower-gripper-motor/" data-id="F-061" target="_blank" rel="noopener"><span>F-061</span>Insert the gripper motor</a></li><li><a href="https://kitsmith.dev/so101/follower/062-follower-gripper-horns/" data-id="F-062" target="_blank" rel="noopener"><span>F-062</span>Fit both horns on the gripper motor</a></li><li><a href="https://kitsmith.dev/so101/follower/063-follower-gripper-claw/" data-id="F-063" target="_blank" rel="noopener"><span>F-063</span>Install the gripper claw</a></li><li><a href="https://kitsmith.dev/so101/follower/070-follower-controller-board/" data-id="F-070" target="_blank" rel="noopener"><span>F-070</span>Mount the controller board on its plate and fit it to the base</a></li><li><a href="https://kitsmith.dev/so101/follower/071-follower-daisy-chain/" data-id="F-071" target="_blank" rel="noopener"><span>F-071</span>Daisy-chain the motor cables and connect motor 1 to the board</a></li></ol></section><section><h3>Leader arm</h3><ol><li><a href="https://kitsmith.dev/so101/leader/001-leader-clean-printed-parts/" data-id="L-001" target="_blank" rel="noopener"><span>L-001</span>Remove support material from all printed parts</a></li><li><a href="https://kitsmith.dev/so101/leader/002-leader-set-servo-ids/" data-id="L-002" target="_blank" rel="noopener"><span>L-002</span>Set motor IDs 1–6 and baud rate before assembly</a></li><li><a href="https://kitsmith.dev/so101/leader/003-leader-preinstall-cables/" data-id="L-003" target="_blank" rel="noopener"><span>L-003</span>Plug one 3-pin cable into each motor before building</a></li><li><a href="https://kitsmith.dev/so101/leader/010-leader-joint1-horns/" data-id="L-010" target="_blank" rel="noopener"><span>L-010</span>Fit both horns on motor 1 (shoulder pan)</a></li><li><a href="https://kitsmith.dev/so101/leader/011-leader-joint1-motor-into-base/" data-id="L-011" target="_blank" rel="noopener"><span>L-011</span>Seat motor 1 in the base</a></li><li><a href="https://kitsmith.dev/so101/leader/012-leader-joint1-motor-holder/" data-id="L-012" target="_blank" rel="noopener"><span>L-012</span>Slide the first motor holder over motor 1</a></li><li><a href="https://kitsmith.dev/so101/leader/013-leader-joint1-shoulder/" data-id="L-013" target="_blank" rel="noopener"><span>L-013</span>Attach the shoulder to the motor 1 horns</a></li><li><a href="https://kitsmith.dev/so101/leader/014-leader-joint1-shoulder-motor-holder/" data-id="L-014" target="_blank" rel="noopener"><span>L-014</span>Add the shoulder motor holder</a></li><li><a href="https://kitsmith.dev/so101/leader/020-leader-joint2-horns/" data-id="L-020" target="_blank" rel="noopener"><span>L-020</span>Fit both horns on motor 2 (shoulder lift)</a></li><li><a href="https://kitsmith.dev/so101/leader/021-leader-joint2-motor/" data-id="L-021" target="_blank" rel="noopener"><span>L-021</span>Slide motor 2 in from the top and fasten</a></li><li><a href="https://kitsmith.dev/so101/leader/022-leader-joint2-upper-arm/" data-id="L-022" target="_blank" rel="noopener"><span>L-022</span>Attach the upper arm to the motor 2 horns</a></li><li><a href="https://kitsmith.dev/so101/leader/030-leader-joint3-horns/" data-id="L-030" target="_blank" rel="noopener"><span>L-030</span>Fit both horns on motor 3 (elbow flex)</a></li><li><a href="https://kitsmith.dev/so101/leader/031-leader-joint3-motor/" data-id="L-031" target="_blank" rel="noopener"><span>L-031</span>Insert motor 3 into the upper arm</a></li><li><a href="https://kitsmith.dev/so101/leader/032-leader-joint3-forearm/" data-id="L-032" target="_blank" rel="noopener"><span>L-032</span>Connect the forearm to the motor 3 horns</a></li><li><a href="https://kitsmith.dev/so101/leader/040-leader-joint4-horns/" data-id="L-040" target="_blank" rel="noopener"><span>L-040</span>Fit both horns on motor 4 (wrist flex)</a></li><li><a href="https://kitsmith.dev/so101/leader/041-leader-joint4-motor-holder/" data-id="L-041" target="_blank" rel="noopener"><span>L-041</span>Slide motor holder 4 onto the forearm</a></li><li><a href="https://kitsmith.dev/so101/leader/042-leader-joint4-motor/" data-id="L-042" target="_blank" rel="noopener"><span>L-042</span>Slide in motor 4 and fasten</a></li><li><a href="https://kitsmith.dev/so101/leader/050-leader-joint5-motor/" data-id="L-050" target="_blank" rel="noopener"><span>L-050</span>Insert motor 5 into the wrist holder</a></li><li><a href="https://kitsmith.dev/so101/leader/051-leader-joint5-horn/" data-id="L-051" target="_blank" rel="noopener"><span>L-051</span>Fit one horn only on motor 5 (wrist roll)</a></li><li><a href="https://kitsmith.dev/so101/leader/052-leader-joint5-wrist-to-motor4/" data-id="L-052" target="_blank" rel="noopener"><span>L-052</span>Secure the wrist to the motor 4 horns</a></li><li><a href="https://kitsmith.dev/so101/leader/061-leader-handle/" data-id="L-061" target="_blank" rel="noopener"><span>L-061</span>Attach the handle to the leader holder</a></li><li><a href="https://kitsmith.dev/so101/leader/063-leader-trigger/" data-id="L-063" target="_blank" rel="noopener"><span>L-063</span>Attach the trigger</a></li><li><a href="https://kitsmith.dev/so101/leader/070-leader-controller-board/" data-id="L-070" target="_blank" rel="noopener"><span>L-070</span>Mount the controller board on its plate and fit it to the base</a></li><li><a href="https://kitsmith.dev/so101/leader/071-leader-daisy-chain/" data-id="L-071" target="_blank" rel="noopener"><span>L-071</span>Daisy-chain the motor cables and connect motor 1 to the board</a></li></ol></section></nav>
</div>
<p class="held">2 steps that no public source confirms yet (L-060, L-062) are left out here. They are on kitsmith.dev, flagged as unverified.</p>
<section aria-labelledby="pages-h">
<h2 id="pages-h">On each page of the guide</h2>
<ul class="shots">
<li>
<a
href="https://kitsmith.dev/so101/follower/071-follower-daisy-chain/"
target="_blank"
rel="noopener"
>
<img
src="shots/steps.webp"
width="430"
height="760"
loading="lazy"
decoding="async"
alt="Step F-071 on kitsmith.dev: a supply-voltage warning, three numbered instructions in plain words each with a src link, and a Done when check."
/>
<strong>Plain words, a source for each</strong>
<span
>Each step in plain English, the source behind every instruction, and a check that
tells you it's done.</span
>
</a>
</li>
<li>
<a href="https://kitsmith.dev/so101/servos/" target="_blank" rel="noopener">
<img
src="shots/servos.webp"
width="430"
height="760"
loading="lazy"
decoding="async"
alt="The servo table on kitsmith.dev: motor ID, joint, and the gear ratio and product code for the follower and leader arms."
/>
<strong>Which motor goes where</strong>
<span
>Motor ID, gear ratio and product code for each of the six joints, both arms.</span
>
</a>
</li>
<li>
<a
href="https://kitsmith.dev/so101/troubleshooting/wrist-roll-servo-cable-torn/"
target="_blank"
rel="noopener"
>
<img
src="shots/issue.webp"
width="430"
height="760"
loading="lazy"
decoding="async"
alt="A troubleshooting page on kitsmith.dev: the symptoms to recognise it, then the fix as ordered steps."
/>
<strong>Stuck? Start from what you see</strong>
<span>Troubleshooting pages go from the symptoms to the fix and why it happens.</span>
</a>
</li>
<li>
<a
href="https://kitsmith.dev/so101/follower/032-follower-joint3-forearm/"
target="_blank"
rel="noopener"
>
<img
src="shots/need.webp"
width="430"
height="760"
loading="lazy"
decoding="async"
alt="Step F-032 on kitsmith.dev: the motor for the joint with its gear ratio, then the parts, screws and tools the step uses."
/>
<strong>Everything the step uses</strong>
<span
>The motor for that joint, and the parts, screws and tools you need for it.</span
>
</a>
</li>
</ul>
</section>
<h2>The full guide</h2>
<p>
52 steps across the follower and leader arms. Every fact links to its public source.
</p>
<ul class="links">
<li><a href="https://kitsmith.dev/so101/" target="_blank" rel="noopener">Start the guide</a></li>
<li>
<a href="https://kitsmith.dev/so101/servos/" target="_blank" rel="noopener"
>Servo and gear ratio at each joint</a
>
</li>
<li><a href="https://kitsmith.dev/so101/kits/" target="_blank" rel="noopener">Kit part numbers</a></li>
<li>
<a href="https://kitsmith.dev/so101/troubleshooting/" target="_blank" rel="noopener"
>Troubleshooting</a
>
</li>
<li>
<a
href="https://github.com/Guillaume-Georges/so101-assembly-guide"
target="_blank"
rel="noopener"
>Source and data on GitHub</a
>
(MIT)
</li>
</ul>
<footer>
SO-101 design by
<a href="https://github.com/TheRobotStudio/SO-ARM100" target="_blank" rel="noopener"
>TheRobotStudio</a
>
(Apache-2.0). Community project, not affiliated with Hugging Face, TheRobotStudio or any kit
vendor.
</footer>
</main>
<script type="application/json" id="steps-data">
[{"id":"F-001","assembly":"follower","title":"Remove support material from all printed parts","meta":"F-001 · Follower arm · step 1 of 26","page":"https://kitsmith.dev/so101/follower/001-follower-clean-printed-parts/","embed":"https://kitsmith.dev/so101/embed/follower/001-follower-clean-printed-parts/"},{"id":"F-002","assembly":"follower","title":"Set motor IDs 1–6 and baud rate before assembly","meta":"F-002 · Follower arm · step 2 of 26","page":"https://kitsmith.dev/so101/follower/002-follower-set-servo-ids/","embed":"https://kitsmith.dev/so101/embed/follower/002-follower-set-servo-ids/"},{"id":"F-003","assembly":"follower","title":"Plug one 3-pin cable into each motor before building","meta":"F-003 · Follower arm · step 3 of 26","page":"https://kitsmith.dev/so101/follower/003-follower-preinstall-cables/","embed":"https://kitsmith.dev/so101/embed/follower/003-follower-preinstall-cables/"},{"id":"F-010","assembly":"follower","title":"Fit both horns on motor 1 (shoulder pan)","meta":"F-010 · Follower arm · step 4 of 26","page":"https://kitsmith.dev/so101/follower/010-follower-joint1-horns/","embed":"https://kitsmith.dev/so101/embed/follower/010-follower-joint1-horns/"},{"id":"F-011","assembly":"follower","title":"Seat motor 1 in the base","meta":"F-011 · Follower arm · step 5 of 26","page":"https://kitsmith.dev/so101/follower/011-follower-joint1-motor-into-base/","embed":"https://kitsmith.dev/so101/embed/follower/011-follower-joint1-motor-into-base/"},{"id":"F-012","assembly":"follower","title":"Slide the first motor holder over motor 1","meta":"F-012 · Follower arm · step 6 of 26","page":"https://kitsmith.dev/so101/follower/012-follower-joint1-motor-holder/","embed":"https://kitsmith.dev/so101/embed/follower/012-follower-joint1-motor-holder/"},{"id":"F-013","assembly":"follower","title":"Attach the shoulder to the motor 1 horns","meta":"F-013 · Follower arm · step 7 of 26","page":"https://kitsmith.dev/so101/follower/013-follower-joint1-shoulder/","embed":"https://kitsmith.dev/so101/embed/follower/013-follower-joint1-shoulder/"},{"id":"F-014","assembly":"follower","title":"Add the shoulder motor holder","meta":"F-014 · Follower arm · step 8 of 26","page":"https://kitsmith.dev/so101/follower/014-follower-joint1-shoulder-motor-holder/","embed":"https://kitsmith.dev/so101/embed/follower/014-follower-joint1-shoulder-motor-holder/"},{"id":"F-020","assembly":"follower","title":"Fit both horns on motor 2 (shoulder lift)","meta":"F-020 · Follower arm · step 9 of 26","page":"https://kitsmith.dev/so101/follower/020-follower-joint2-horns/","embed":"https://kitsmith.dev/so101/embed/follower/020-follower-joint2-horns/"},{"id":"F-021","assembly":"follower","title":"Slide motor 2 in from the top and fasten","meta":"F-021 · Follower arm · step 10 of 26","page":"https://kitsmith.dev/so101/follower/021-follower-joint2-motor/","embed":"https://kitsmith.dev/so101/embed/follower/021-follower-joint2-motor/"},{"id":"F-022","assembly":"follower","title":"Attach the upper arm to the motor 2 horns","meta":"F-022 · Follower arm · step 11 of 26","page":"https://kitsmith.dev/so101/follower/022-follower-joint2-upper-arm/","embed":"https://kitsmith.dev/so101/embed/follower/022-follower-joint2-upper-arm/"},{"id":"F-030","assembly":"follower","title":"Fit both horns on motor 3 (elbow flex)","meta":"F-030 · Follower arm · step 12 of 26","page":"https://kitsmith.dev/so101/follower/030-follower-joint3-horns/","embed":"https://kitsmith.dev/so101/embed/follower/030-follower-joint3-horns/"},{"id":"F-031","assembly":"follower","title":"Insert motor 3 into the upper arm","meta":"F-031 · Follower arm · step 13 of 26","page":"https://kitsmith.dev/so101/follower/031-follower-joint3-motor/","embed":"https://kitsmith.dev/so101/embed/follower/031-follower-joint3-motor/"},{"id":"F-032","assembly":"follower","title":"Connect the forearm to the motor 3 horns","meta":"F-032 · Follower arm · step 14 of 26","page":"https://kitsmith.dev/so101/follower/032-follower-joint3-forearm/","embed":"https://kitsmith.dev/so101/embed/follower/032-follower-joint3-forearm/"},{"id":"F-040","assembly":"follower","title":"Fit both horns on motor 4 (wrist flex)","meta":"F-040 · Follower arm · step 15 of 26","page":"https://kitsmith.dev/so101/follower/040-follower-joint4-horns/","embed":"https://kitsmith.dev/so101/embed/follower/040-follower-joint4-horns/"},{"id":"F-041","assembly":"follower","title":"Slide motor holder 4 onto the forearm","meta":"F-041 · Follower arm · step 16 of 26","page":"https://kitsmith.dev/so101/follower/041-follower-joint4-motor-holder/","embed":"https://kitsmith.dev/so101/embed/follower/041-follower-joint4-motor-holder/"},{"id":"F-042","assembly":"follower","title":"Slide in motor 4 and fasten","meta":"F-042 · Follower arm · step 17 of 26","page":"https://kitsmith.dev/so101/follower/042-follower-joint4-motor/","embed":"https://kitsmith.dev/so101/embed/follower/042-follower-joint4-motor/"},{"id":"F-050","assembly":"follower","title":"Insert motor 5 into the wrist holder","meta":"F-050 · Follower arm · step 18 of 26","page":"https://kitsmith.dev/so101/follower/050-follower-joint5-motor/","embed":"https://kitsmith.dev/so101/embed/follower/050-follower-joint5-motor/"},{"id":"F-051","assembly":"follower","title":"Fit one horn only on motor 5 (wrist roll)","meta":"F-051 · Follower arm · step 19 of 26","page":"https://kitsmith.dev/so101/follower/051-follower-joint5-horn/","embed":"https://kitsmith.dev/so101/embed/follower/051-follower-joint5-horn/"},{"id":"F-052","assembly":"follower","title":"Secure the wrist to the motor 4 horns","meta":"F-052 · Follower arm · step 20 of 26","page":"https://kitsmith.dev/so101/follower/052-follower-joint5-wrist-to-motor4/","embed":"https://kitsmith.dev/so101/embed/follower/052-follower-joint5-wrist-to-motor4/"},{"id":"F-060","assembly":"follower","title":"Attach the gripper body to the motor 5 horn","meta":"F-060 · Follower arm · step 21 of 26","page":"https://kitsmith.dev/so101/follower/060-follower-gripper-body/","embed":"https://kitsmith.dev/so101/embed/follower/060-follower-gripper-body/"},{"id":"F-061","assembly":"follower","title":"Insert the gripper motor","meta":"F-061 · Follower arm · step 22 of 26","page":"https://kitsmith.dev/so101/follower/061-follower-gripper-motor/","embed":"https://kitsmith.dev/so101/embed/follower/061-follower-gripper-motor/"},{"id":"F-062","assembly":"follower","title":"Fit both horns on the gripper motor","meta":"F-062 · Follower arm · step 23 of 26","page":"https://kitsmith.dev/so101/follower/062-follower-gripper-horns/","embed":"https://kitsmith.dev/so101/embed/follower/062-follower-gripper-horns/"},{"id":"F-063","assembly":"follower","title":"Install the gripper claw","meta":"F-063 · Follower arm · step 24 of 26","page":"https://kitsmith.dev/so101/follower/063-follower-gripper-claw/","embed":"https://kitsmith.dev/so101/embed/follower/063-follower-gripper-claw/"},{"id":"F-070","assembly":"follower","title":"Mount the controller board on its plate and fit it to the base","meta":"F-070 · Follower arm · step 25 of 26","page":"https://kitsmith.dev/so101/follower/070-follower-controller-board/","embed":"https://kitsmith.dev/so101/embed/follower/070-follower-controller-board/"},{"id":"F-071","assembly":"follower","title":"Daisy-chain the motor cables and connect motor 1 to the board","meta":"F-071 · Follower arm · step 26 of 26","page":"https://kitsmith.dev/so101/follower/071-follower-daisy-chain/","embed":"https://kitsmith.dev/so101/embed/follower/071-follower-daisy-chain/"},{"id":"L-001","assembly":"leader","title":"Remove support material from all printed parts","meta":"L-001 · Leader arm · step 1 of 26","page":"https://kitsmith.dev/so101/leader/001-leader-clean-printed-parts/","embed":"https://kitsmith.dev/so101/embed/leader/001-leader-clean-printed-parts/"},{"id":"L-002","assembly":"leader","title":"Set motor IDs 1–6 and baud rate before assembly","meta":"L-002 · Leader arm · step 2 of 26","page":"https://kitsmith.dev/so101/leader/002-leader-set-servo-ids/","embed":"https://kitsmith.dev/so101/embed/leader/002-leader-set-servo-ids/"},{"id":"L-003","assembly":"leader","title":"Plug one 3-pin cable into each motor before building","meta":"L-003 · Leader arm · step 3 of 26","page":"https://kitsmith.dev/so101/leader/003-leader-preinstall-cables/","embed":"https://kitsmith.dev/so101/embed/leader/003-leader-preinstall-cables/"},{"id":"L-010","assembly":"leader","title":"Fit both horns on motor 1 (shoulder pan)","meta":"L-010 · Leader arm · step 4 of 26","page":"https://kitsmith.dev/so101/leader/010-leader-joint1-horns/","embed":"https://kitsmith.dev/so101/embed/leader/010-leader-joint1-horns/"},{"id":"L-011","assembly":"leader","title":"Seat motor 1 in the base","meta":"L-011 · Leader arm · step 5 of 26","page":"https://kitsmith.dev/so101/leader/011-leader-joint1-motor-into-base/","embed":"https://kitsmith.dev/so101/embed/leader/011-leader-joint1-motor-into-base/"},{"id":"L-012","assembly":"leader","title":"Slide the first motor holder over motor 1","meta":"L-012 · Leader arm · step 6 of 26","page":"https://kitsmith.dev/so101/leader/012-leader-joint1-motor-holder/","embed":"https://kitsmith.dev/so101/embed/leader/012-leader-joint1-motor-holder/"},{"id":"L-013","assembly":"leader","title":"Attach the shoulder to the motor 1 horns","meta":"L-013 · Leader arm · step 7 of 26","page":"https://kitsmith.dev/so101/leader/013-leader-joint1-shoulder/","embed":"https://kitsmith.dev/so101/embed/leader/013-leader-joint1-shoulder/"},{"id":"L-014","assembly":"leader","title":"Add the shoulder motor holder","meta":"L-014 · Leader arm · step 8 of 26","page":"https://kitsmith.dev/so101/leader/014-leader-joint1-shoulder-motor-holder/","embed":"https://kitsmith.dev/so101/embed/leader/014-leader-joint1-shoulder-motor-holder/"},{"id":"L-020","assembly":"leader","title":"Fit both horns on motor 2 (shoulder lift)","meta":"L-020 · Leader arm · step 9 of 26","page":"https://kitsmith.dev/so101/leader/020-leader-joint2-horns/","embed":"https://kitsmith.dev/so101/embed/leader/020-leader-joint2-horns/"},{"id":"L-021","assembly":"leader","title":"Slide motor 2 in from the top and fasten","meta":"L-021 · Leader arm · step 10 of 26","page":"https://kitsmith.dev/so101/leader/021-leader-joint2-motor/","embed":"https://kitsmith.dev/so101/embed/leader/021-leader-joint2-motor/"},{"id":"L-022","assembly":"leader","title":"Attach the upper arm to the motor 2 horns","meta":"L-022 · Leader arm · step 11 of 26","page":"https://kitsmith.dev/so101/leader/022-leader-joint2-upper-arm/","embed":"https://kitsmith.dev/so101/embed/leader/022-leader-joint2-upper-arm/"},{"id":"L-030","assembly":"leader","title":"Fit both horns on motor 3 (elbow flex)","meta":"L-030 · Leader arm · step 12 of 26","page":"https://kitsmith.dev/so101/leader/030-leader-joint3-horns/","embed":"https://kitsmith.dev/so101/embed/leader/030-leader-joint3-horns/"},{"id":"L-031","assembly":"leader","title":"Insert motor 3 into the upper arm","meta":"L-031 · Leader arm · step 13 of 26","page":"https://kitsmith.dev/so101/leader/031-leader-joint3-motor/","embed":"https://kitsmith.dev/so101/embed/leader/031-leader-joint3-motor/"},{"id":"L-032","assembly":"leader","title":"Connect the forearm to the motor 3 horns","meta":"L-032 · Leader arm · step 14 of 26","page":"https://kitsmith.dev/so101/leader/032-leader-joint3-forearm/","embed":"https://kitsmith.dev/so101/embed/leader/032-leader-joint3-forearm/"},{"id":"L-040","assembly":"leader","title":"Fit both horns on motor 4 (wrist flex)","meta":"L-040 · Leader arm · step 15 of 26","page":"https://kitsmith.dev/so101/leader/040-leader-joint4-horns/","embed":"https://kitsmith.dev/so101/embed/leader/040-leader-joint4-horns/"},{"id":"L-041","assembly":"leader","title":"Slide motor holder 4 onto the forearm","meta":"L-041 · Leader arm · step 16 of 26","page":"https://kitsmith.dev/so101/leader/041-leader-joint4-motor-holder/","embed":"https://kitsmith.dev/so101/embed/leader/041-leader-joint4-motor-holder/"},{"id":"L-042","assembly":"leader","title":"Slide in motor 4 and fasten","meta":"L-042 · Leader arm · step 17 of 26","page":"https://kitsmith.dev/so101/leader/042-leader-joint4-motor/","embed":"https://kitsmith.dev/so101/embed/leader/042-leader-joint4-motor/"},{"id":"L-050","assembly":"leader","title":"Insert motor 5 into the wrist holder","meta":"L-050 · Leader arm · step 18 of 26","page":"https://kitsmith.dev/so101/leader/050-leader-joint5-motor/","embed":"https://kitsmith.dev/so101/embed/leader/050-leader-joint5-motor/"},{"id":"L-051","assembly":"leader","title":"Fit one horn only on motor 5 (wrist roll)","meta":"L-051 · Leader arm · step 19 of 26","page":"https://kitsmith.dev/so101/leader/051-leader-joint5-horn/","embed":"https://kitsmith.dev/so101/embed/leader/051-leader-joint5-horn/"},{"id":"L-052","assembly":"leader","title":"Secure the wrist to the motor 4 horns","meta":"L-052 · Leader arm · step 20 of 26","page":"https://kitsmith.dev/so101/leader/052-leader-joint5-wrist-to-motor4/","embed":"https://kitsmith.dev/so101/embed/leader/052-leader-joint5-wrist-to-motor4/"},{"id":"L-061","assembly":"leader","title":"Attach the handle to the leader holder","meta":"L-061 · Leader arm · step 22 of 26","page":"https://kitsmith.dev/so101/leader/061-leader-handle/","embed":"https://kitsmith.dev/so101/embed/leader/061-leader-handle/"},{"id":"L-063","assembly":"leader","title":"Attach the trigger","meta":"L-063 · Leader arm · step 24 of 26","page":"https://kitsmith.dev/so101/leader/063-leader-trigger/","embed":"https://kitsmith.dev/so101/embed/leader/063-leader-trigger/"},{"id":"L-070","assembly":"leader","title":"Mount the controller board on its plate and fit it to the base","meta":"L-070 · Leader arm · step 25 of 26","page":"https://kitsmith.dev/so101/leader/070-leader-controller-board/","embed":"https://kitsmith.dev/so101/embed/leader/070-leader-controller-board/"},{"id":"L-071","assembly":"leader","title":"Daisy-chain the motor cables and connect motor 1 to the board","meta":"L-071 · Leader arm · step 26 of 26","page":"https://kitsmith.dev/so101/leader/071-leader-daisy-chain/","embed":"https://kitsmith.dev/so101/embed/leader/071-leader-daisy-chain/"}]
</script>
<script>
// Without this script every step link opens its kitsmith.dev page; with it, a click loads the
// step's 3D view in the frame instead (modifier-clicks still open the page).
const STEPS = JSON.parse(document.getElementById('steps-data').textContent);
const viewer = document.getElementById('viewer');
const cta = document.getElementById('cta');
const now = document.getElementById('now');
const nowTitle = document.getElementById('now-title');
const prev = document.getElementById('prev');
const next = document.getElementById('next');
const list = document.getElementById('steps');
const links = [...list.querySelectorAll('a[data-id]')];
let cur = 0;
function show(i) {
cur = i;
const s = STEPS[i];
viewer.src = s.embed;
viewer.title = `3D view of step ${s.id}, ${s.title}`;
now.textContent = s.meta;
nowTitle.textContent = s.title;
cta.href = s.page;
cta.textContent = `Open ${s.id} on kitsmith.dev: the full step with its check and sources ↗`;
prev.disabled = i === 0;
next.disabled = i === STEPS.length - 1;
for (const a of links) {
if (a.dataset.id === s.id) a.setAttribute('aria-current', 'step');
else a.removeAttribute('aria-current');
}
// Scroll only the list, never the page: inside huggingface.co's frame scrollIntoView can
// move the host page.
const a = links[i];
if (
a.offsetTop < list.scrollTop + 40 ||
a.offsetTop > list.scrollTop + list.clientHeight - 40
)
list.scrollTop = a.offsetTop - list.clientHeight / 2;
}
links.forEach((a, i) =>
a.addEventListener('click', (e) => {
if (e.metaKey || e.ctrlKey || e.shiftKey || e.button !== 0) return;
e.preventDefault();
show(i);
}),
);
const step = (delta) => show(Math.min(STEPS.length - 1, Math.max(0, cur + delta)));
prev.addEventListener('click', () => step(-1));
next.addEventListener('click', () => step(1));
// ← and → move a step too (asked for on Discord, 2026-09-17). Skipped while typing, with a
// modifier held, and inside the screenshot strip, where the arrows scroll it.
document.addEventListener('keydown', (e) => {
if (e.defaultPrevented || e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return;
const delta = e.key === 'ArrowLeft' ? -1 : e.key === 'ArrowRight' ? 1 : 0;
if (!delta) return;
const t = e.target;
if (t && t.closest && t.closest('input, textarea, select, [contenteditable], .shots'))
return;
e.preventDefault();
step(delta);
});
// The 3D frame relays the same keys when the focus is inside it (kitsmith.dev embed pages).
const origin = new URL('https://kitsmith.dev/so101').origin;
window.addEventListener('message', (e) => {
if (e.origin !== origin || !e.data || e.data.kitsmith !== 'step') return;
step(e.data.delta < 0 ? -1 : 1);
});
show(0);
</script>
</body>
</html>