esp32.diy

Forrest Note: AI Voice Notes on ESP32-S3 with Whisper & GPT

Oct 13, 2026 · 6 min read

Intermediate 11 stars 5 forks C MIT Updated 2026-06-24
TL;DR Forrest Note turns an ESP32-S3 e-ink board into a one-button AI voice recorder: hold a button, speak, and seconds later a clean Markdown note — title, summary, and all — lands in your GitHub-backed Obsidian vault. It builds on the open-source Pala Note hardware and adds Whisper transcription, GPT-4o-mini cleanup, OTA updates, and zero secrets in code.
What you need
  • Waveshare ESP32-S3 1.54-inch e-Paper AIoT Development Board (B/W variant)
  • ESP32-S3 N8R8 (8 MB flash, 8 MB OPI PSRAM)
  • 1.54-inch 200×200 e-paper display (black/white)
  • ES8311 / ES7210 audio codec
  • Onboard microphone and speaker
  • microSD / TF card
  • RTC chip
  • SHTC3 temperature/humidity sensor
  • LiPo battery with onboard charge management
  • Record button (GPIO0 / BOOT)
  • Power button (GPIO18)
BoardWaveshare ESP32-S3 1.54" e-Paper AIoT Dev Board (B/W)
FrameworkArduino (arduino-cli, core 3.2.0)
LanguageC
AI ModelsOpenAI Whisper (transcription) + gpt-4o-mini (cleanup)
LicenseMIT
DifficultyIntermediate

What You Will Build

Forrest Note is firmware that turns a Waveshare ESP32-S3 e-ink development board into a pocket AI notepad. The workflow is deliberately minimal: hold the record button, say whatever is on your mind, and release. The device transcribes your audio with OpenAI Whisper, sends the raw transcript to gpt-4o-mini for cleanup, and pushes a finished Markdown file — complete with a YAML frontmatter title, a one-sentence summary callout, topic backlinks for Obsidian, and the verbatim transcript tucked in a foldable quote block — directly to a GitHub repository. Open that repository as an Obsidian vault and your notes organise themselves.

This is a fork of the original Pala Note project, which contributed the hardware bring-up, e-ink and audio drivers, recording engine, and 3D-printable enclosure. Forrest Note adds the AI cleanup layer, GitHub sync, runtime Wi-Fi and key provisioning, real TLS certificate validation, OTA updates, two-way delete, and calendar event extraction from note content.

What You Need

Hardware

Accounts and keys

None of these go into source code. You enter them through a captive portal after flashing.

Software (build machine)

Typical use cases

Instant Voice Capture

One button press records your thought. No app to open, no screen to unlock — just hold, speak, release, and walk away.

On-the-Go AI Cleanup

GPT-4o-mini removes filler words and false starts from your transcript, generating a coherent note body, a title, and topic backlinks automatically.

GitHub and Obsidian Sync

Every note is pushed as a Markdown file to your own GitHub repository, named by topic and ready to open as an Obsidian vault with zero manual organisation.

Calendar Event Extraction

When a note mentions a dated plan, the AI resolves relative dates and writes structured event frontmatter — ready to feed a calendar sync bridge.

How the AI Pipeline Works

Understanding the pipeline helps when things go wrong.

  1. Record: holding the record button captures audio through the ES7210 microphone codec.
  2. Transcribe: on sync, the raw audio file is sent to OpenAI's whisper-1 model, which returns a verbatim transcript.
  3. Enrich: the firmware sends that transcript to gpt-4o-mini, which returns a structured response containing a one-word topic title, a one-sentence summary, a rewritten body (filler words, false starts, and repetition removed, but every fact and number preserved), up to six topic tags, and — when the note describes a dated plan — a calendar event object with resolved start and end times.
  4. Write: the firmware assembles a Markdown file named after the topic (e.g. Soho.md), embedding all of the above in YAML frontmatter and Obsidian-compatible callout blocks. The verbatim transcript is kept in a foldable > [!quote]- Original transcript callout.
  5. Push: the file is uploaded to your GitHub repository via the GitHub Contents API over HTTPS validated against the Mozilla CA bundle.

A chunked-HTTP decoder is included to handle OpenAI's Transfer-Encoding: chunked responses correctly — without it the enrichment step silently fails.

Build and Flash

Step 1 — Install arduino-cli

# macOS (Homebrew)
brew install arduino-cli
# or the official installer
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh

Step 2 — Add the ESP32 core and libraries

arduino-cli config init
arduino-cli config add board_manager.additional_urls \
  https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
arduino-cli core update-index
arduino-cli core install esp32:[email protected]
arduino-cli lib install "Adafruit GFX Library" "ArduinoJson"

Step 3 — Compile

Run this from the root of the cloned repository:

arduino-cli compile \
  -b "esp32:esp32:esp32s3:PSRAM=opi,PartitionScheme=custom,CDCOnBoot=cdc,FlashSize=8M" \
  ./forrest_note

A successful build reports something like Sketch uses ~1.43 MB (8%) of program storage space.

Step 4 — Flash (read the BOOT quirk first)

This board cuts power to its USB port about one second after plug-in unless it is parked in the ROM bootloader. If you plug in and immediately try to flash you will get a port-not-found error. The correct sequence:

  1. Press and hold the record button (BOOT / GPIO0).
  2. While still holding, plug in the USB-C cable.
  3. Keep holding through the entire write.
# Find your port first
arduino-cli board list

# Then compile and upload in one step
arduino-cli compile --upload -p /dev/cu.usbmodemXXXX \
  -b "esp32:esp32:esp32s3:PSRAM=opi,PartitionScheme=custom,CDCOnBoot=cdc,FlashSize=8M" \
  ./forrest_note

Replace /dev/cu.usbmodemXXXX with your actual port (/dev/ttyACM0 on Linux, COMx on Windows). When the terminal prints Hash of data verified. and Hard resetting..., release the button.

Arduino IDE alternative: open forrest_note/forrest_note.ino, select ESP32S3 Dev Module, and set PSRAM → OPI PSRAM, Partition Scheme → custom, USB CDC On Boot → Enabled, Flash Size → 8 MB. Hold BOOT, plug in, click Upload.

First-Time Setup via the Hotspot

The firmware ships with no credentials stored. On first boot the device broadcasts an open Wi-Fi network named ForrestNote-Setup.

  1. Power on the device.
  2. On your phone or laptop, connect to ForrestNote-Setup.
  3. Open a browser to http://192.168.4.1. Most phones pop up the captive portal automatically.
  4. Fill in the form:
Field What to enter
Wi-Fi network (SSID) Your 2.4 GHz network name
Wi-Fi password Your Wi-Fi password
OpenAI API key Your sk-... key
GitHub repo yourname/Notes
Branch main (default)
Vault folder VoiceNotes (default)
GitHub token Your fine-grained PAT with Contents R/W
Enable GitHub sync tick on
AI titles + topic links tick on
  1. Tap Save. The device stores everything in on-device NVS (non-volatile storage) and reboots onto your Wi-Fi.

You can revisit this page any time at http://<device-ip>/provision. Leaving a field blank keeps its current value. OTA firmware updates are also available at /ota in the same portal.

Extending the Build and Known Limitations

Ideas to take it further

Limitations to keep in mind

Verdict

Forrest Note is a well-thought-out upgrade to open-source voice-note hardware that earns its Intermediate rating: the build itself is straightforward with arduino-cli, but you need API keys, a GitHub PAT, and a specific board to get started. If you already have or plan to buy the Waveshare ESP32-S3 e-paper board, this firmware turns it into a genuinely useful daily-carry AI notepad that keeps your data in a repository you control.

Sources

github.comForrest404/forrest-notes — repository & README

Facts in this article come from the project's public README and GitHub metadata at the time of writing. Images belong to their respective owners and link back to the original source.