nlothian/earwing

The EarWing local transcription device

JavaScript

3

56 commits

updated Oct 5, 2026

See the code

See what people are saying

README

EarWing - Cloud free private transcription

EarWing Logo

Earwing is a 3D printable beam-forming microphone array and transcription tool. It offloads transcription and meeting note generation to browser-hosted, private models and uses a ESP32 dev board to display meeting notes on the device.

This keeps it entirely cloud-free and self-hosted.

Back View

Notes View

Hardware

Installation

Build the hardware

  • Print the 3d Print from ./3dprint
  • Wire the four INMP441 microphones to the ESP32:

ESP32 to INMP441 wiring diagram

Flash the firmware onto the ESP32

The firmware and the web UI served by the ESP32 are flashed separately. You need to upload both for the first installation.

  1. Install PlatformIO Core and Node.js 22 with npm. Make sure pio, node and npm are available in your terminal. If pio is missing after installation, follow PlatformIO's shell setup instructions.

  2. Connect the Freenove FNK0104 to your computer through its native USB port using a USB data cable.

  3. From the repository root, build and upload the firmware:

    pio run -d code -e fnk0104 -t upload
    

    PlatformIO downloads the toolchain and libraries on the first build. The board, flash and PSRAM settings are already configured in code/platformio.ini.

  4. Build and upload the web UI:

    cd site
    npm ci
    npm run build:device
    pio run -d ../code -e fnk0104 -t uploadfs
    cd ..
    

    build:device builds the site and packs it into code/data/. uploadfs uploads that directory as a LittleFS image. For later web UI updates, npm run deploy from site/ combines the build and filesystem upload; firmware changes still need the command in step 3.

  5. Press RESET if the board does not restart after uploading. On a fresh installation, connect your computer or phone to the open earwing Wi-Fi network and visit http://192.168.4.1/ if the setup page does not open automatically. Select your Wi-Fi network and enter its password.

  6. Reconnect your computer to the same Wi-Fi network as the device, then open https://earwing.local/. The device uses a self-signed certificate; the status page at /status links to the certificate and trust instructions. The device's screen also shows its address. See the web app README for browser requirements and model setup.

If uploading fails: close any serial monitor and run pio device list to find the board's port. PlatformIO normally detects it automatically, but you can specify it with --upload-port on either upload command, for example from the repository root:

pio run -d code -e fnk0104 -t upload --upload-port /dev/cu.usbmodemXXXX
pio run -d code -e fnk0104 -t uploadfs --upload-port /dev/cu.usbmodemXXXX

Replace the example port with your device's port (such as /dev/ttyACM0 on Linux or COM3 on Windows). If the board does not enter download mode, hold BOOT, press and release RESET, then release BOOT and retry the upload. Check the port again after entering download mode, and press RESET after flashing to start the firmware. This follows Espressif's USB flashing procedure.

For diagnostic output, run this from the repository root:

pio device monitor -d code -e fnk0104

The monitor uses the configured 115200 baud rate. Exit it with Ctrl+C before uploading again. To reopen Wi-Fi setup later, hold BOOT for two seconds while the firmware is running, or use Settings → WiFi settings on the touchscreen.

nlothian/earwing

The EarWing local transcription device

JavaScript

3

56 commits

updated Oct 5, 2026

See the code

See what people are saying

README

EarWing - Cloud free private transcription

EarWing Logo

Earwing is a 3D printable beam-forming microphone array and transcription tool. It offloads transcription and meeting note generation to browser-hosted, private models and uses a ESP32 dev board to display meeting notes on the device.

This keeps it entirely cloud-free and self-hosted.

Back View

Notes View

Hardware

Installation

Build the hardware

  • Print the 3d Print from ./3dprint
  • Wire the four INMP441 microphones to the ESP32:

ESP32 to INMP441 wiring diagram

Flash the firmware onto the ESP32

The firmware and the web UI served by the ESP32 are flashed separately. You need to upload both for the first installation.

  1. Install PlatformIO Core and Node.js 22 with npm. Make sure pio, node and npm are available in your terminal. If pio is missing after installation, follow PlatformIO's shell setup instructions.

  2. Connect the Freenove FNK0104 to your computer through its native USB port using a USB data cable.

  3. From the repository root, build and upload the firmware:

    pio run -d code -e fnk0104 -t upload
    

    PlatformIO downloads the toolchain and libraries on the first build. The board, flash and PSRAM settings are already configured in code/platformio.ini.

  4. Build and upload the web UI:

    cd site
    npm ci
    npm run build:device
    pio run -d ../code -e fnk0104 -t uploadfs
    cd ..
    

    build:device builds the site and packs it into code/data/. uploadfs uploads that directory as a LittleFS image. For later web UI updates, npm run deploy from site/ combines the build and filesystem upload; firmware changes still need the command in step 3.

  5. Press RESET if the board does not restart after uploading. On a fresh installation, connect your computer or phone to the open earwing Wi-Fi network and visit http://192.168.4.1/ if the setup page does not open automatically. Select your Wi-Fi network and enter its password.

  6. Reconnect your computer to the same Wi-Fi network as the device, then open https://earwing.local/. The device uses a self-signed certificate; the status page at /status links to the certificate and trust instructions. The device's screen also shows its address. See the web app README for browser requirements and model setup.

If uploading fails: close any serial monitor and run pio device list to find the board's port. PlatformIO normally detects it automatically, but you can specify it with --upload-port on either upload command, for example from the repository root:

pio run -d code -e fnk0104 -t upload --upload-port /dev/cu.usbmodemXXXX
pio run -d code -e fnk0104 -t uploadfs --upload-port /dev/cu.usbmodemXXXX

Replace the example port with your device's port (such as /dev/ttyACM0 on Linux or COM3 on Windows). If the board does not enter download mode, hold BOOT, press and release RESET, then release BOOT and retry the upload. Check the port again after entering download mode, and press RESET after flashing to start the firmware. This follows Espressif's USB flashing procedure.

For diagnostic output, run this from the repository root:

pio device monitor -d code -e fnk0104

The monitor uses the configured 115200 baud rate. Exit it with Ctrl+C before uploading again. To reopen Wi-Fi setup later, hold BOOT for two seconds while the firmware is running, or use Settings → WiFi settings on the touchscreen.