Deployable exoclaw image for MicroPython boards (ESP32-S3 and friends)
Project description
exoclaw-firmware
Deployable exoclaw image for MicroPython boards. Bundles core
exoclaw + the MP-compatible plugin set (conversation, OpenAI
provider) + board-specific boot wrappers, so flashing one tree
gets you a chip that can hold a conversation with an LLM.
This is the equivalent of exoclaw-nanobot for the chip target —
where nanobot is "what you run on a server", exoclaw-firmware
is "what you flash to a board".
Supported boards
| Board | RAM | Status | Notes |
|---|---|---|---|
| ESP32-S3 (8 MB PSRAM) | 8 MB | Supported | Reference target; SD card recommended. |
| ESP32 (4 MB) | 4 MB | Should work | Tighter; turn off any optional plugins. |
| Raspberry Pi Pico W | 264 KB | Unlikely | RAM budget too small for an LLM agent loop. |
Adding a new board: copy boards/esp32_s3/ to boards/<your_board>/,
adapt the boot.py for that platform's WiFi / SD / clock APIs.
Quickstart (ESP32-S3)
- Wire up an SD card (optional but recommended for session
storage). Default pins in
boards/esp32_s3/boot.py:sclk=12, mosi=11, miso=13, cs=10. - Flash MicroPython 1.27+ to the board (out of scope for this package — see the MicroPython downloads page).
- Copy
boards/esp32_s3/secrets.py.exampletoboards/esp32_s3/secrets.pyand fill inWIFI_SSID,WIFI_PASSWORD,OPENAI_API_KEY. - Stage and flash:
cd packages/exoclaw-firmware mise run flash
- Reset the board (or
mise run replto watch output). On first boot you should seeboot: SD mounted,boot: WiFi up,boot: clock synced, then ayou>prompt — type a message and press enter to chat with the agent over USB serial.
What's in the flash image
The mise run stage task assembles the deployable tree under
.stage/:
.stage/
├── boot.py # WiFi + SD + NTP setup
├── main.py # runs run_serial_chat() (USB-CDC chat loop)
├── secrets.py # gitignored; your credentials
├── exoclaw/ # core (with _cpython.py stripped)
├── exoclaw_conversation/ # MP-compatible conversation plugin
├── exoclaw_provider_openai/ # MP-compatible OpenAI provider
└── exoclaw_firmware/ # this package's app.py
Files matching _cpython.py are stripped at stage time — they
hold CPython-only implementations that the MP runtime never
imports. Same trick the core MP coverage runner uses.
Channels
The default channel after flash is USB-CDC serial. Plug the
board into a host, open mpremote repl (or screen /dev/cu.usbmodem* 115200), hit reset, and you'll see:
boot: WiFi up: ('192.168.…', …)
boot: clock synced via NTP
main: ready — type a message and press enter (Ctrl-C to exit)
you>
Type, press enter, get a response. No chat-platform tokens, no webhook URLs — just stdin/stdout over USB.
For network-side channels, swap the run_serial_chat call in
main.py for your own loop on top of build_agent (which returns
a (provider, conversation) pair). Common patterns:
- HTTP long-poll (Telegram-style) — easiest cloud channel; one outbound request per poll cycle.
- MQTT subscriber (
umqtt.simple) — IoT-native, integrates with Home Assistant / AWS IoT / HiveMQ. - HTTP webhook server (
asyncio.start_server) — local-network only unless you tunnel. - WebSocket — single long-lived connection, lower latency than long-poll, needs a WS client.
- BLE GATT — phone companion app pattern, range ~10m.
Pick what fits the deployment. The serial loop stays useful as a debug channel even after you wire a cloud channel.
mise tasks
| Task | What it does |
|---|---|
mise run stage |
Assemble .stage/ from core + plugins + board files. |
mise run flash |
Copy .stage/ onto the attached board via mpremote. |
mise run repl |
Drop into a REPL on the board. |
mise run run |
Exec main.py on the board without flashing. |
mise run wipe |
Erase the board's filesystem (destructive). |
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file exoclaw_firmware-0.6.0.tar.gz.
File metadata
- Download URL: exoclaw_firmware-0.6.0.tar.gz
- Upload date:
- Size: 19.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ed3836408313bdcd4036242741f27fdcc048d8a0ae3db17005667b090d6353fd
|
|
| MD5 |
473ad3a8401385a27839757fc85dc4e1
|
|
| BLAKE2b-256 |
e8586359ceac44d27906d03bf7c34522f373e035c6fe1b8cc37b3881b0b6cfe0
|
File details
Details for the file exoclaw_firmware-0.6.0-py3-none-any.whl.
File metadata
- Download URL: exoclaw_firmware-0.6.0-py3-none-any.whl
- Upload date:
- Size: 12.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c262815fdd686a2d3c1d020a3df567757216382f35364cd9901bcba4dd8ef57a
|
|
| MD5 |
2aa5332d098ec6937ef62c718a67fadf
|
|
| BLAKE2b-256 |
67405491da2ce64657f97d589bb1570b179a063d2dc7d9cdb49a7dfd4a99b61e
|