Getting a MicroPython board connected to a cloud IoT platform has always meant a certain amount of laptop wrangling. Install Python. Install esptool. Install mpremote or Thonny. Figure out which serial port your board is on. Copy an API key from a dashboard into a text file. Push that text file to the board. Reboot. Debug why it didn't connect.
Even with good CLI tools, that's a lot of steps for something a non-developer might reasonably want to do: hand a technician a box of sensors and ask them to bring them online.
The Tendrl Device Console is our take on removing that friction. It's a browser-based UI, served by the existing tendrl-dev-mcp binary, that talks to your board directly using WebSerial. There's a live REPL terminal, a tree-view file browser with a real code editor, and a one-form provisioning flow. No Python on the host. No mpremote. No AI required (though it composes with our MCP surface if you want it).
What it looks like
Three panels on one page:
- Connection: plug the board in, click Connect, pick the port. The console detects the board, MicroPython version, and free heap, then picks the right install tier for you (Full ≥ 300 KB free heap, Minimal for lower-memory boards, Blocked for boards below the SDK's 150 KB floor).
- Terminal: a live serial monitor plus a Python input. Bare expressions auto-print like a normal REPL (
gc.mem_free()→412032). Tracebacks render inline. Interrupt and Clear are one click away. - Files: an expandable file tree on the left, a full CodeMirror editor on the right. Python and JSON syntax highlighting, line numbers, bracket matching. Green dot when you have unsaved changes. ⌘S to save. Great for reading
config.json, editingmain.py, or checking what's actually on a device before you overwrite it. - Provision: a single form with Tendrl API key, Contact endpoint, install tier, optional streaming module, and optional Wi-Fi SSID + password. Click Start. The console writes
/config.json, pushes the SDK over the serial link, and reboots. (Wi-Fi is optional because the SDK is written over serial, not fetched over the air; leave it blank for an Ethernet board, or to set the network later.)
Requirements
- The
tendrl-dev-mcpbinary (macOS, Linux, or Windows; download here). - A recent Chrome, Edge, Opera, or Firefox (144+). Safari and iOS do not support WebSerial; for those users we fall back to the CLI.
- A MicroPython-capable board with USB-to-serial. ESP32 (any variant), Raspberry Pi Pico W, OpenMV, or anything else on the supported list.
Two-minute walkthrough
- Run the binary in web mode:
Terminal (one time)
./tendrl-dev-mcp web # → opens http://127.0.0.1:8811 in your default browser - Plug in your board and click Connect Device. The browser shows a native picker with your USB serial devices; pick the one that matches your board.
- The Connection card fills in: Board, Platform, MicroPython version, Free heap, and a recommended install tier badge.
- Grab your API key from app.tendrl.com (Entities → your entity → API Key), paste it into the Provision form, add Wi-Fi if the board needs it, and click Start provisioning. Progress renders as a checklist with a collapsible log.
- Once the device reboots, watch it show up in the Contact dashboard within a few seconds.
Three concrete use cases
1. SMB or field-tech fleet deployment
A small business receives ten sensors that need to go on ten walls. Their operator doesn't know Python and shouldn't have to. With the Console, the steps are: run the binary once, then for each sensor: plug in, click Connect, paste API key, hit Start. Two minutes per device. No terminal. No copy-paste of Python one-liners. No "what's a mip?" conversations.
2. Rapid device debugging without the mpremote dance
You've got a device that isn't sending data. Instead of firing up mpremote, opening a REPL, running os.listdir(), then cat-ing config.json, then reading serial output for boot messages, you open the Console tab, connect, expand /flash, click config.json to read it (with syntax highlighting), then click Terminal to see live logs. Every operation the CLI can do, the Console does with fewer keystrokes and better feedback.
3. Classroom, workshop, and demo scenarios
A workshop instructor with 20 attendees can't ask everyone to install Python 3, pip install esptool, and configure their PATH. The Console works on any modern browser on any OS. Attendees run one binary, open a page, and they're online in the same 60 seconds. Same for showing a customer, an investor, or a coworker how something works: a real interactive session, not a screenshare of your terminal.
Everything is local
Worth calling out: the Console runs entirely on your machine. The HTML/JS is served from localhost. WebSerial opens the port directly in the browser, so the Tendrl backend never sees your device. The only outbound traffic is what you'd expect: the device fetching the SDK from your Tendrl server during the network install, and (after reboot) the device sending its own MQTT publishes to app.tendrl.com with your API key.
Also built in: the Device tab in Contact
The same UI now lives in the Contact dashboard itself, as a Device tab on the entity detail page, for when you're already looking at an entity and want to bind hardware to it in place. Same WebSerial layer, but with a few things the standalone tool can't do because it doesn't have your Contact session:
- No key to paste. Contact mints a device-scoped API key for you when you provision, scoped to that entity's role. It shows up in the entity's API Keys list and can be revoked on its own without affecting other devices.
- It reads the device first. On connect it reads the existing
config.json, so it knows whether to provision fresh or just update the Wi-Fi on a device that's already bound. - Editor-only. The tab appears only for MQTT-enabled entities, and only for users with edit permission; provisioning binds hardware and creates keys, so it's the same trust level as editing the entity.
- Secrets stay hidden. API keys and Wi-Fi passwords in
config.jsonare masked in both the file editor and the terminal by default, so a screen share or screenshot doesn't leak them. One click reveals them when you actually need to.
If you're using MicroPython entities today, open one in the dashboard and look for the Device tab.
Try it
Grab the binary and run ./tendrl-dev-mcp web for the standalone console, or open an entity in Contact and switch to the Device tab. The MCP-server mode is unchanged: the same binary still exposes all its tools over stdio for Claude, Cursor, and any MCP client.
Tendrl