Freenove FNK0104B USB + Bluetooth

Firmware · direct from this repository

Put your display
back to work.

Flash firmware over USB or configure your powered board over Bluetooth. Choose the task below to get started.

One step to install

Connect your board

What this firmware does

  1. 01Connect the board with a USB data cable.
  2. 02Choose the Espressif USB serial device.
  3. 03Keep the tab open until writing finishes.

Loading the firmware release…

Leave “Erase device” unchecked to keep saved Wi-Fi and monitor settings when updating compatible firmware. Checking it deletes all saved settings. The speech monitor replaces OTA/FATFS storage with speech models. Keep USB connected during installation.

Board screenshot

Codex monitor

See live Codex usage and agent activity. Say “Hi ESP” for local commands, or tap Voice command to send a message through your local bridge.

Monitor setup and controls

Actual Codex monitor display showing Wi-Fi online, Codex busy, remaining usage, a working agent avatar, and the Voice command button.
Actual FNK0104B display capture. Values reflect the time of capture.

Screen preview

Voice recorder

Say “Hi ESP” to record, pause to save an Opus file to your SD card, and select a recording to play it through an attached speaker.

Recorder setup and controls

Voice recorder screen showing recording status, a microphone meter, saved Opus files, and Stop, Play, Previous and Next buttons.
Rendered from the firmware drawing code with sample data.

Configure your powered board

Connect through your browser

Use desktop Chrome on macOS, or Chrome / Microsoft Edge on Windows, with Bluetooth enabled. Open this HTTPS page directly in that browser. Safari and Firefox cannot use this page's Web Bluetooth controls.

Click the connect button below and choose the board in the browser's device picker. Monitor firmware advertises automatically; there is no pairing button and you do not need to pair it in Windows or macOS Bluetooth settings.

Can't find the board?

On Windows 11

  1. Turn on Bluetooth in Windows Settings and keep the board nearby and powered.
  2. Open this page in Windows Chrome or Edge. A site served from WSL can use Windows Bluetooth through that browser.
  3. Click Connect to monitor and look for FNK0104B-MONITOR in the browser picker. Older firmware may advertise Codex Micro.

On macOS

  1. Use desktop Chrome and turn on Bluetooth.
  2. In System Settings → Privacy & Security → Bluetooth, allow Google Chrome if it is listed. Accept a Bluetooth permission prompt, then restart Chrome if you changed its permission.
  3. Search using this page's connect button. Use the browser picker rather than the macOS Bluetooth settings list.

Switching computers? Close the connected settings tab on the other computer first. The monitor stops advertising while connected and resumes when it disconnects. If it still does not appear, restart the board, close the picker and open it again.

Wrong page or a redirect? Open the direct setup link. If your browser still redirects to another domain, clear site data for cmwen.github.io and cmwen.dev and retry.

Chrome Bluetooth requirements · macOS privacy settings

Make the board yours

Monitor settings

Choose the controls you want to see, then map their actions in Desktop. Board preferences are saved over Bluetooth; microphone key assignments belong to the desktop app.

Choose FNK0104B-MONITOR in the browser picker. Keep USB connected if you use Desktop controls; OS Bluetooth pairing is unnecessary. These nearby Bluetooth preferences are unauthenticated. Wi-Fi passwords use the protected setup below.

1. Choose board controls

Slots are Desktop shortcuts, not a count of running agents. Tap the board's Micro header to see command keys. Direction buttons follow Desktop's analog-stick mappings.

Choose numbers or robot avatars with either layout. Robots represent Desktop slots, keep their status strips and stay the same until reboot. Requires monitor 0.7.1 or newer.

Connect to monitor settings with firmware 0.6.3 or newer. A disabled selector means microphone settings are unavailable through this connection; it does not turn off the board’s Hold to talk button.

The screen stays awake during active work or open board audio. Once idle, touch wakes it after the selected timeout.

Rear status LED and patterns

Green: working. Yellow: work ended. Red: needs attention or error. Defaults to one minute per status change; repeated updates do not keep it lit. Settings are saved on the board. Update firmware if these controls are unavailable.

Pattern controls require monitor 0.8.3 or newer. Solid, blink and breathe keep the status color. Rainbow cycles through all colors instead. A longer cycle is slower. Every pattern stops at your status timeout.

Preview stays in the browser. Save board settings to apply the patterns to the rear LED.

Idle display and photo timing

Requires monitor 0.8.0. The usage bar stays live. Activity or touch restores the monitor. Screen-off still counts from the last activity, so choose an idle delay shorter than its timeout.

Firmware updates

Updates download over Wi-Fi. Bluetooth starts the update and shows progress. Finish voice activity and keep power connected until the board restarts.

Monitor 0.8.5 keeps saved bridge details, Wi-Fi and board preferences across public OTA updates. On older firmware, compiled bridge details must be entered once in connection setup after updating.

Connect to your monitor to check its installed version.

If older firmware reports “Update catalog unavailable”, see USB recovery for the moved update address.

First install and compatibility

Install monitor 0.7.1 or newer over USB once to enable wireless updates. A 0.7.0 board also needs USB once for its reproducible speech-model baseline. This migration keeps saved Wi-Fi and board preferences, moves speech models and replaces old firmware/filesystem data. Keep “Erase device” unchecked to preserve settings. Model or partition changes still require USB.

2. Map the keys in Desktop

Hold to talkHold: mic on
Release: mic off
VoiceTap: mic on/off
Optional setup
SendReview your prompt
Then send
  1. Connect the board over USB and let Desktop discover it. Select Microphone (TinyUSB UAC1) as the input and allow microphone access.
  2. Open Settings → Codex Micro → Microphone key. Keep the first microphone key on Push to talk. This is Desktop's documented default, but check it if you previously remapped the key.
  3. For the optional Voice button, enable Use separate microphone keys. Keep the first switch on Push to talk and assign the second to Voice Chat, if offered.
  4. Select Hold to talk + Voice toggle here and save. Tap Voice to open board audio and request a desktop voice chat. Tap again to close board audio and toggle the desktop microphone. Hold Voice to request ending the chat. Turn Voice off before dictating a prompt.

Firmware updates below explain the one-time USB install and future wireless updates.

Saving here changes the board only. This page cannot set or verify Desktop's microphone mappings. If your app does not offer separate Voice Chat assignments, keep Hold to talk.

What do Mic ON and Mic OFF mean?

On monitor firmware 0.6.3 or newer, Mic OFF: the board sends silence over USB. Mic ON: the board is sending live microphone audio to a host stream. Waiting: audio is requested on the board but the host has not opened its stream.

The board does not confirm Desktop recording or voice-session state. Tap Voice again stops board audio; the chat may stay open. Hold to end it in Desktop. A one-second hold also closes the board audio gate.

The sensor still samples locally. Microphone off means outgoing board USB audio is silenced, not physical power-off. Saving settings, rebooting or disconnecting closes audio. Voice listening starts off after each reconnect.

Hold to talk uses a strict hold/release audio gate. Desktop's double-tap dictation gesture will not keep this board's audio open after release; use the separate Voice button for continuous conversation.

Official microphone settings guide ↗ · Other custom actions

Photos on the SD card

Choose JPEG, PNG or WebP images. This browser crops and resizes them to the photo area; the preview shows what will appear below the usage bar. Up to eight photos are stored on the board’s SD card. Finish voice or firmware-update activity before uploading.

Connect to monitor 0.8.0 or newer to manage photos.

For the monitor or Wi-Fi over BLE firmware

Set up Wi-Fi

The monitor opens setup when no Wi-Fi is saved. To change networks, hold its Wi-Fi indicator for three seconds. Read the 12-character code on the board, then connect below. The standalone Wi-Fi over BLE firmware also works.

Wi-Fi network

Save a 2.4 GHz network. The monitor restarts after connecting; open setup again if you also need to configure the bridge.

Monitor bridge

Monitor 0.8.5 or newer. Hold the board’s Wi-Fi indicator for three seconds, enter its code above and connect securely. Configure Wi-Fi first if needed, then open setup again for the bridge.

Use the same token as your computer’s bridge. Leave blank to keep an existing saved token. The saved token is never read back or stored by this page.

Connect securely to configure the bridge. Saved bridge details, Wi-Fi and monitor preferences survive compatible OTA updates.

Check that this is the trusted HTTPS setup page. The device name alone does not prove identity. Enter the code from your own board and wait for “Connected securely” before entering a password. The code authenticates an encrypted provisioning session; this page does not save your password. The monitor returns automatically after setup.

For the Codex monitor

Run the local server

The board polls a Python bridge on your computer over Wi-Fi. This website handles Bluetooth settings; the bridge supplies live Codex status and usage. Keep the board and server on a network where they can reach each other.

Bridge launch instructions
  1. Save Wi-Fi on the board. Use the Wi-Fi setup section above if needed. The monitor reuses those saved credentials.
  2. Set the bridge address and key. Use the encrypted Monitor bridge form above to save your computer’s LAN address, port (usually 8765) and a generated private token on the board. Configure the same token on the computer using MONITOR_TOKEN or the ignored local monitor_secrets.h.
  3. Start the bridge from the repository root in the environment with your running, signed-in Codex app-server:
    MONITOR_HOST=0.0.0.0 MONITOR_LOG_REQUESTS=1 python3 monitor-server/run.py
    Keep that terminal running. Allow TCP 8765 on your trusted LAN. Optional voice commands require a separately running speech service; the full guide includes its launch settings.
  4. Install the monitor once from the repository root:
    pio run -e codex-monitor
    pio run -e codex-monitor -t upload
    pio device monitor -b 115200
    Look for monitor_status integration=connected and numeric quotas. The bridge should log board requests to /v1/status returning HTTP 200.

On monitor 0.8.5+, save bridge details through encrypted connection setup above. They stay on the board across compatible public OTA updates. Firmware older than 0.8.5 needs an update before that form is available.

Running the server in WSL?

Windows browser Bluetooth access and the board's Wi-Fi access to WSL are separate. In WSL 2 NAT mode, localhost working on Windows does not make the bridge reachable from the board. Configure Windows TCP forwarding to WSL and allow the port through the private-network firewall. Use the Windows LAN address in the board header, not localhost or WSL's NAT address.

WSL forwarding commands and verification

Full server-to-board setup guide · Bridge configuration and API