{"slug": "show-hn-i-let-an-ai-agent-brick-my-2-51-esp32-on-purpose", "title": "Show HN: I let an AI agent brick my $2.51 ESP32 on purpose", "summary": "NanoForgeFlow released nff, an open-source MCP server that lets coding agents like Claude directly control ESP32-class hardware, enabling autonomous firmware development, over-the-air deployment, and remote diagnosis. The tool, which costs $2.51 for an ESP32 board, provides 34 tools over streamable HTTP and supports over 1,000 boards across 40 platforms, with features like live on-chip debugging and local-first operation.", "body_md": "[docs](https://www.nanoforgeflow.com/docs) ·\n[quick start](https://www.nanoforgeflow.com/docs#quickstart) ·\n[mcp tools](https://www.nanoforgeflow.com/docs#mcp-tools) ·\n[cli](https://www.nanoforgeflow.com/docs#cli) ·\n[platform](https://nanoforgeflow.com) ·\n[discord](https://discord.com/invite/QkFCS3mShe)\n\nnff is an MCP server that gives coding agents direct control over physical hardware — on the bench during development, and in the field for maintenance and diagnosis.\n\nConnect your board over USB and Claude writes, compiles, flashes, and reads serial output autonomously. Deploy devices with the `nff-sdk-c`\n\nlibrary and Claude can reach them remotely: capture crash state, diagnose failures, and push fixes — without physical access.\n\nnff is the open-source bench CLI of the— an end-to-end, agent-driven system for developing, shipping, and operating ESP32-class firmware (bench → OTA → fleet diagnosis). This repo and the device library ([nff platform]`nff-sdk-c`\n\n) are the twoMIT-licensedpieces that run on your laptop and hardware; the hosted backend is proprietary.\n\n```\nyou: \"Run the sensor init sequence and assert the calibration values over serial\"\nLLM: [writes firmware] → [compiles] → [flashes ESP32] → [reads serial] → returns structured output\n\nyou: \"Why did the unit in the field just hard-fault?\"\nLLM: [captures panic over OTA] → [reads registers + backtrace] → \"Stack overflow in your sensor ISR at line 47\"\n```\n\n**the bench loop, in one conversation**— no switching between editor, terminal, and serial monitor. The agent iterates on firmware in response to serial output, catches exceptions, and reflashes.**field maintenance when the firmware is dead**— a crashed bare-metal MCU has no shell, no SSH, no process table. nff captures registers, stack, memory, and backtrace and routes them to a cloud agent that explains the failure and drives recovery. This is the gap Mender, balena, and similar OTA tools cannot fill: they need a living network client inside the firmware.**ship it over the air**—`nff ota deploy`\n\nturns the binary you just built into a staged, ECDSA-signed rollout with per-device tracking and automatic rollback;`nff fleet --watch`\n\nshows it land.[ota →](https://www.nanoforgeflow.com/docs#ota)**board-universal**— any of PlatformIO's ~1000+ boards across ~40 platforms (every ESP32 variant, RP2040/Pico, all STM32 families, AVR, SAMD, Teensy, nRF52, Uno R4, RISC-V…), toolchain auto-installed on first build. arduino-cli remains available as a second backend.[boards →](/GLechevalier/nff-core/blob/main/docs/BOARDS.md)**live on-chip debugging**— real breakpoints, call stacks, and variable inspection over JTAG/SWD (OpenOCD + GDB, driven by nff).[debug →](https://www.nanoforgeflow.com/docs#debug)**local-first**— compile, flash, monitor, debug, and the MCP tools need no account and never open a browser. Only OTA,`repair`\n\n, and`agent`\n\nrequire a sign-in.**one Rust binary**— self-contained, no Python runtime, and it self-updates in the background like Claude Code does.\n\nmacOS / Linux:\n\n```\ncurl -fsSL https://nanoforgeflow.com/install.sh | sh\n```\n\nWindows (PowerShell):\n\n```\nirm https://nanoforgeflow.com/install.ps1 | iex\n```\n\nThen plug in your board and run:\n\n```\nnff init      # detects the board, writes config, registers + starts the MCP server\nnff doctor    # verify\n```\n\nRestart Claude Code so it picks up the MCP server, then just describe what you want:\n\n```\nyou: \"Flash sketches/blink_esp32 and confirm the LED is toggling over serial\"\nLLM: [compiles] → [flashes ESP32] → [reads serial] → \"LED toggling at 1 Hz, confirmed\"\n```\n\nFull install options, `--cloud`\n\nsign-in, and first-run detail: [quick start →](https://www.nanoforgeflow.com/docs#quickstart)\n\n34 tools over streamable HTTP on `127.0.0.1:3010/mcp`\n\n, started in the background by `nff init`\n\n.\n\n| Group | Tools | Covers |\n|---|---|---|\nBench |\n7 | `list_devices` , `compile` , `flash` , `serial_read` /`write` , `reset_device` , `get_device_info` |\nDebug |\n14 | breakpoints, call stack, variables, registers, memory, stepping, raw GDB |\nField |\n8 | `diagnose` (local, no login), `repair` (cloud, ELF-symbolized) + auth lifecycle |\nFleet & OTA |\n5 | `ota_deploy` , `ota_status` , `ota_deployments` , `ota_devices` , `fleet_status` |\n\nFull signatures and return shapes: [mcp tools →](https://www.nanoforgeflow.com/docs#mcp-tools)\n\neverything lives at ** nanoforgeflow.com/docs**:\n\n[quick start](https://www.nanoforgeflow.com/docs#quickstart)·\n\n[cli reference](https://www.nanoforgeflow.com/docs#cli)·\n\n[configuration](https://www.nanoforgeflow.com/docs#config)·\n\n[mcp tools](https://www.nanoforgeflow.com/docs#mcp-tools)·\n\n[using claude code](https://www.nanoforgeflow.com/docs#claude-code)·\n\n[device sdk](https://www.nanoforgeflow.com/docs#sdk)·\n\n[provisioning](https://www.nanoforgeflow.com/docs#provisioning)·\n\n[ota deploys](https://www.nanoforgeflow.com/docs#ota)·\n\n[git-push deploys](https://www.nanoforgeflow.com/docs#git-push)·\n\n[fleet status](https://www.nanoforgeflow.com/docs#fleet)·\n\n[crash diagnosis](https://www.nanoforgeflow.com/docs#diagnosis)·\n\n[on-chip debug](https://www.nanoforgeflow.com/docs#debug)·\n\n[power](https://www.nanoforgeflow.com/docs#power)·\n\n[security](https://www.nanoforgeflow.com/docs#security)\n\nIn-repo reference ([docs/](/GLechevalier/nff-core/blob/main/docs)): [boards & USB ids](/GLechevalier/nff-core/blob/main/docs/BOARDS.md) · [self-update & config](/GLechevalier/nff-core/blob/main/docs/CONFIGURATION.md) · [roadmap](/GLechevalier/nff-core/blob/main/docs/ROADMAP.md) · [architecture](/GLechevalier/nff-core/blob/main/ARCHITECTURE.md)\n\nBugs and feature requests go to [GitHub Issues](https://github.com/GLechevalier/nff/issues); read [CONTRIBUTING.md](/GLechevalier/nff-core/blob/main/CONTRIBUTING.md) before opening a PR — adding a board is usually a two-line change. Please follow the [Code of Conduct](/GLechevalier/nff-core/blob/main/CODE_OF_CONDUCT.md), and report vulnerabilities via [SECURITY.md](/GLechevalier/nff-core/blob/main/SECURITY.md). Questions and ideas are welcome on [Discord](https://discord.com/invite/QkFCS3mShe).\n\nMIT — see [LICENSE](/GLechevalier/nff-core/blob/main/LICENSE).\n\nCopyright (c) 2026 Gauthier Lechevalier", "url": "https://wpnews.pro/news/show-hn-i-let-an-ai-agent-brick-my-2-51-esp32-on-purpose", "canonical_source": "https://github.com/GLechevalier/nff-core", "published_at": "2026-08-19 19:55:23+00:00", "updated_at": "2026-08-19 20:16:09.813703+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "ai-agents", "ai-infrastructure"], "entities": ["NanoForgeFlow", "nff", "Claude", "ESP32", "PlatformIO", "OpenOCD", "GDB", "Mender"], "alternates": {"html": "https://wpnews.pro/news/show-hn-i-let-an-ai-agent-brick-my-2-51-esp32-on-purpose", "markdown": "https://wpnews.pro/news/show-hn-i-let-an-ai-agent-brick-my-2-51-esp32-on-purpose.md", "text": "https://wpnews.pro/news/show-hn-i-let-an-ai-agent-brick-my-2-51-esp32-on-purpose.txt", "jsonld": "https://wpnews.pro/news/show-hn-i-let-an-ai-agent-brick-my-2-51-esp32-on-purpose.jsonld"}}