Muse boards / Build

Build: Freenove FNK0104B (ESP32-S3 2.8" touch)

About 30-45 minutes · needs a Mac or PC and a USB-C data cable · some Terminal, or let your agent do it

Beginner · no toolsA USB-C data cable and one flash command.

A working Muse Gadgets: ESP32 Device SDK (Full UI) build on Freenove FNK0104B (ESP32-S3 2.8" touch), paired to your Muse account and ready for first prompts.

Screen and voiceBoard $24 · about $34 with cable/parts
Download build.md
1

Get the parts

You need the board and any build-specific accessories before flashing or pairing.

1 × USB-C data cable
Requiredpart

Must carry data, not just charge. Most flashing problems are charge-only cables. This Adafruit cable is USB-C on both ends with all data pins connected ($9.95 on 2026-10-05). If your computer has USB-A ports, the Seeed USB-C to USB-A cable works too.

Buy from adafruit.com
1 × USB-C power adapter (5 V / 2 A or more)
Optionalpart

Optional. Runs the gadget from a wall outlet instead of your computer. A phone charger that supplies 5 V / 2 A or more works.

Find on amazon.com
Hackshop never buys for you. Links open the store.
2

Get your Muse SDK token

Muse gadgets pair with your account by using a private SDK token.

Create a token at gadgets.muse.ai > Account > SDK tokens (https://gadgets.muse.ai/settings/sdk-tokens). It starts with mgst_. For this ESP32 build, set CONFIG_GADGET_SDK_TOKEN="mgst_YOUR_TOKEN" in build-muse-fnk0104b/sdkconfig after the board build command has created that file, then run the build command again. idf.py menuconfig > ESP32 Device SDK > Muse Gadgets SDK token is the interactive alternative. Never commit the real token or paste it anywhere public.

3

Flash the firmware

The board needs the Muse ESP32 firmware configured with your SDK token.

Read this first: flashing this board

  • Port: Native USB: it shows up as /dev/cu.usbmodem* on macOS or /dev/ttyACM* on Linux. On Linux, add yourself to the dialout (or uucp) group.

Source: https://github.com/facebookincubator/muse-gadget-sdk/blob/main/esp32/AGENTS.md

Let your agent do it

Give your coding agent the build brief at https://www.hackshop.dev/build/freenove-fnk0104b/build.md. Tell it to keep the token private, use mgst_YOUR_TOKEN as the placeholder, and find the serial port before flashing. It should find the port with ls /dev/cu.usbmodem* 2>/dev/null || ls /dev/ttyACM* 2>/dev/null; on Windows, use Device Manager to find the COM port, then run commands in the ESP-IDF shell.

Do it yourself

Install ESP-IDF v6.0.1 and only the esp32s3 target for this board. Muse's ESP32 README verifies macOS and Linux. Windows is not documented by the Muse SDK; if you use it, install ESP-IDF v6.0.1 with Espressif's Windows installer and run commands in the ESP-IDF shell. Clone the Muse Gadget SDK, run tools/muse/board.sh build fnk0104b once to create build-muse-fnk0104b/sdkconfig, set CONFIG_GADGET_SDK_TOKEN="mgst_YOUR_TOKEN" in that file, run tools/muse/board.sh build fnk0104b again, then flash. If flashing cannot connect, hold BOOT, tap RESET, then release BOOT.

git clone -b v6.0.1 --recursive https://github.com/espressif/esp-idf.git ~/esp/esp-idf-v6
~/esp/esp-idf-v6/install.sh esp32s3
. ~/esp/esp-idf-v6/export.sh
git clone https://github.com/facebookincubator/muse-gadget-sdk
cd muse-gadget-sdk/esp32
tools/muse/board.sh build fnk0104b
printf '\nCONFIG_GADGET_SDK_TOKEN="mgst_YOUR_TOKEN"\n' >> build-muse-fnk0104b/sdkconfig
tools/muse/board.sh build fnk0104b
ls /dev/cu.usbmodem* 2>/dev/null || ls /dev/ttyACM* 2>/dev/null
tools/muse/board.sh flash fnk0104b PORT
4

Pair it with the Muse app

Pairing links the freshly flashed board to your Muse account.

In the Muse app, turn on Settings > Devices > Developer mode, then Settings > Devices > Add Device (+). Pick MuseGadget-XXXXXX and press the BOOT button when the screen or edge status breathes blue. Green means connected. Status meanings: orange = ready for setup, blue breathing = press the button, blue = joining Wi-Fi and connecting, green = connected, yellow blinking = reconnecting, purple = unpaired, red blinking = error. Hold the button for 5 seconds to reset pairing.

5

Put it together

A physical agent body needs to sit safely, keep the cable clear and leave controls reachable.

Put the board in its stand, case or a stable spot on the desk. Route the cable through the slot or open edge, power it, and check that the buttons and display are reachable.

6

Try it

A first prompt proves the device is paired, reachable, and useful for the project.

“(Hold BOOT) What's next today?”“Show me the image you just found.”

Hand it to your agent

# Build: Freenove FNK0104B (ESP32-S3 2.8" touch) as a Muse gadget
Difficulty: Beginner (no tools). A USB-C data cable and one flash command.

## Goal
A working Muse Gadgets: ESP32 Device SDK (Full UI) build on Freenove FNK0104B (ESP32-S3 2.8" touch), paired to your Muse account and ready for first prompts.

## Hardware
- [Freenove FNK0104B (ESP32-S3 2.8" touch)](https://store.freenove.com/products/fnk0104) x1 (required, board): Main board or device for this build.
- [USB-C data cable](https://www.adafruit.com/product/4199) x1 (required, part): Must carry data, not just charge. Most flashing problems are charge-only cables. This Adafruit cable is USB-C on both ends with all data pins connected ($9.95 on 2026-10-05). If your computer has USB-A ports, the Seeed USB-C to USB-A cable works too.
- [USB-C power adapter (5 V / 2 A or more)](https://www.amazon.com/s?k=USB-C%20power%20adapter%205V%202A) x1 (optional, part): Optional. Runs the gadget from a wall outlet instead of your computer. A phone charger that supplies 5 V / 2 A or more works.

## Shopping list (ask before buying)

Caveats + terms

Personal, non-commercial use with your own Muse account. A token can be linked to at most 50 devices. You may not put it in any device you sell, advertise, or list publicly or in a marketplace or app store; other distribution needs Meta's written permission. Provided as-is; Meta can change, withdraw or revoke access at any time. Read terms.

  • The home-network tunnel lets Muse reach devices on your LAN that expose a local HTTP API. Treat it like giving the agent a foothold on your network.
  • Pairing has no manufacturer verification and can't prevent an active man-in-the-middle attack.
  • Builds are signed with the included development key and never enable Secure Boot. Enable NVS encryption (CONFIG_HOMEHUB_NVS_ENCRYPTION).
  • Custom ESP32 commands are not a documented API yet: the command set (display.draw_url, sensors.read, camera.capture, ...) is hardcoded in main/app.c.