Muse Gadget on Windows: Status Report
Written 2026-10-03. Subject: can the Waveshare ESP32-S3-Touch-AMOLED-1.75C become a Muse gadget with this Windows 11 laptop? Read this first when you buy the board.
1. Final status
The firmware builds on this Windows laptop. Nothing has run on the board, because you do not own the board yet.
- DONE The Muse Gadget SDK, profile
build-muse-waveshare-s3-175c, compiled with no errors. It produced a signedmuse-gadget.binof 2,166,784 bytes. The app partition holds 4,194,304 bytes, so 48% is free. - DONE ESP-IDF v6.0.1 is installed and works in PowerShell on this laptop.
- DONE The board in your screenshot is the 1.75C. The Waveshare page for it has the same title and product ID 33691.
- INCONCLUSIVE The SDK host tests ran: 120 tests, 1 failure, 17 errors, 23 skipped. Every error and the failure trace to a missing host C/C++ compiler on this laptop, except one Windows text-encoding fault that the missing compiler hides. The tests did not prove the SDK code good or bad (section 3a).
- NOT DONE Flashing, first boot, pairing with the Muse app, and every board feature. All need the real board.
- NOT DONE The SDK token. The build used an empty token, so the gadget cannot pair until you set a real one and rebuild.
My estimate: the chance of success is good. The compile step is the part I could test, and it passed. I do not give a percentage, because the steps that remain are untested.
2. What the SDK is
The folder muse-gadget-sdk-main is the open-source Muse Gadget SDK from Meta Platforms (Apache 2.0). It has three parts:
esp32/: ESP-IDF firmware for ESP32 boards. It pairs over BLE, joins Wi-Fi, and holds an encrypted Noise session to your Muse VM. This is the part you need.linux/: a Python package for Raspberry Pi and other Linux machines. It needs BlueZ and systemd. It does not run natively on Windows.skills/: 43 skills for controlling devices on your network (Hue, Sonos, printers and others). You do not need them for this project.
Every gadget needs an SDK token (mgst_…) from gadgets.muse.ai. Read the Gadget SDK Terms first. Pairing uses the Muse app (iOS or Android) with Settings > Devices > Developer mode turned on.
The README says the build computer should run macOS or Linux. It does not list Windows. This report tests that gap.
3. Tests I ran
| # | Test | Result |
|---|---|---|
| 1 | Checked the laptop for tools. Found Git, Python 3.13.5, CMake and Ninja. Windows long paths are on (LongPathsEnabled = 1). C: had 237.6 GB free. | Pass |
| 2 | Cloned ESP-IDF v6.0.1 with all submodules into C:\esp\esp-idf-v6.0.1. Confirmed the tag is v6.0.1 and no submodule was missing. | Pass |
| 3 | Ran install.ps1 esp32s3, first attempt. | Failed: ERROR: MSys/Mingw is not supported |
| 4 | Removed the Git Bash variables (MSYSTEM=MINGW64 and six more) from the process. Ran install.ps1 esp32s3 again. It installed 11 tools and a Python environment, idf6.0_py3.13_env. Exit code 0. | Pass |
| 5 | Ran export.ps1. idf.py --version printed ESP-IDF v6.0.1. PowerShell 5.1 showed a red NativeCommandError text during activation. That text is progress output and not a failure. | Pass |
| 6 | Built from esp32/ with the raw idf.py command (section 8). 2,203 build steps. Signed the image with the committed dev key. The check_sizes line reported 0x1ef000 bytes (48%) free. | Pass |
| 7 | Read tools/muse/ports.py. It finds the board through pyserial list_ports, so it should work with Windows COM ports. I did not run it. | Read only |
| 8 | Fetched the Waveshare product page and compared it to your screenshot (section 6). | Match |
| 9 | Ran the host tests in PowerShell with ESP-IDF active: python -m unittest discover -s tests -p "test_*.py" from esp32/. 32 test files, 120 tests, 2.1 seconds. | FAILED (failures=1, errors=17, skipped=23) |
| 10 | Ran the same command again with PYTHONUTF8=1 to isolate the text-encoding error. | Same counts. The encoding error is gone (section 3a) |
3a. Host test result (run 2026-10-03)
Result: inconclusive. The laptop cannot run most of these tests, because it has no host C or C++ compiler.
These tests compile the SDK's C and C++ code against fake parts and run it on the computer. They do not use the board, and they are not the firmware build. The firmware build in test 6 used the Xtensa compiler from ESP-IDF, which cannot run on the laptop.
| Count | What happened | Cause |
|---|---|---|
| 16 errors | FileNotFoundError: [WinError 2] raised from Python's subprocess. Examples: the setUpClass of test_box3_microphone, test_link_discovery, test_link_epaper_status, test_link_sensecap_sensors and test_cardputer_navigation, and 9 tests in the control and tunnel backpressure group. | The test tried to start a program that does not exist. cc, c++, gcc, g++, clang and cl are all absent from the PATH, and CC and CXX are unset. This is my inference from those facts and from the error. I did not read each failing line. |
| 1 failure | test_link_pairing_handshake: AssertionError: Host C compiler and CMake are required. | The test says directly that no host C compiler was found. |
| 1 error | test_muse_chat_link_errors at line 290: UnicodeEncodeError: 'charmap' codec can't encode character '\U0001f600'. | A Windows-specific fault in the test code. write_text() uses the Windows default encoding (cp1252) and cannot write an emoji. I found 32 write_text( calls under tests/ with no encoding= argument. I did not inspect them one by one. |
| 23 skipped | Several test files skip themselves with C compiler not available or C++ compiler not available. One skips with cryptography required for real ECDH/ECDSA/AES-GCM vectors. | Mostly the missing compiler. I did not check the reason for each of the 23 skips. |
- The error count understates what did not run. A
setUpClasserror stops its whole test class, and the classes are counted once in "17 errors". The 120 tests that ran do not include the tests in those classes. - Test 10 result: with
PYTHONUTF8=1, theUnicodeEncodeErrorcount fell from 1 to 0, and theFileNotFoundErrorcount rose from 16 to 17. The total stayed at 1 failure, 17 errors, 23 skipped. So the encoding fault is real, and the missing compiler hides it. - What this says about your board: nothing, either way. No test failed because of a logic fault in the SDK code. No test passed for the compiler-dependent code either.
- To get a real result: install a host C and C++ compiler (for example MSYS2 MinGW-w64 or Visual Studio Build Tools), then re-run with
PYTHONUTF8=1. I did not install one, because the SDK README says the tests run on macOS or Linux, and installing a compiler changes your laptop. Tell me if you want it. - The README says to run
idf.py buildonce first, so the downloaded components are in place. That was done.
Full logs were in the temporary scratchpad folder (hosttests.log and hosttests_utf8.log) and may be gone.
4. Findings
- ESP-IDF refuses to run when Git Bash variables are set. My session shell carried
MSYSTEM=MINGW64,MSYSTEM_CARCH,MSYSTEM_CHOST,MSYSTEM_PREFIX,MINGW_CHOST,MINGW_PACKAGE_PREFIXandMINGW_PREFIX.idf_tools.pystops whenMSYSTEMexists. A normal PowerShell window probably has none of them.export.shruns the same check. Sotools/muse/board.shprobably fails in Git Bash. I did not runboard.sh, so this part is not confirmed. - Use PowerShell and the raw
idf.pycommand. It built the profile with no workaround. The repository documents this command inesp32/AGENTS.md. - Windows path length caused no problem. Long paths were already on. I built in the existing folder, whose path is about 70 characters long. I did not test with long paths off.
- The build warned about the token. The warning was
No SDK token: set CONFIG_GADGET_SDK_TOKEN. The generated config hasCONFIG_GADGET_SDK_TOKEN="". This is expected, andAGENTS.mdallows it. - The generated config matches the board. It has
CONFIG_IDF_TARGET="esp32s3",CONFIG_MUSE_BOARD_ID="waveshare_s3_175c",CONFIG_ESPTOOLPY_FLASHSIZE="32MB"andCONFIG_HOMEHUB_OTA_ENABLED=y. I did not run the SDK's full overlay-check script. - Security notes from the SDK documents. The SDK token ships inside the firmware. Treat it as an identifier, not a password. Pairing has no manufacturer verification and cannot stop an active man-in-the-middle attack, so pair on a network you trust. NVS encryption is off unless you set
CONFIG_HOMEHUB_NVS_ENCRYPTION; the repository strongly recommends it. Do not enable Secure Boot or flash encryption on a board you want to reflash.
5. Checked and not checked
| Checked | Not checked |
|---|---|
|
|
6. Buying checklist (verified 2026-10-03)
| Check | Result |
|---|---|
| The product is the 1.75C | Yes. I fetched waveshare.com/esp32-s3-touch-amoled-1.75c.htm, the link in the SDK's devices/README.md. Its title matches your screenshot. Its model name is ESP32-S3-Touch-AMOLED-1.75C. Its product ID is 33691, and your screenshot's breadcrumb shows 33691. |
| Not the plain 1.75 | The plain 1.75 needs a different profile (s3n, overlay sdkconfig.muse-waveshare-s3-175). Your screenshot shows neither the web address nor the words "1.75C". I matched it by title and ID. If you buy from another page or a reseller, check for ID 33691 or the model name. |
| Price and battery | $39.99 without a battery. $41.99 with a 3.7V MX1.25 lithium battery. In the screenshot, neither the Included nor the NOT Included button is selected. The SDK works on USB power without a battery. |
| Data-capable USB-C cable | The package list has the board, a silver lanyard and the optional battery. It lists no cable. Buy a USB-C cable that carries data, not only power. |
| Flash and PSRAM | 32 MB flash, 8 MB PSRAM. This matches the overlay. |
Limit: a tool that summarizes web pages fetched the page. I did not read the page text myself.
7. Connecting other devices as sensors (not tested)
A closed commercial device cannot become a Muse gadget. A gadget must run the SDK code (ESP32 firmware or the Linux package). Such a device can only be a sensor behind a gadget.
- The Waveshare board does not read other BLE devices today. Its BLE radio is used for pairing. New code would be needed, and the SDK has none for this.
- Linux route: a Raspberry Pi Zero 2 W with the Linux SDK, a Python script using
bleak, andmusegadget send-user-msg. The template islinux/examples/pebble_ring_bridge.py. A Windows laptop cannot be the gadget for the Linux SDK. - First check: scan with the nRF Connect phone app. A device that does not appear in the scan may store data and sync it later, so a live bridge may not work.
8. When the board arrives: steps to resume
Use a new PowerShell window. Do not use Git Bash.
- Get the token. Create an SDK token at gadgets.muse.ai. Read the Gadget SDK Terms. Do not paste the token in a public place.
- Activate ESP-IDF and go to the project.
. C:\esp\esp-idf-v6.0.1\export.ps1 cd <folder that holds muse-gadget-sdk-main>\muse-gadget-sdk-main\esp32
- Set the token. The build folder already has a generated
sdkconfig, so edit that file or use menuconfig. The menu path in the README is ESP32 Device SDK > Muse Gadgets SDK token.idf.py -B build-muse-waveshare-s3-175c menuconfig
The generatedsdkconfignow hasCONFIG_GADGET_SDK_TOKEN="". Never commit the token or print it in full. - Rebuild.
idf.py -B build-muse-waveshare-s3-175c -DIDF_TARGET=esp32s3 "-DSDKCONFIG=build-muse-waveshare-s3-175c/sdkconfig" "-DSDKCONFIG_DEFAULTS=sdkconfig.defaults;devices/sdkconfig.muse;devices/sdkconfig.muse-waveshare-s3-175c" build
- Plug in the board. Use the data cable. Find the COM port in Device Manager (Ports), or run
python tools\muse\ports.py --list. The second command is untested on Windows. - Flash. Replace
COM5with your port. Add the same-Darguments as in step 4.idf.py -B build-muse-waveshare-s3-175c -DIDF_TARGET=esp32s3 "-DSDKCONFIG=build-muse-waveshare-s3-175c/sdkconfig" "-DSDKCONFIG_DEFAULTS=sdkconfig.defaults;devices/sdkconfig.muse;devices/sdkconfig.muse-waveshare-s3-175c" -p COM5 flash
Reflashing keeps pairing and Wi-Fi settings.erase-flashremoves them. - Read the boot log. A healthy boot logs
link.main: Muse Gadget startingandmuse: board: …. It must show no panic and no reboot loop.tools/muse/monitor.py PORT 30captures the boot and needspyserial. Plainidf.py monitorneeds an interactive terminal. - Pair. In the Muse app, turn on Settings > Devices > Developer mode. Add a device. It shows as
MuseGadget-XXXXXX. Press the board's talk button when the app asks.AGENTS.mdnames this button "top" on the 1.75C. Hold the button for 5 seconds to reset the setup.
Status colors and screen
The full-UI boards show state on the avatar. A dev board's LED colors are: orange breathing means ready for setup, blue breathing means press the button to confirm, blue means joining Wi-Fi and connecting, green means connected, yellow blinking means reconnecting, purple means not paired, red blinking means error. Until the board is paired, its screen shows its name dimmed under the state.
9. If the gadget fails: possible causes
These are causes from the SDK documents and from general ESP32 and Windows practice. I did not see any of them happen on this project, except cause 1 of section A.
A. Build or toolchain (seen once)
- MSys error again. Cause: Git Bash variables in the shell, or
board.shrun in Git Bash. Fix: use a plain PowerShell window, or remove theMSYSTEMvariables. - Component manager error (LVGL is the usual one). Cause:
managed_components/anddependencies.lockfrom another board. Fix: delete both and build again. - A change to
sdkconfig.defaultsor an overlay has no effect. Cause: the generatedbuild-muse-waveshare-s3-175c/sdkconfigoverrides them. Fix: delete the build folder and rebuild. The token step above edits that generated file on purpose. - Wrong ESP-IDF version. Only v6.0.1 is supported. Missing headers such as
gcm.horgpio_ll.hpoint to the wrong tag.
B. The laptop cannot flash the board
- No COM port appears. Cause: a power-only cable, a faulty cable or port, or a missing USB driver.
- "Failed to connect". Cause: the board is not in boot mode, or another program holds the port (a serial monitor, an old
idf.py monitor). Fix: close the program. Put the board in boot mode (the SDK README says: hold BOOT, tap RESET, release BOOT). I did not check that this board has the same buttons. See the Waveshare wiki. - The port number changes after a reset. A native USB port can reappear under a new COM number. Run the port check again.
- The flash size or partition is wrong. Cause: building the wrong profile (for example the 1.75 instead of the 1.75C).
C. The board does not boot
- Blank screen or reboot loop. Cause: wrong profile, a different hardware revision from the one the SDK authors used, or a power problem. Read the serial log for a panic or brownout message.
- Weak power. A weak USB port or a poor cable can cause brownouts. Try a different port or a powered hub.
- A battery fault. Test on USB power only, with no battery.
- A defective board. Rare, but possible. I cannot rule it out.
D. Pairing fails
- The token is empty, wrong or revoked. The firmware cannot pair without a valid token once Muse requires tokens.
- The Muse app does not list the device. Cause: Developer mode is off, or the app version does not support community pairing v5. The device uses v5. I did not check which app version you have.
- "Couldn't connect". Cause: stale Bluetooth state on the phone. Toggle the phone's Bluetooth.
- No button press. Pairing needs a physical press on the board.
- Wrong Wi-Fi. The ESP32-S3 supports 2.4 GHz Wi-Fi only. A 5 GHz-only network, an enterprise login or a captive portal can fail. This is general ESP32 knowledge and not from the SDK documents.
- A network that blocks the Muse service.
E. Connected, but features do not work
- No spoken replies. This is by design. Replies are text captions. Speech needs your own text-to-speech code (
start_ttsincomponents/muse/muse_chat_session.cpp). - The microphone, the speaker, touch or the battery meter fails. Cause: a hardware revision difference, or a driver mismatch. The overlay depends on Waveshare's board package
waveshare/esp32_s3_touch_amoled_1_75c. - Standby problems on battery. The overlay lets the CPU light-sleep when the screen is off. On USB power the chip stays awake.
F. Outside your control
- This is a community project. The README says it is "built by hackers, for hackers" and that flashing can brick boards and void warranties.
- The Muse service or app can change. Pairing needs a Muse account and the Muse app. I did not check whether they are available in your country or on your phone.
10. Files and changes on this laptop
| Path | What it is |
|---|---|
C:\esp\esp-idf-v6.0.1 | ESP-IDF v6.0.1 (shallow clone with submodules). |
%USERPROFILE%\.espressif | The 11 ESP-IDF tools, downloaded archives, and the Python environment idf6.0_py3.13_env. |
…\muse-gadget-sdk-main\esp32\build-muse-waveshare-s3-175c\ | Build output, including muse-gadget.bin (built 2026-10-03 19:52) and the generated sdkconfig. |
…\esp32\managed_components\ and …\esp32\dependencies.lock | Downloaded components. They exist now. board.sh would delete them after a build. I did not. |
muse-gadget-waveshare-status-report.html | This report. |
I changed no source file in the SDK. The build log was in a temporary folder and may be gone.
11. Open questions for you
- Do you use an iPhone or an Android phone? The Muse app must run on it and must support community devices.
- Do you have a Muse account and an SDK token? Have you read the Gadget SDK Terms?
- Do you want the battery ($41.99) or USB power only ($39.99)?
- Do you want me to install a host C and C++ compiler (for example MSYS2 MinGW-w64) and re-run the host tests with
PYTHONUTF8=1? It changes your laptop. It needs no board.