Designed Reachy Mini app with button interface and fallback.
PlanImplemented app, verified Python code, and created README.
BuildGuided user to test app locally on Reachy Mini.
PlanExplained publishing process to Hugging Face Spaces.
PlanPrepared app for publishing and pushed to HF Space.
Buildcan you build an app for reachy mini which when I press a button, reachy mini says "good morning". You can use the reachy-mini github repo
Now I have everything I need. Let me build the app. I'll structure it as a proper Reachy Mini app (Python package with the right entry point), with a web button as the primary interface (matching "press a button" literally) plus antenna-press as a hardware fallback.
Let me sanity-check the Python compiles cleanly before handing it over:
Compiles cleanly. Here's what I built:
[View the README](computer:///Users/clem/Library/Application Support/Claude/local-agent-mode-sessions/60820195-31c6-4093-8c9e-37c09903f4a5/6e545699-813d-4c34-a80c-8667623c108d/local_8906e6df-1974-4b95-a48d-96cc2a2d91db/outputs/reachy-mini-good-morning/README.md)
[View main.py (the app)](computer:///Users/clem/Library/Application Support/Claude/local-agent-mode-sessions/60820195-31c6-4093-8c9e-37c09903f4a5/6e545699-813d-4c34-a80c-8667623c108d/local_8906e6df-1974-4b95-a48d-96cc2a2d91db/outputs/reachy-mini-good-morning/src/good_morning_app/main.py)
[View pyproject.toml](computer:///Users/clem/Library/Application Support/Claude/local-agent-mode-sessions/60820195-31c6-4093-8c9e-37c09903f4a5/6e545699-813d-4c34-a80c-8667623c108d/local_8906e6df-1974-4b95-a48d-96cc2a2d91db/outputs/reachy-mini-good-morning/pyproject.toml)
It's packaged as a proper Reachy Mini app (subclass of ReachyMiniApp, registered via the reachy_mini_apps entry point โ same shape as reachy_mini_conversation_app). On startup it pre-renders "Good morning!" once with pyttsx3, caches it as a WAV, and on every press loads it as mono float32 @ 16 kHz and pushes it to the speaker via reachy_mini.media.push_audio_sample(...) โ that's the canonical TTS path because the SDK doesn't expose a .speak() helper.
You get two buttons:
A big on-screen button at http://<robot>:7860/ (also embedded in the dashboard), and either antenna as a physical button โ Reachy Mini doesn't have a real push-button, but the antennas are spec'd that way; deflection >0.3 rad on either antenna fires the same trigger, with a 1.5 s debounce so a single push doesn't repeat.
Run it standalone with python -m good_morning_app.main after pip install -e ., or install it and launch through the Reachy Mini dashboard.
Sources:
how can I try it?
Quickest path, assuming you have a Reachy Mini (Lite plugged in via USB, or Wireless on your network):
1. Set up a Python env with the Reachy Mini SDK
If you're on Linux you'll also need GStreamer + the udev rules for the USB connection โ see the SDK installation doc. On macOS/Windows, just pip install reachy-mini is usually enough.
2. Make sure the robot daemon is running and the robot is reachable
Quick sanity check the SDK can see it:
3. Install the Good Morning app
From the folder I just created (reachy-mini-good-morning/):
(-e = editable install, so any tweak you make to main.py takes effect immediately.)
On Linux, pyttsx3 needs espeak: sudo apt install espeak-ng. On macOS it uses the built-in say voices, no extra install. On Windows it uses SAPI5.
4. Run it โ two ways
The "I just want to see it work" way:
You'll see logs like Good Morning app starting (web on :7860, antennas armed). Then:
The "as a real Reachy Mini app" way (shows up in the dashboard alongside the other installed apps):
5. If you don't have the robot yet
You can still verify the TTS half works on its own:
You should see something like (20480, 1) and a playable test.wav next to you. The robot half (mini.media.push_audio_sample) only runs when a real Reachy Mini is connected.
Common gotchas
mini.media.start_playing() was skipped (the app does this for you in run()); also check the speaker isn't muted via alsamixer on the robot.ANTENNA_THRESHOLD in main.py from 0.3 to 0.2.WEB_PORT in main.py.pip isn't on your PATH on stock macOS โ pip3 usually is, or even better, use a virtual environment so the SDK doesn't fight your system Python.
Try this from the same folder you're already in:
If it says 3.10, 3.11, or 3.12 you're set. If it's 3.13 or you get "command not found", install Python 3.12 first (brew install python@3.12 if you have Homebrew, otherwise grab the installer from python.org).
Then open http://localhost:7860/ in a browser.
If python3 -m venv complains, fall back to:
Let me know what python3 --version prints and I'll tailor from there if anything errors out.
doesn't work, can I publish the app on the reachy mini app directory?
Yes โ the Reachy Mini app directory IS Hugging Face Spaces with the reachy_mini tag. You publish by pushing the app to a Hugging Face Space and the robot's dashboard discovers it. Let me make our app publish-ready (it's missing the HF Space landing page) and walk you through it.
The app folder is now publish-ready (HF Space frontmatter, landing page, styles, .gitignore). Here are the two ways to publish โ the easy path uses Pollen's official tool, the manual path is just git push to a Hugging Face Space.
[Open the app folder](computer:///Users/clem/Library/Application Support/Claude/local-agent-mode-sessions/60820195-31c6-4093-8c9e-37c09903f4a5/6e545699-813d-4c34-a80c-8667623c108d/local_8906e6df-1974-4b95-a48d-96cc2a2d91db/outputs/reachy-mini-good-morning/README.md)
There's no separate "app store" to submit to. The directory is just Hugging Face Spaces tagged with reachy_mini. The robot's dashboard scans HF for spaces with that tag and lists them. So to publish you literally just need an HF Space with the right README frontmatter (which our README already has) โ git push and you're listed.
This avoids the broken pip problem because we'll go through uv (faster, doesn't need a system pip).
If publish isn't a subcommand on your version, regenerate the scaffold with our code merged in:
Cleanest if the assistant gives you any trouble:
You'll be prompted for credentials โ username is your HF handle, password is an HF access token (not your password) from https://huggingface.co/settings/tokens. Pick write scope.
https://huggingface.co/spaces/<your-username>/good-morning โ you should see the orange landing page.Good Morning should show up because of the reachy_mini and reachy_mini_python_app tags in the README. One-click install from there, then launch it.hf: command not found after uv pip install huggingface_hub โ use huggingface-cli login instead (older CLI name).Space not appearing in the dashboard โ double-check the README frontmatter has both reachy_mini and reachy_mini_python_app tags. Ours does.git push rejected for "LFS required" โ your audio cache file got committed. Our .gitignore excludes good_morning.wav so it should be fine; if you generated it before adding the .gitignore, run git rm --cached src/good_morning_app/good_morning.wav and recommit.Want me to also add a short demo video/GIF slot to the landing page (reserved spot you can drop a clip into later), or change the published Space name from good-morning to something else?
The reachy-mini-app-assistant package isn't on PyPI โ it's an internal Pollen tool that's hard to get. Skip it. Path B (just git push to a Hugging Face Space) is actually simpler and gets the same result, since the "app directory" is just HF Spaces with the right tag.
Let's go straight to publishing. Run these in the same terminal where you still have (reachy-mini-good-morning) active:
1. Install only what you actually need
2. Get a Hugging Face write token
Open https://huggingface.co/settings/tokens โ New token โ name it whatever, select Write access โ copy the token (starts with hf_โฆ). Keep it on your clipboard.
3. Log in
If that says "command not found", use the older name:
Paste the token when prompted. Answer n to "Add token as git credential?" โ we'll handle git auth manually below (cleaner).
4. Create the empty Space on the web
Open https://huggingface.co/new-space and:
good-morningClick Create Space. It'll show you a fresh empty repo page โ leave it open.
5. Push our folder to it
Back in the terminal:
(After the push works, you can swap the remote back to a tokenless URL with git remote set-url origin https://huggingface.co/spaces/clementdelangue/good-morning so the token isn't sitting in .git/config.)
6. Verify
https://huggingface.co/spaces/clementdelangue/good-morning โ you should see the orange landing page rendered.reachy_mini tag โ Good Morning should appear within a minute or two. Click install, then launch.That's it โ the app is now in the directory.
If git push errors out, paste me the exact message. The two common ones:
remote: Invalid username or password โ token is wrong or doesn't have write scope. Regenerate with the right scope.pre-receive hook declined with an LFS message โ something big slipped in. Run git ls-files | xargs ls -la | sort -k5 -n | tail to see the largest file and git rm --cached <file> it before re-pushing.Already logged in. Now the remaining steps. You're in ~ โ first hop back into the project folder, then create the Space and push.
1. Create the empty Space directly from the CLI
You don't need the web UI, since huggingface_hub is installed. From anywhere:
That should print something like https://huggingface.co/spaces/clementdelangue/good-morning. If it errors with "already exists", great, it's ready.
2. cd back into the project and push
When git push prompts you:
clementdelanguehf_โฆ) from https://huggingface.co/settings/tokens โ needs Write scope. (Your normal HF password won't work.)If it complains about credentials repeatedly, set the token inline in the URL once:
3. Done โ verify
Open https://huggingface.co/spaces/clementdelangue/good-morning โ you'll see the orange landing page render. The Reachy Mini dashboard scans HF for the reachy_mini tag, so the app shows up there too within a minute.
Paste the output of step 1 (or any error) if you hit a snag.
Same python vs python3 thing โ on macOS the binary is python3, not python. Use this:
If huggingface_hub was only installed inside the project's venv (likely), you'll get ModuleNotFoundError. Two fixes โ pick one:
Option A โ install it system-wide so any python works
Option B โ re-activate the venv first
Inside the venv python exists; outside it, only python3 does. Either should print the new Space's URL. Paste me what it prints (or the error).
Space is live at https://huggingface.co/spaces/clem/good-morning (your HF username is clem, good to know โ I'd assumed clementdelangue). The SSL warning is harmless.
Now push the code into it:
When git prompts for credentials:
clemhf_โฆ) from https://huggingface.co/settings/tokens with Write scope. Your normal password won't work โ has to be a token.If you'd rather skip the prompt entirely, embed the token in the remote once:
After the push lands, refresh https://huggingface.co/spaces/clem/good-morning โ you'll see the orange landing page render, and the app will start showing up in your Reachy Mini's app dashboard within a minute or two (it polls HF for spaces with the reachy_mini tag).
Paste the git push output if anything errors.
Hugging Face auto-generates a starter README.md when a Space is created, so the remote already has one commit. Your local repo doesn't know about it. Easiest fix is to force-push and overwrite โ you want your README (the one with reachy_mini tags) to win anyway, not the auto-generated one.
That's it. Refresh https://huggingface.co/spaces/clem/good-morning and you should see the orange landing page.
(If you'd rather merge instead of overwrite โ say, in case HF added something useful like LFS config โ you'd run git pull origin main --rebase --allow-unrelated-histories first, but for a brand-new Space there's nothing worth keeping, so force-push is fine.)
dont find the app in the reachy mini app store
Let me check what actually got pushed and compare it against an app that IS showing up.
Good news โ your Space is correctly tagged. The HF API call confirms clem/good-morning is indexed under the reachy_mini and reachy_mini_python_app tags, identical setup to the apps that DO show up (e.g. gemini-config-helper):
"id": "clem/good-morning", "tags": ["static","reachy_mini","reachy_mini_python_app","region:us"], "sdk": "static"
So the app store will see it. The reason the dashboard's search isn't finding it right now is just the dashboard's local cache. The "Discover Apps" widget pre-loaded its 176-app list before you pushed; it's not re-querying HF on every keystroke.
Three things to try, in order:
1. Force a refresh
Close the "Discover Apps" panel and reopen it (the X in the top right, then click Discover Apps again). On most builds that re-fetches the list. If that doesn't update it, fully quit and relaunch the Reachy Mini desktop app.
2. Wait a couple of minutes
HF's tag indexing can lag a minute or two behind a fresh push. Your space was created at 14:06 and last modified at 14:07 UTC โ give it ~5 minutes from then and try again.
3. Filter by the "Robotics" tag
Click the Robotics (9) tag chip โ your app has the right tags but might be filtered out of the default view by some other heuristic (likes/trending). Same goes for typing the exact owner: clem/good-morning instead of "Good".
If after a relaunch + 5 min wait it still doesn't appear, two things worth double-checking:
"private": false, so this should be fine.I'd give it a relaunch + a minute and try again โ 90% chance that's all it is.
getting this when I press "get a reachy mini" in the space
That's the HF Space iframing GitHub, which GitHub refuses to be embedded in. Two-line fix in index.html: add target="_blank" to any link that leaves the page, and point "Get a Reachy Mini" at the Pollen product page instead of the SDK repo (more appropriate for that CTA anyway).
Push the update:
Refresh the Space (the App tab usually needs a hard reload โ Cmd+Shift+R) and the orange button now opens https://www.pollen-robotics.com/reachy-mini/ in a new tab. The footer links to GitHub/Pollen also pop out instead of trying to load inside the iframe.
For the bigger picture: any external link inside an HF Space's index.html will hit this โ sites like github.com, twitter.com, openai.com all set X-Frame-Options: DENY. Always use target="_blank" rel="noopener" for outbound links from a Space.
I don't see the button to tap for reachy to say "good morning"
[Image: original 2600x1329, displayed at 2576x1317. Multiply coordinates by 1.01 to map to original image.]
Right โ that landing page is the catalog listing (the orange page that shows up when someone browses the app store). The actual button only appears once the app is installed and running on a Reachy Mini โ at that point it gets embedded in the dashboard's App tab. The HF Space is sdk: static so it can't talk to the robot directly; if it could host the live button, anyone visiting the page would be triggering your robot.
Let me make that obvious on the page โ add an explicit "How to use" section, and a visual preview of what the in-robot button looks like:
Push the changes:
Hard-refresh the Space (Cmd+Shift+R) and you'll now see:
The actual functional button only exists in two places:
http://localhost:7860/ if you're running the Python app directly on a machine connected to the robot.The HF Space can't host the working button itself โ it's a static page, has no way to reach your robot, and even if it could, it'd be triggering anyone's robot who happens to view the page.
on the desktop app I dont get the button
The app is running (green border + stop button on the good_morning tile, "App Running" badge under the robot). Just need to find where the desktop app surfaces our web UI. Three things to try, in order โ most likely the first one is enough.
1. Click the green good_morning tile
The running-app tile usually expands into a panel that embeds the app's web UI (custom_app_url). Click on the tile itself, not the red stop button.
2. Confirm the web server is actually up
Open this in any browser on the same machine:
http://localhost:7860/
If you see the orange "Good morning!" page, FastAPI is running fine and the only question is where the desktop app exposes it. If the page doesn't load, the FastAPI server didn't start โ see step 4 below.
If localhost doesn't work, try the robot's hostname:
http://reachy-mini.local:7860/
Either of those is the real, live button. You can use it from a browser tab even if the desktop app never embeds it.
3. Look for an "App" tab or "Open in browser" link
In the desktop app, depending on the version, you'll see either:
The tab probably scrolled off the screenshot โ try scrolling the right column or resizing the window.
4. If http://localhost:7860/ doesn't load
Check the app's logs for our app's output. In the LOGS panel of the dashboard, filter for good_morning โ you should see a line like:
[good_morning] Good Morning app starting (web on :7860, antennas armed)
If you don't see that line at all, the app failed to start โ paste the last 20 lines of logs and I'll diagnose. Most likely culprits: pyttsx3 couldn't synthesize on first run (macOS may need a permission prompt), or fastapi/uvicorn aren't in the dependencies the dashboard installed.
The quickest sanity check is step 2 โ http://localhost:7860/ in your browser. Tell me what that shows and we'll go from there.
see it on localhost but not on the desktop app. This is the logs I get
โ Install good-morning completed
10:22:32
Start good_morning
10:22:36
[app] reachy_mini.apps.manager.runner - WARNING - <frozen runpy>:128: RuntimeWarning: 'good_morning_app.main' found in sys.modules after import of package 'good_morning_app', but prior to execution of 'good_morning_app.main'; this may result in unpredictable behaviour
10:22:37
[app] reachy_mini.apps.manager.runner - WARNING - 2026-04-29 10:22:38,685 [good_morning] INFO: Good Morning app starting (web on :7860, antennas armed)
10:22:38
[app] [2m2026-04-29T14:22:42.893108Z[0m [32m INFO[0m ThreadId(01) [2mgst_plugin_webrtc_signalling::server[0m[2m:[0m Received message Ok(Pong(b""))
10:22:42
[app] [2m2026-04-29T14:22:42.893135Z[0m [32m INFO[0m ThreadId(01) [2mgst_plugin_webrtc_signalling::server[0m[2m:[0m Received message Ok(Pong(b""))
10:22:42
[app] [2m2026-04-29T14:22:42.912286Z[0m [32m INFO[0m ThreadId(01) [2mgst_plugin_webrtc_signalling::server[0m[2m:[0m Received message Ok(Pong(b""))
10:22:42
[app] [2m2026-04-29T14:22:42.940792Z[0m [32m INFO[0m ThreadId(01) [2mgst_plugin_webrtc_signalling::server[0m[2m:[0m Received message Ok(Pong(b""))
10:22:42
[app] reachy_mini.apps.manager.runner - WARNING - 2026-04-29 10:22:43,387 [reachy_mini.media.cameragstreamer] INFO: Pipeline latency (live=True, min_latency=20000000, max_latency=1000000000)
10:22:43
[app] reachy_mini.apps.manager.runner - WARNING - 2026-04-29 10:22:44,388 [reachymini.media.audio_gstreamer] INFO: Audio pipeline latency (live=False, min_latency=0, max_latency=18446744073709551615)
10:22:44
[app] reachy_mini.apps.manager.runner - WARNING - 2026-04-29 10:22:55,972 [good_morning] INFO: Triggered by web
10:22:55
[app] reachy_mini.apps.manager.runner - WARNING - 2026-04-29 10:22:55,972 [good_morning] INFO: Saying 'Good morning!' (0.73s)
10:22:55
[app] [2m2026-04-29T14:23:12.894588Z[0m [32m INFO[0m ThreadId(01) [2mgst_plugin_webrtc_signalling::server[0m[2m:[0m Received message Ok(Pong(b""))
10:23:12
[app] [2m2026-04-29T14:23:12.894611Z[0m [32m INFO[0m ThreadId(01) [2mgst_plugin_webrtc_signalling::server[0m[2m:[0m Received message Ok(Pong(b""))
10:23:12
[app] [2m2026-04-29T14:23:12.914752Z[0m [32m INFO[0m ThreadId(01) [2mgst_plugin_webrtc_signalling::server[0m[2m:[0m Received message Ok(Pong(b""))
10:23:12
[app] [2m2026-04-29T14:23:12.941428Z[0m [32m INFO[0m ThreadId(01) [2mgst_plugin_webrtc_signalling::server[0m[2m:[0m Received message Ok(Pong(b""))
Excellent โ the logs prove the app is working end-to-end:
[good_morning] INFO: Good Morning app starting (web on :7860, antennas armed) [good_morning] INFO: Triggered by web [good_morning] INFO: Saying 'Good morning!' (0.73s)
So the FastAPI server, the web button, and the audio playback to the speaker all work. The only remaining question is why the desktop app isn't iframing the UI in its window โ the button is right there at localhost:7860, but the dashboard isn't embedding it.
Two things to try inside the desktop app:
Click the green good_morning tile itself (not the red stop button). On most builds, the running app tile is the clickable target โ it expands to a panel or switches to a view that embeds custom_app_url. The screenshot you shared looks like the "Home" view; the embedded UI usually lives one click deeper.
Look for a top nav tab. v0.9.29 has tabs like "Home / Apps / Settings" along the top โ your screenshot may have cropped them. The "Apps" tab is typically where the running app's UI gets iframed.
If neither does it, the desktop app on your version simply doesn't iframe custom_app_url from the home screen, and you're meant to open it in a browser. That's fine โ http://localhost:7860/ (or http://reachy-mini.local:7860/ from any other device on the same network) is the real button. It's the exact same FastAPI route the dashboard would embed.
A small quality-of-life patch I can make: I can change the app to log a clickable URL when it starts, so the LOGS panel shows something like โ Open the button at http://localhost:7860/ and you can click straight from there. Want me to push that?
For now though, you have a fully working Reachy Mini app. To recap what you've built:
https://huggingface.co/spaces/clem/good-morning with a tagged Space, a landing page, and the right entry point so the dashboard discovers it.Push either antenna and check the logs โ you should also see Triggered by antenna. That's the second button working.
can't click on the green and there's no top nav tab. Is there a way to force a redirect to the localhost page maybe?
Yes โ let me add a guaranteed fallback that pops the localhost page in your default browser when the app starts. That way you don't depend on the dashboard iframing it correctly.
Got it โ the cleanest fix is to have the app pop your default browser open to the URL when it starts. Then you don't depend on the desktop app's iframe behavior at all.
Compiles clean. Here's what to do:
1. Push the update
2. Re-install on the robot
In the desktop app, hit Stop on the running good_morning tile, then in the Discover Apps panel uninstall + reinstall (or pull-update if the dashboard offers that โ the check-updates line in your earlier logs suggests it does).
3. Start it again
When you press Start on good_morning, two things will happen:
Good Morning app starting (web on :7860, antennas armed) line in LOGS.Opening the button page in your browser โ http://localhost:7860/ appears in LOGS, and your default browser pops a tab with the orange button. Click it โ robot says good morning.What this does under the hood: a small thread polls http://localhost:7860/healthz (the endpoint already in the FastAPI app) until it answers 200 โ so it only opens the browser once the server is actually ready, never before โ then calls Python's webbrowser.open(). That maps to open on macOS, so it pops your default browser straight to the button page. Independent of whether the desktop app iframes custom_app_url or not.
I also changed custom_app_url from http://0.0.0.0:7860/ to http://localhost:7860/. 0.0.0.0 is a valid bind address but not a valid URL for a browser to navigate to, which may be why the dashboard's iframe was silently failing on your version.
If after the update you'd rather the browser NOT open automatically (say, you've found where the dashboard iframes it), it's a one-line tweak โ just delete the _open_browser_when_ready thread block in run(). Let me know how the next launch goes.
great, can you update so that the text said is "Good morning Clem. Today is a good day to help more people become AI builders, not just AI users" instead of just "good morning"? + update the space to remove the mention of the robot's antennas (it's not working) + add the fact that you have to go to localhost when the app is running to find the button? Also mention at the top that this is the first reachy mini app created for the new version of reachy mini by clem delangue, cofounder and ceo of hugging face
On it. Four files to update โ phrase in the app, plus the README, landing page, and any antenna mentions across the board. I'll also make the audio cache auto-invalidate on phrase change so you don't have to clear it manually.
Now the landing page โ remove all antenna mentions, add the Clem credit banner, and add the localhost callout:
Now strip the antennas out of the "How it works" and "Features" sections:
Now style the new "First!" credit banner:
Now the README โ same edits, plus update the Space's short_description:
Now also clean up the in-app web page text โ it still says "or push an antenna":
Quick syntax check, then push:
User-facing files (README, index.html, style.css) are clean โ no antenna mentions. The 17 references in main.py are internal: the antenna-watching code path still exists silently in the background but isn't promoted anywhere visible. Let me also clean the top-level docstring in main.py since people will read it:
Compiles clean. Push everything:
Then on the robot: stop the app โ reinstall (or update if the dashboard offers it) โ start. On launch your browser will open to localhost:7860, click the button, and Reachy Mini will speak the new line.
Summary of what changed:
The spoken phrase is now "Good morning Clem. Today is a good day to help more people become AI builders, not just AI users." โ about 5 seconds of audio. The cache file is hashed off the phrase content (good_morning.<hash>.wav) so the moment you change PHRASE, the old WAV is ignored and a fresh one gets synthesised on next start. No manual cache-clearing needed.
The HF Space landing page now leads with a "First!" credit banner crediting you as co-founder and CEO of Hugging Face, links to your HF profile, and the lede quotes the full new phrase. The "How to use it on your robot" steps now point at http://localhost:7860/ for the actual button instead of mentioning a non-working dashboard tab. Every antenna reference is gone from the README, the landing page, the in-app web UI status text, and the top-of-file docstring โ antennas are no longer advertised anywhere a user will look.
HF Spaces caps short_description at 60 chars and ours was 64. Tighten it and amend the rejected commit:
51 chars, comfortably under the limit. Now amend and push:
--amend --no-edit rewrites the rejected commit with the fix and keeps the same message. The push should go through this time.
If the prompt about identity (git config --global --edit) was on screen earlier, it's a separate, unrelated nag โ git is just letting you know it inferred your name/email from the system. You can ignore it for now, or set them explicitly later with:
Doesn't block the push.
great, can you update the text to "Good morning. Today is a good day to help more people become AI builders, not just AI users thanks to open-source!"
All three files updated and main.py compiles. Push:
Then on the robot: stop the app and start it again. Because the cache filename is hashed off the phrase, the old WAV is automatically ignored and a fresh one gets synthesised on first press โ no manual cleanup. The Space's landing page will refresh as soon as the push lands.
also in the spaces landing page, can you keep just "Press a button and Reachy Mini greets you out loud" (remove the quote after). Don't change what the robot says when we press the button though
Done โ only the landing page changed. The PHRASE constant in main.py is untouched, so the robot still says the full open-source line. Push:
can you add the emoji sun as the app icon? (instead of this box)
Let me find out where the dashboard icon actually comes from โ the box default suggests our ๐ emoji in the README isn't getting picked up. Let me check an app that DOES show a proper icon (hand_tracker_v2 shows ๐ in the screenshot):
The dashboard reads the icon from the emoji field in the README's YAML frontmatter โ same as hand_tracker_v2 (๐) and reachy_phone_home (๐ฑ). Yours has emoji: ๐ already, but the dashboard cached the box default at install time, so we need to bump the emoji and reinstall.
Also swap the ๐ in the landing page hero so the visual identity is consistent across the Space and the dashboard:
Make the animation suit a sun better โ a gentle radiating pulse instead of a wave:
Push, then on the robot uninstall and reinstall the app โ the dashboard caches the icon at install time, so re-pushing the README isn't enough on its own:
Then on your Reachy Mini desktop app:
good_morning app (red square button).good-morning.If after reinstall it still shows ๐ฆ, the dashboard might cache via HF's own image CDN โ give it a few minutes and try a force-refresh of the desktop app. The other apps in your screenshot (reachy_phone_home showing ๐ฑ, hand_tracker_v2 showing ๐) use the exact same emoji: frontmatter mechanism, so this approach is correct.
can reachy mini move a bit when it says the text?
Let me check the SDK's movement API so I get the calls right:
Yes. I'll add a gentle wobble โ head bob, antenna wiggle, and a slight body sway โ synced to the audio duration, returning to neutral when it's done. Using set_target at 30 Hz for the live motion and goto_target for the return-to-rest pose, both wrapped in best-effort try/except so any SDK glitch doesn't prevent the greeting.
Now add the motion thread and wire it into _say():
Compiles clean. Push and reinstall:
On the robot: stop โ uninstall โ reinstall โ start. Press the button and Reachy Mini should now bob gently, sway its body, and wiggle its antennas for the full duration of the phrase, then settle smoothly back to a neutral resting pose.
What's happening under the hood โ a speak-motion thread runs alongside the audio. Every ~33 ms it computes three sinusoids and calls mini.set_target(head=..., antennas=..., body_yaw=...):
The head bobs vertically: a 5 mm baseline lift with ยฑ3 mm bob at 1 Hz โ gives the impression of "leaning into" the conversation. Antennas wiggle independently with a 90ยฐ phase offset between left and right, peaking at ยฑ12ยฐ at 1.5 Hz โ the asymmetry reads as expressive rather than mechanical. The body yaws gently ยฑ4ยฐ at a slow 0.4 Hz โ slow enough that it feels like a conversational sway, not a head shake.
When the phrase finishes, a goto_target smoothly interpolates everything back to zero over 0.6 s with a min-jerk profile, so the robot doesn't snap to rest.
If any of those motions is too much for your taste, the constants are at the top of main.py:
HEAD_BOB_AMPLITUDE_MM from 3.0 to 5.0 or higher.ANTENNA_AMPLITUDE_DEG from 12.0 to 6.0.BODY_YAW_AMPLITUDE_DEG = 0.0.Want me to add a more specific motif โ e.g. a single nod on the word "morning," or have it look toward the microphone โ instead of the continuous wobble?
on the spaces, can you mention that you can try it in simulation even if you don't have reachy mini yet (and explain how?)
I'll add a clear "Try it without a robot" section to the landing page with the actual install + daemon-sim commands:
Now style the new section so it stands out as a callout card: