Reachy-Mini-FAQ / index.html
Anne-Charlotte's picture
Update index.html
225490f verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Reachy Mini FAQ - Support & Documentation</title>
<meta name="description" content="Frequently asked questions about Reachy Mini robots - Beta, Lite, and Wireless versions. Get help with setup, SDK, hardware, and more.">
<link rel="stylesheet" href="style.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Archivo:wght@400;500;600&family=Asap:wght@400;700&family=Space+Mono:wght@700&display=swap" rel="stylesheet">
</head>
<body>
<div class="app-container">
<!-- Header -->
<header class="header">
<div class="header-content">
<div class="header-top">
<img src="reachy-mini-icon.png" alt="Reachy Mini" class="header-icon">
<div class="header-text">
<h1>Reachy Mini FAQ</h1>
<p class="subtitle">Your guide to getting started and beyond</p>
</div>
</div>
<div class="product-tabs">
<button class="product-tab beta active" data-product="beta">Beta</button>
<button class="product-tab lite" data-product="lite">Lite</button>
<button class="product-tab wireless" data-product="wireless">Wireless</button>
</div>
</div>
</header>
<!-- FAQ Content -->
<main class="faq-container" id="faq-container">
<!-- Search -->
<div class="search-container">
<svg class="search-icon" width="20" height="20" viewBox="0 0 20 20" fill="none">
<circle cx="9" cy="9" r="6" stroke="currentColor" stroke-width="2"/>
<path d="M14 14L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>
<input type="text" id="search-input" placeholder="Search FAQ..." class="search-input">
</div>
<!-- FAQ Sections -->
<div class="faq-sections" id="faq-sections">
<!-- Section 1: Getting Started -->
<section class="faq-section" data-section="getting-started">
<div class="section-header">
<div class="section-icon">🧭</div>
<h2>1. Getting Started</h2>
</div>
<!-- Subsection: SDK Basics -->
<div class="subsection">
<h3>1.1 General / SDK Basics</h3>
<div class="media-placeholder">
<span>Product overview image / GIF</span>
</div>
<details class="faq-item">
<summary>
<span class="question">How do I connect to Reachy Mini from Python?</span>
<div class="tags">
<span class="tag">SDK</span>
<span class="tag">PYTHON</span>
<span class="tag">START</span>
</div>
</summary>
<div class="answer">
<p>To control Reachy Mini, you mainly use the <code>ReachyMini</code> class from the <code>reachy_mini</code> package:</p>
<pre><code>from reachy_mini import ReachyMini
mini = ReachyMini()</code></pre>
<p>This connects to the Reachy Mini daemon (started via <code>reachy-mini-daemon</code> or <code>reachy_mini.daemon.app.main</code>) and initializes motors and sensors.</p>
<p><strong>Recommended pattern:</strong> use a context manager to automatically handle connection and cleanup:</p>
<pre><code>from reachy_mini import ReachyMini
with ReachyMini() as mini:
# your code here
...</code></pre>
<p class="source">Source: API documentation.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">Do I need to start the daemon manually?</span>
<div class="tags">
<span class="tag">SDK</span>
<span class="tag">START</span>
</div>
</summary>
<div class="answer">
<p>Yes. All examples assume you have already started the Reachy Mini daemon:</p>
<ul>
<li>Either via command line: <code>reachy-mini-daemon</code></li>
<li>Or via Python: <code>reachy_mini.daemon.app.main</code></li>
</ul>
<p>The <code>ReachyMini</code> instance will then connect to this daemon.</p>
<p class="source">Source: API documentation.</p>
</div>
</details>
</div>
<!-- Subsection: Assembly -->
<div class="subsection">
<h3>1.2 Assembly</h3>
<div class="media-placeholder">
<span>Assembly guide image / GIF</span>
</div>
<details class="faq-item">
<summary>
<span class="question">How long does assembly usually take?</span>
<div class="tags">
<span class="tag">ASSEMBLY</span>
<span class="tag">HARDWARE</span>
</div>
</summary>
<div class="answer">
<p>Most testers report <strong>1.5–2 hours</strong>, with some up to <strong>4 hours</strong> depending on experience.</p>
<p class="source">Source: Feedback – "What's your background?" = hobbyist / developer / experienced technology professional.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">What do testers consider an ideal assembly time?</span>
<div class="tags">
<span class="tag">ASSEMBLY</span>
</div>
</summary>
<div class="answer">
<p>Most testers consider <strong>about 2 hours</strong> to be an ideal assembly time.</p>
<p class="source">Source: Feedback – "What's your background?"</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">What were the trickiest parts of assembly?</span>
<div class="tags">
<span class="tag">ASSEMBLY</span>
<span class="tag">HARDWARE</span>
</div>
</summary>
<div class="answer">
<p>Testers highlighted:</p>
<ul>
<li>Cable routing</li>
<li>Correct torque on screws</li>
</ul>
<p class="source">Source: Feedback – "What's your background?"</p>
</div>
</details>
</div>
<!-- Subsection: Dashboard -->
<div class="subsection">
<h3>1.3 Dashboard & First Run</h3>
<details class="faq-item">
<summary>
<span class="question">The dashboard at http://localhost:8000 doesn't work β€” what should I check?</span>
<div class="tags">
<span class="tag">DASHBOARD</span>
<span class="tag">NETWORK</span>
<span class="tag">SDK</span>
</div>
</summary>
<div class="answer">
<p>Typical checks:</p>
<ol>
<li>You are using a proper Python virtual environment (<code>.venv</code>).</li>
<li>You installed/updated the Reachy Mini SDK inside that environment:
<pre><code>pip install -U reachy-mini</code></pre>
</li>
<li>The daemon is running.</li>
</ol>
<p>This combination fixed most dashboard issues.</p>
<p class="source">Source: Discord – author: <strong>matth_lap</strong> (trusted).</p>
</div>
</details>
</div>
</section>
<!-- Section 2: Using & Developing Applications -->
<section class="faq-section" data-section="applications">
<div class="section-header">
<div class="section-icon">🧩</div>
<h2>2. Using & Developing Applications</h2>
</div>
<!-- Subsection: Moving the robot -->
<div class="subsection">
<h3>2.1 Moving the Robot</h3>
<div class="media-placeholder">
<span>Robot movement demo GIF</span>
</div>
<details class="faq-item">
<summary>
<span class="question">How do I move Reachy Mini's head to a specific pose?</span>
<div class="tags">
<span class="tag">MOVEMENT</span>
<span class="tag">HEAD</span>
<span class="tag">SDK</span>
</div>
</summary>
<div class="answer">
<p>Use <code>goto_target</code> with a pose created by <code>create_head_pose</code>:</p>
<pre><code>from reachy_mini import ReachyMini
from reachy_mini.utils import create_head_pose
with ReachyMini() as mini:
mini.goto_target(head=create_head_pose(y=-10, mm=True))</code></pre>
<p>Here:</p>
<ul>
<li><code>create_head_pose</code> builds a 4x4 transform matrix (position + orientation).</li>
<li><code>mm=True</code> means translation arguments are in millimeters.</li>
<li>The <code>head</code> frame is located at the base of the head.</li>
</ul>
<p class="source">Source: API documentation.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">How do I control head orientation (roll, pitch, yaw)?</span>
<div class="tags">
<span class="tag">MOVEMENT</span>
<span class="tag">HEAD</span>
</div>
</summary>
<div class="answer">
<p>You can add orientation arguments to <code>create_head_pose</code>, for example:</p>
<pre><code>pose = create_head_pose(z=10, roll=15, degrees=True, mm=True)
mini.goto_target(head=pose, duration=2.0)</code></pre>
<ul>
<li><code>degrees=True</code> β‡’ angles are given in degrees.</li>
<li>You can combine translation (x, y, z) and orientation (roll, pitch, yaw).</li>
</ul>
<p class="source">Source: API documentation.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">How do I move head, body, and antennas at the same time?</span>
<div class="tags">
<span class="tag">MOVEMENT</span>
<span class="tag">HEAD</span>
<span class="tag">ANTENNAS</span>
<span class="tag">BODY</span>
</div>
</summary>
<div class="answer">
<p>Use <code>goto_target</code> with multiple named arguments:</p>
<pre><code>import numpy as np
from reachy_mini import ReachyMini
from reachy_mini.utils import create_head_pose
with ReachyMini() as mini:
mini.goto_target(
head=create_head_pose(y=-10, mm=True),
antennas=np.deg2rad([45, 45]),
duration=2.0,
body_yaw=np.deg2rad(30),
)</code></pre>
<ul>
<li><code>antennas</code> is a 2-element array in radians [right, left].</li>
<li><code>body_yaw</code> controls body rotation.</li>
</ul>
<p class="source">Source: API documentation.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">What's the difference between goto_target and set_target?</span>
<div class="tags">
<span class="tag">MOVEMENT</span>
<span class="tag">CONTROL</span>
<span class="tag">REALTIME</span>
</div>
</summary>
<div class="answer">
<p><strong>goto_target:</strong></p>
<ul>
<li>Interpolates motion over a duration (default 0.5s).</li>
<li>Supports different interpolation methods (<code>linear</code>, <code>minjerk</code>, <code>ease</code>, <code>cartoon</code>).</li>
<li>Ideal for smooth, timed motions.</li>
</ul>
<p><strong>set_target:</strong></p>
<ul>
<li>Sets the target immediately, without interpolation.</li>
<li>Suited for high-frequency control (e.g. sinusoidal trajectories, teleoperation).</li>
</ul>
<p>Example (sinusoidal motion):</p>
<pre><code>y = 10 * np.sin(2 * np.pi * 0.5 * t)
mini.set_target(head=create_head_pose(y=y, mm=True))</code></pre>
<p class="source">Source: API documentation.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">How do I choose the interpolation method for movements?</span>
<div class="tags">
<span class="tag">MOVEMENT</span>
<span class="tag">INTERPOLATION</span>
</div>
</summary>
<div class="answer">
<p>Use the <code>method</code> argument in <code>goto_target</code>:</p>
<pre><code>mini.goto_target(
head=create_head_pose(y=10, mm=True),
antennas=np.deg2rad([-45, -45]),
duration=2.0,
method="cartoon", # "linear", "minjerk", "ease", or "cartoon"
)</code></pre>
<p>For a visual comparison of methods, you can run the example:</p>
<ul>
<li><code>examples/goto_interpolation_playground.py</code></li>
</ul>
<p class="source">Source: API documentation.</p>
</div>
</details>
</div>
<!-- Subsection: Writing Apps -->
<div class="subsection">
<h3>2.2 Writing & Sharing Apps</h3>
<details class="faq-item">
<summary>
<span class="question">How do I write a Reachy Mini app?</span>
<div class="tags">
<span class="tag">APPS</span>
<span class="tag">SDK</span>
<span class="tag">PROGRAMMING</span>
</div>
</summary>
<div class="answer">
<p>Inherit from <code>ReachyMiniApp</code> and implement <code>run</code>:</p>
<pre><code>import threading
from reachy_mini.apps.app import ReachyMiniApp
from reachy_mini import ReachyMini
class MyApp(ReachyMiniApp):
def run(self, reachy_mini: ReachyMini, stop_event: threading.Event):
# your app logic
...</code></pre>
<ul>
<li><code>stop_event</code> tells you when the app should stop.</li>
<li>This pattern is used for standalone apps and for HF Spaces.</li>
</ul>
<p class="source">Source: API documentation.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">How can I generate a new app template quickly?</span>
<div class="tags">
<span class="tag">APPS</span>
<span class="tag">TOOLING</span>
</div>
</summary>
<div class="answer">
<p>Use the app template generator:</p>
<pre><code>reachy-mini-make-app my_app_name</code></pre>
<p>This creates:</p>
<pre><code>my_app_name/
β”œβ”€β”€ pyproject.toml
β”œβ”€β”€ README.md
β”œβ”€β”€ my_app_name/
β”‚ β”œβ”€β”€ __init__.py
β”‚ └── main.py</code></pre>
<p>You can run it via:</p>
<pre><code>python my_app_name/main.py</code></pre>
<p>Or install it as a package:</p>
<pre><code>pip install -e my_app_name/</code></pre>
<p class="source">Source: API documentation.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">Is there a recommended way to share apps with the community?</span>
<div class="tags">
<span class="tag">APPS</span>
<span class="tag">COMMUNITY</span>
<span class="tag">CONTRIBUTING</span>
</div>
</summary>
<div class="answer">
<p>Yes, via <strong>Hugging Face Spaces</strong>:</p>
<ul>
<li>Example hub: <em>Reachy Mini Apps</em></li>
<li>Official example space: <em>reachy_mini_app_example</em></li>
</ul>
<p class="source">Source: API documentation + Discord – author: <strong>annecharlotte_pollen</strong> (trusted).</p>
</div>
</details>
</div>
<!-- Subsection: Playing Moves -->
<div class="subsection">
<h3>2.3 Playing Recorded Moves</h3>
<div class="media-placeholder">
<span>Dance / emotion demo GIF</span>
</div>
<details class="faq-item">
<summary>
<span class="question">How do I play predefined moves?</span>
<div class="tags">
<span class="tag">MOVEMENT</span>
<span class="tag">DATASET</span>
<span class="tag">PLAYBACK</span>
</div>
</summary>
<div class="answer">
<p>Use <code>RecordedMoves</code> and <code>play_move</code>:</p>
<pre><code>from reachy_mini import ReachyMini
from reachy_mini.motion.recorded_move import RecordedMoves
with ReachyMini() as mini:
recorded_moves = RecordedMoves("pollen-robotics/reachy-mini-dances-library")
for move_name in recorded_moves.list_moves():
mini.play_move(recorded_moves.get(move_name), initial_goto_duration=1.0)</code></pre>
<ul>
<li><code>initial_goto_duration</code> smoothly brings the robot to the starting pose of the move.</li>
<li>Datasets are hosted on Hugging Face (e.g. emotions / dances libraries).</li>
</ul>
<p class="source">Source: API documentation.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">How do I record my own moves for later replay?</span>
<div class="tags">
<span class="tag">MOVEMENT</span>
<span class="tag">RECORDING</span>
<span class="tag">TELEOP</span>
</div>
</summary>
<div class="answer">
<p>Call <code>start_recording()</code> and <code>stop_recording()</code>, which record all <code>set_target</code> calls:</p>
<pre><code>with ReachyMini() as mini:
mini.start_recording()
# run your teleop / control code...
recorded_motion = mini.stop_recording()</code></pre>
<p>You can then unpack <code>time</code>, <code>head</code>, <code>antennas</code>, <code>body_yaw</code> from each frame and save them.</p>
<p>Tools to record/upload datasets are available in:</p>
<ul>
<li><code>reachy_mini_toolbox/tools/moves</code></li>
</ul>
<p class="source">Source: API documentation.</p>
</div>
</details>
</div>
</section>
<!-- Section 3: Hardware Guide -->
<section class="faq-section" data-section="hardware">
<div class="section-header">
<div class="section-icon">πŸŽ›</div>
<h2>3. Hardware Guide & Motion Limits</h2>
</div>
<div class="media-placeholder">
<span>Motion limits diagram</span>
</div>
<details class="faq-item">
<summary>
<span class="question">What are the safety limits of the head and body?</span>
<div class="tags">
<span class="tag">MOTORS</span>
<span class="tag">LIMITS</span>
<span class="tag">SAFETY</span>
</div>
</summary>
<div class="answer">
<p>Physical & software limits include:</p>
<ol>
<li>Motors have limited range of motion.</li>
<li>Head can collide with the body.</li>
<li>Body yaw: <code>[-180Β°, 180Β°]</code>.</li>
<li>Head pitch/roll: <code>[-40Β°, 40Β°]</code>.</li>
<li>Head yaw: <code>[-180Β°, 180Β°]</code>.</li>
<li>Difference (body_yaw - head_yaw): <code>[-65Β°, 65Β°]</code>.</li>
</ol>
<p>If you command a pose outside these limits, Reachy Mini will automatically clamp to the nearest safe pose (no exception is raised).</p>
<p class="source">Source: API documentation.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">What happens if I ask for an impossible pose (beyond limits)?</span>
<div class="tags">
<span class="tag">MOTORS</span>
<span class="tag">LIMITS</span>
</div>
</summary>
<div class="answer">
<p>Example:</p>
<pre><code>reachy.goto_target(head=create_head_pose(roll=-50, degrees=True))</code></pre>
<ul>
<li>This exceeds the roll limit (Β±40Β°).</li>
<li>The robot will <strong>not</strong> throw an error but will move to the closest safe pose.</li>
</ul>
<p>You can inspect the actual pose using:</p>
<pre><code>head_pose = reachy.get_current_head_pose()</code></pre>
<p class="source">Source: API documentation.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">Are power supply specs documented in the API docs?</span>
<div class="tags">
<span class="tag">POWER</span>
<span class="tag">HARDWARE</span>
</div>
</summary>
<div class="answer">
<p>No, the API documentation does not specify the exact power supply specs (voltage, current). This was also requested in the Discord chat but not answered there.</p>
<p class="source">Source: [NO DIRECT DATA in API docs] + Discord question with no official answer.</p>
</div>
</details>
</section>
<!-- Section 4: Sensors & Media -->
<section class="faq-section" data-section="sensors">
<div class="section-header">
<div class="section-icon">🧠</div>
<h2>4. Sensors & Media</h2>
</div>
<div class="subsection">
<h3>4.1 Camera</h3>
<details class="faq-item">
<summary>
<span class="question">How do I grab camera frames from Reachy Mini?</span>
<div class="tags">
<span class="tag">VISION</span>
<span class="tag">CAMERA</span>
<span class="tag">MEDIA</span>
</div>
</summary>
<div class="answer">
<p>Use the <code>media</code> object:</p>
<pre><code>from reachy_mini import ReachyMini
with ReachyMini() as mini:
frame = mini.media.get_frame()
# frame is a numpy array as returned by OpenCV</code></pre>
<p class="source">Source: API documentation.</p>
</div>
</details>
</div>
<div class="subsection">
<h3>4.2 Microphone</h3>
<details class="faq-item">
<summary>
<span class="question">How do I access microphone audio samples?</span>
<div class="tags">
<span class="tag">AUDIO</span>
<span class="tag">MEDIA</span>
</div>
</summary>
<div class="answer">
<pre><code>from reachy_mini import ReachyMini
with ReachyMini() as mini:
sample = mini.media.get_audio_sample()
# sample is a numpy array as output by sounddevice</code></pre>
<p class="source">Source: API documentation.</p>
</div>
</details>
</div>
<div class="subsection">
<h3>4.3 Speaker</h3>
<details class="faq-item">
<summary>
<span class="question">How do I send audio to the speaker?</span>
<div class="tags">
<span class="tag">AUDIO</span>
<span class="tag">MEDIA</span>
</div>
</summary>
<div class="answer">
<pre><code>from reachy_mini import ReachyMini
with ReachyMini() as mini:
mini.media.push_audio_sample(chunk) # chunk = numpy array of audio samples</code></pre>
<p class="source">Source: API documentation.</p>
</div>
</details>
</div>
<div class="subsection">
<h3>4.4 GStreamer Backend</h3>
<details class="faq-item">
<summary>
<span class="question">How can I use the GStreamer backend instead of the default OpenCV/sounddevice?</span>
<div class="tags">
<span class="tag">AUDIO</span>
<span class="tag">VIDEO</span>
<span class="tag">GSTREAMER</span>
<span class="tag">ADVANCED</span>
</div>
</summary>
<div class="answer">
<p>Install with the GStreamer extra:</p>
<pre><code>pip install -e ".[gstreamer]"</code></pre>
<p>Then run examples with:</p>
<ul>
<li><code>--backend gstreamer</code></li>
</ul>
<p>You need GStreamer binaries properly installed on your system. You can also define custom pipelines (see <code>camera_gstreamer.py</code> in the repo).</p>
<p class="source">Source: API documentation.</p>
</div>
</details>
</div>
</section>
<!-- Section 5: Interaction Features -->
<section class="faq-section" data-section="interaction">
<div class="section-header">
<div class="section-icon">πŸ‘€</div>
<h2>5. Interaction Features</h2>
</div>
<div class="media-placeholder">
<span>Look-at feature demo GIF</span>
</div>
<details class="faq-item">
<summary>
<span class="question">How can I make Reachy Mini look at a point in the image?</span>
<div class="tags">
<span class="tag">VISION</span>
<span class="tag">LOOK_AT_IMAGE</span>
</div>
</summary>
<div class="answer">
<p>Use the <code>look_at_image</code> method (see example <code>look_at_image.py</code>):</p>
<ul>
<li>Provide a 2D point in image coordinates (0,0 = top-left).</li>
<li>You can specify a duration, similar to <code>goto_target</code>.</li>
</ul>
<p class="source">Source: API documentation.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">How can I make Reachy Mini look at a 3D point in the world?</span>
<div class="tags">
<span class="tag">VISION</span>
<span class="tag">LOOK_AT_WORLD</span>
</div>
</summary>
<div class="answer">
<p>Use <code>look_at_world</code>, which accepts 3D coordinates in the robot world frame (see world frame illustration in docs).</p>
<p class="source">Source: API documentation.</p>
</div>
</details>
</section>
<!-- Section 6: Motors & Compliancy -->
<section class="faq-section" data-section="motors">
<div class="section-header">
<div class="section-icon">🦴</div>
<h2>6. Motors, Compliancy & Manual Manipulation</h2>
</div>
<details class="faq-item">
<summary>
<span class="question">How do I enable, disable, or make motors compliant?</span>
<div class="tags">
<span class="tag">MOTORS</span>
<span class="tag">COMPLIANCY</span>
<span class="tag">SAFETY</span>
</div>
</summary>
<div class="answer">
<p>Three main methods:</p>
<ol>
<li><strong><code>enable_motors</code></strong>
<ul>
<li>Powers motors ON.</li>
<li>Robot holds position, cannot be moved by hand.</li>
</ul>
</li>
<li><strong><code>disable_motors</code></strong>
<ul>
<li>Powers motors OFF.</li>
<li>Robot is limp; you can move it freely by hand.</li>
</ul>
</li>
<li><strong><code>make_motors_compliant</code></strong>
<ul>
<li>Motors ON but compliant (soft).</li>
<li>Good for demonstrations or teaching-by-demonstration.</li>
<li>Used in the "gravity compensation" example.</li>
</ul>
</li>
</ol>
<p class="source">Source: API documentation.</p>
</div>
</details>
</section>
<!-- Section 7: Software Setup -->
<section class="faq-section" data-section="software">
<div class="section-header">
<div class="section-icon">πŸ§ͺ</div>
<h2>7. Software Setup & Environment</h2>
</div>
<details class="faq-item">
<summary>
<span class="question">Why do examples assume a virtual environment?</span>
<div class="tags">
<span class="tag">SDK</span>
<span class="tag">PYTHON</span>
<span class="tag">ENVIRONMENT</span>
</div>
</summary>
<div class="answer">
<p>While not strictly required, using a virtual environment:</p>
<ul>
<li>Avoids dependency conflicts.</li>
<li>Makes upgrading the SDK (<code>pip install -U reachy-mini</code>) safer.</li>
</ul>
<p>This pattern is also used by beta testers who had fewer installation issues inside a <code>.venv</code>.</p>
<p class="source">Source: API documentation (implicit) + Discord – author: <strong>matth_lap</strong>.</p>
</div>
</details>
</section>
<!-- Section 8: Customization -->
<section class="faq-section" data-section="customization">
<div class="section-header">
<div class="section-icon">🎨</div>
<h2>8. Customization & CAD</h2>
</div>
<details class="faq-item">
<summary>
<span class="question">Are CAD files mentioned in the API documentation?</span>
<div class="tags">
<span class="tag">CAD</span>
<span class="tag">3D_PRINTING</span>
</div>
</summary>
<div class="answer">
<p>The API documentation doesn't mention CAD files directly. Some testers requested them; no official link was provided in the logs.</p>
<p class="source">Source: [NO DIRECT DATA in API docs] + Feedback / Discord.</p>
</div>
</details>
</section>
<!-- Section 9: Contributing -->
<section class="faq-section" data-section="contributing">
<div class="section-header">
<div class="section-icon">🀝</div>
<h2>9. Contributing & Community</h2>
</div>
<details class="faq-item">
<summary>
<span class="question">How can I share my app with other users?</span>
<div class="tags">
<span class="tag">APPS</span>
<span class="tag">COMMUNITY</span>
<span class="tag">CONTRIBUTING</span>
</div>
</summary>
<div class="answer">
<p>Recommended workflow:</p>
<ul>
<li>Wrap your behavior in a <code>ReachyMiniApp</code>.</li>
<li>Publish as a HF Space or Python package.</li>
<li>Look at the official example space <em>reachy_mini_app_example</em>.</li>
</ul>
<p class="source">Source: API documentation + Discord – author: <strong>annecharlotte_pollen</strong>.</p>
</div>
</details>
<details class="faq-item">
<summary>
<span class="question">How can I contribute to datasets of moves (dances/emotions)?</span>
<div class="tags">
<span class="tag">DATASET</span>
<span class="tag">CONTRIBUTING</span>
<span class="tag">MOVEMENT</span>
</div>
</summary>
<div class="answer">
<p>Use the tools in:</p>
<ul>
<li><code>reachy_mini_toolbox/tools/moves</code></li>
</ul>
<p>They help you:</p>
<ul>
<li>Record moves (via <code>start_recording</code> / <code>stop_recording</code>)</li>
<li>Upload them to the Hugging Face Hub for reuse by others.</li>
</ul>
<p class="source">Source: API documentation.</p>
</div>
</details>
</section>
</div>
</main>
<!-- Footer -->
<footer class="footer">
<p>Reachy Mini FAQ β€’ <span id="footer-year">2024</span></p>
</footer>
</div>
<script src="script.js"></script>
</body>
</html>