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). |
Release files for exoclaw-firmware 0.11.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| exoclaw_firmware-0.11.0.tar.gz | 34.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| exoclaw_firmware-0.11.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 49.5 kB
Release files / exoclaw_firmware-0.11.0.tar.gz
| Download URL | exoclaw_firmware-0.11.0.tar.gz |
|---|---|
| Size | 34.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3e135ac1dba8a262bab28dfc2649940c9309f11fc4a20d372dd6f3c901812738
|
|
BLAKE2b-256 checksum How to use checksums |
016fe57e986bd59f747d31f871a67df4a726fc79e0b106037a6fd8fb436d52d7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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}
|
Release files / exoclaw_firmware-0.11.0-py3-none-any.whl
| Download URL | exoclaw_firmware-0.11.0-py3-none-any.whl |
|---|---|
| Size | 15.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ac1c8097ecd0bbc92b1177b37746a635a1f3111a0017e956c24bc8cfe3d54211
|
|
BLAKE2b-256 checksum How to use checksums |
9cdc2924afa2fe88fb6e76cb289377162c7478e99448572829197059412699af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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}
|