<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Tony Loehr</title>
    <description>The latest articles on Forem by Tony Loehr (@tonythehacker).</description>
    <link>https://forem.com/tonythehacker</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F775121%2Ffd52a114-a70f-4c93-ab8e-492cf743c10c.jpeg</url>
      <title>Forem: Tony Loehr</title>
      <link>https://forem.com/tonythehacker</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tonythehacker"/>
    <language>en</language>
    <item>
      <title>The 55.6% problem: why frontier LLMs fail at embedded code</title>
      <dc:creator>Tony Loehr</dc:creator>
      <pubDate>Thu, 07 May 2026 02:57:12 +0000</pubDate>
      <link>https://forem.com/tonythehacker/the-556-problem-why-frontier-llms-fail-at-embedded-code-2g4i</link>
      <guid>https://forem.com/tonythehacker/the-556-problem-why-frontier-llms-fail-at-embedded-code-2g4i</guid>
      <description>&lt;p&gt;&lt;strong&gt;55.6%.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's DeepSeek-R1's pass@1 on EmbedBench when it gets a circuit schematic alongside the task description. 50.0% without the schematic. Best score from the best reasoning model on the first comprehensive benchmark for LLMs in embedded systems development. Cross-platform migration to ESP-IDF tops out at 29.4%, set by Claude 3.7 Sonnet (Thinking).&lt;/p&gt;

&lt;p&gt;Take a second with that. The same models that one-shot a Next.js app are coin-flipping firmware. And the benchmark only tested three boards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6lv0t5bgv3w1ell15yg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6lv0t5bgv3w1ell15yg.png" alt="Sources: EmbedBench paper Section 3 -- 3 hardware platforms tested. PlatformIO Core 6.1.18,  raw `pio boards --json-output` endraw , retrieved 2026-05-06." width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That 1,553 number is the live count from &lt;code&gt;pio boards --json-output&lt;/code&gt; against PlatformIO Core 6.1.18 on the day this post was written, and PlatformIO-MCP wraps that catalog directly. So when we say "1,553 boards," we mean an MCP server you can &lt;code&gt;npx&lt;/code&gt;-install today that knows how to build, flash, and monitor against any of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What EmbedBench actually measures
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2506.11003" rel="noopener noreferrer"&gt;EmbedAgent&lt;/a&gt; (Wang et al., 2025) is the paper. EmbedBench is the benchmark. 126 cases, nine electronic components, three hardware platforms -- Arduino Uno, ESP32, Raspberry Pi Pico. The authors evaluate LLMs across three roles a real embedded engineer plays: Programmer (write code given a schematic), Architect (design the circuit and the code from a task description), Integrator (port working code from one platform to another). Scoring is pass@1 against the Wokwi virtual circuit simulator. Either the test passes or it doesn't.&lt;/p&gt;

&lt;p&gt;The methodology is sound; the simulator is deterministic, the harness automated, and the metric leaves no wiggle room for graded partial credit. So while the numbers are real, they're also incomplete.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4zexpdhw3bnaliqbj4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4zexpdhw3bnaliqbj4c.png" alt="EmbedBench Table 4 -- 10 models, 4 settings, single-shot pass@1" width="800" height="756"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the harness can't see
&lt;/h2&gt;

&lt;p&gt;EmbedBench is single-shot in a simulator. The model gets the task once and writes the answer once. There is no compiler error fed back, no &lt;code&gt;error: 'GPIO_NUM_45' was not declared in this scope&lt;/code&gt; for the model to read and react to. There is no flash to a real board and no serial monitor to confirm the LED actually blinked at the rate it was supposed to. The Architect role can hand back a circuit with the wrong pin mapping and never find out until the test fails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That isn't how anyone writes firmware.&lt;/strong&gt; Embedded development is iterative. &lt;/p&gt;

&lt;p&gt;You compile, you read the toolchain noise, you fix the missing include, you flash, you watch the serial log, you change the baud rate, you fix the off-by-one in the timer ISR, you flash again. The benchmark measures the cold-start guess and reports it as if it were the whole loop.&lt;/p&gt;

&lt;p&gt;The paper's own failure modes back this up. LLMs flunked 7-segment displays because they got voltage levels and segment mappings wrong. They flunked push buttons because they didn't handle debounce. They flunked ESP-IDF migration because they hallucinated syntax for a framework they've barely seen in training. Every one of those failures is the kind of thing a build, a flash, and a serial print would catch on the second or third iteration.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes with a real loop
&lt;/h2&gt;

&lt;p&gt;This is the part of the story PlatformIO-MCP fills in. The MCP server gives an agent the four tools that make iteration possible: it can build a project, push the binary onto a board, watch the serial line, and ask which boards are even connected. None of those tools fixes the underlying knowledge gap in ESP-IDF or 7-segment voltage tables; what they fix is the absence of a feedback signal. A model that ships on the third try beats a model that gets it perfect on the first try, every time. The loop is the difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  A note for the secure-customer crowd
&lt;/h3&gt;

&lt;p&gt;The teams writing firmware for these platforms tend to be the same teams with stingent security requirements: defense, aerospace, medical, industrial. MCP plus local inference plus an open source agent plus the on-prem PlatformIO toolchain is a stack that clears the bar for these environments. The benchmark numbers and the deployment story end up being the same conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the loop
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx pio-mcp dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;platformio-mcp&lt;/code&gt; is on npm, repo at &lt;a href="https://github.com/jl-codes/platformio-mcp" rel="noopener noreferrer"&gt;github.com/jl-codes/platformio-mcp&lt;/a&gt;. One command, real boards, the whole feedback loop the benchmark didn't measure. If you've run an agent against an ESP32 or an STM32 and have data to share, DM me on &lt;a href="https://x.com/forkbombeth" rel="noopener noreferrer"&gt;X&lt;/a&gt;&lt;/p&gt;

</description>
      <category>iot</category>
      <category>ai</category>
      <category>age</category>
      <category>mcp</category>
    </item>
    <item>
      <title>I built an MCP server so AI agents can flash 1,000+ embedded boards</title>
      <dc:creator>Tony Loehr</dc:creator>
      <pubDate>Tue, 05 May 2026 23:13:31 +0000</pubDate>
      <link>https://forem.com/tonythehacker/i-built-an-mcp-server-so-ai-agents-can-flash-1000-embedded-boards-5bbd</link>
      <guid>https://forem.com/tonythehacker/i-built-an-mcp-server-so-ai-agents-can-flash-1000-embedded-boards-5bbd</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx pio-mcp dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the install. Open a terminal anywhere — your laptop, a fresh VM, a coworker's machine — type one line, and you get a React dashboard wired to PlatformIO Core. From there an LLM can compile firmware, flash it to a real board, and stream serial back to the same browser tab.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;platformio-mcp&lt;/code&gt; v2.0.0 shipped to npm. Here's why and how.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/NkbdZ-_AT9E"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap
&lt;/h2&gt;

&lt;p&gt;LLMs are stupidly good at writing firmware. Hand Claude a datasheet and it'll spit out C++ that compiles. Hand it the FreeRTOS docs and it'll wire up a queue without breaking a sweat.&lt;/p&gt;

&lt;p&gt;The next step always falls apart.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Great, now flash it to the &lt;a href="https://www.espressif.com/en/products/socs/esp32" rel="noopener noreferrer"&gt;ESP32&lt;/a&gt; sitting on my desk."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You get back a markdown wall of "first install pyenv, then bootstrap a venv, then &lt;code&gt;pip install platformio&lt;/code&gt;, then check your USB-C cable supports data, then make sure the right &lt;code&gt;udev&lt;/code&gt; rule is in place on Linux, then..." It's a setup-doc generator. The agent has read every PlatformIO tutorial ever written. It still can't push bytes to flash memory because it has no hands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; is the hands. The agent calls a tool, the tool runs on your machine, the result comes back. &lt;a href="https://docs.platformio.org/en/latest/core/index.html" rel="noopener noreferrer"&gt;PlatformIO Core&lt;/a&gt; is already a CLI that knows how to talk to ~1,000 boards across 30+ platforms (ESP32-S3, RP2040, STM32H7, nRF52840, ATmega328P, Teensy 4.1, SAMD21, ATtiny85, and so on). I exposed it through MCP. That's the whole product.&lt;/p&gt;

&lt;h2&gt;
  
  
  What v2.0.0 actually does
&lt;/h2&gt;

&lt;p&gt;Nine MCP tools. Each one is a thin wrapper around a &lt;code&gt;pio&lt;/code&gt; subcommand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;list_boards        → pio boards &amp;lt;filter&amp;gt;
init_project       → pio project init
build_project      → pio run                       (background mode + status polling)
upload_firmware    → pio run --target upload       (optional start_monitor)
list_devices       → pio device list
serial_monitor     → pio device monitor            (non-blocking, streamed)
search_libraries   → pio pkg search
install_library    → pio pkg install
list_libraries     → pio pkg list
get_dashboard_url  → returns localhost URL with bound auth token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plus &lt;code&gt;init_project&lt;/code&gt;, the unsung hero. PlatformIO project scaffolding is the thing agents got wrong every single time before this — they'd hand-write a &lt;code&gt;platformio.ini&lt;/code&gt; with three subtle bugs in the &lt;code&gt;board_build&lt;/code&gt; section. The MCP tool just shells out to &lt;code&gt;pio project init&lt;/code&gt; and the bugs vanish.&lt;/p&gt;

&lt;h2&gt;
  
  
  The demo that closes the deal
&lt;/h2&gt;

&lt;p&gt;Real prompt, real ESP32, real flash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Initialize a new Arduino project for an ESP32 Dev Board in /tmp/esp32-blink.
  Build it, flash it, and start the serial monitor.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent's tool calls, in order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;list_boards&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;filter:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esp32"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;                                 &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;esp&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="err"&gt;dev&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;init_project&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;board:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esp32dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;framework:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arduino"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                       &lt;/span&gt;&lt;span class="err"&gt;projectDir:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/tmp/esp32-blink"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;build_project&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;projectDir:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/tmp/esp32-blink"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;SUCCESS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;upload_firmware&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;projectDir:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/tmp/esp32-blink"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                       &lt;/span&gt;&lt;span class="err"&gt;start_monitor:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;                             &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;flashed&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;End-to-end on a clean machine: ~90 seconds. Most of that is the PlatformIO toolchain pulling esptool and the Espressif SDK on first run. Subsequent flashes are sub-10s.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install in one command
&lt;/h2&gt;

&lt;p&gt;We make it easy to integrate PIO MCP into your choice of coding agent. v2.0.0 ships a one-shot installer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx platformio-mcp &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cline&lt;/span&gt;       &lt;span class="c"&gt;# Cline (VS Code extension or CLI)&lt;/span&gt;
npx platformio-mcp &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--claude&lt;/span&gt;      &lt;span class="c"&gt;# Claude Desktop&lt;/span&gt;
npx platformio-mcp &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--vscode&lt;/span&gt;      &lt;span class="c"&gt;# VS Code native MCP support&lt;/span&gt;
npx platformio-mcp &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--antigravity&lt;/span&gt; &lt;span class="c"&gt;# Google Antigravity&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each installer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resolves the host's config path per OS. macOS goes to &lt;code&gt;~/Library/Application Support&lt;/code&gt;, Windows reads &lt;code&gt;%APPDATA%&lt;/code&gt;, Linux falls back to &lt;code&gt;~/.config&lt;/code&gt;. There's a 9-line &lt;code&gt;appDataDir()&lt;/code&gt; helper that does the dispatch.&lt;/li&gt;
&lt;li&gt;Reads the existing config if one's already there.&lt;/li&gt;
&lt;li&gt;If the JSON is corrupted, copies it to &lt;code&gt;&amp;lt;path&amp;gt;.bak&lt;/code&gt; before rewriting. I learned this the hard way.&lt;/li&gt;
&lt;li&gt;Idempotently merges an &lt;code&gt;mcpServers.platformio&lt;/code&gt; block. Re-running the installer is a no-op.&lt;/li&gt;
&lt;li&gt;Prints the path it touched so you can grep for it later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For any other MCP host, this is the manual config block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"platformio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"platformio-mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--open-dashboard-on-start"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The dashboard
&lt;/h2&gt;

&lt;p&gt;The dashboard is the part nobody asks for and everybody uses once they have it.&lt;/p&gt;

&lt;p&gt;Reason: build output is the worst possible thing to feed back to an LLM. A clean &lt;code&gt;pio run&lt;/code&gt; for an ESP32 project is 40+ kilobytes of toolchain noise — &lt;code&gt;arm-none-eabi-gcc&lt;/code&gt; flags, linker incantations, every single &lt;code&gt;.o&lt;/code&gt; file. Pour that into the agent's context and you've spent a third of your token budget on text the agent doesn't need.&lt;/p&gt;

&lt;p&gt;So the MCP tools return short, structured summaries to the LLM. The full output streams over Socket.io to a React dashboard the human can watch:&lt;/p&gt;

&lt;p&gt;A per-process random UUID is injected as &lt;code&gt;PORTAL_AUTH_TOKEN&lt;/code&gt; at boot. Every HTTP request and every Socket.io connection requires it. The dashboard URL looks like &lt;code&gt;http://localhost:8080?token=&amp;lt;uuid&amp;gt;&lt;/code&gt; and that token isn't in any config file or env var the LLM has access to. If you launch the dashboard, only you (and the agent that spawned it) can hit the API.&lt;/p&gt;

&lt;p&gt;The auto-launch is gated behind &lt;code&gt;--open-dashboard-on-start&lt;/code&gt; (or the &lt;code&gt;PIO_MCP_OPEN_DASH_ON_START=true&lt;/code&gt; env var). Browser launch goes through the &lt;code&gt;open&lt;/code&gt; package, so the same call works on macOS, Linux, and Windows. The previous version had a hardcoded &lt;code&gt;exec('open ...')&lt;/code&gt; that only fired on macOS — patched in v2.0.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things I'm proud of that nobody will notice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The tarball is &lt;strong&gt;499 kB&lt;/strong&gt;. 114 files. &lt;code&gt;build/&lt;/code&gt; + &lt;code&gt;web/dist/&lt;/code&gt; + &lt;code&gt;scripts/installers/&lt;/code&gt; + LICENSE + README. No &lt;code&gt;node_modules&lt;/code&gt;, no tests, no &lt;code&gt;web/src/&lt;/code&gt;. The minified UI bundle is 921 kB / 291 kB gzip on its own; everything else is rounding error.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prepublishOnly&lt;/code&gt; runs the full TypeScript build, the Vite UI build, and a smoke check that asserts &lt;code&gt;build/index.js&lt;/code&gt;, &lt;code&gt;web/dist/index.html&lt;/code&gt;, and &lt;code&gt;scripts/installers/index.js&lt;/code&gt; exist before npm allows the publish to proceed. Hard to ship a broken artifact.&lt;/li&gt;
&lt;li&gt;Workspace state is mediated through &lt;code&gt;proper-lockfile&lt;/code&gt;. Two agent processes can't race each other on the same project. If you've ever had two MCP servers fight over the same serial port, you know why this matters.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;pio-mcp&lt;/code&gt; alias package is &lt;strong&gt;842 bytes&lt;/strong&gt;. Three files: a 283-byte &lt;code&gt;bin.js&lt;/code&gt; that does &lt;code&gt;import("platformio-mcp")&lt;/code&gt;, a &lt;code&gt;package.json&lt;/code&gt; with one dependency, a README. Same binary, shorter to type.&lt;/li&gt;
&lt;li&gt;The default &lt;code&gt;npx platformio-mcp&lt;/code&gt; (no subcommand) still boots the MCP stdio server. Existing configs that point at &lt;code&gt;build/index.js&lt;/code&gt; keep working unchanged. v2 is additive.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get started in five seconds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Open the dashboard right now. No clone, no build, no install.&lt;/span&gt;
npx pio-mcp dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Wire it into your AI agent of choice.&lt;/span&gt;
npx platformio-mcp &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cline&lt;/span&gt;
npx platformio-mcp &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--claude&lt;/span&gt;
npx platformio-mcp &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--vscode&lt;/span&gt;
npx platformio-mcp &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--antigravity&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/jl-codes/platformio-mcp" rel="noopener noreferrer"&gt;github.com/jl-codes/platformio-mcp&lt;/a&gt;&lt;br&gt;
npm: &lt;a href="https://www.npmjs.com/package/platformio-mcp" rel="noopener noreferrer"&gt;platformio-mcp&lt;/a&gt; · &lt;a href="https://www.npmjs.com/package/pio-mcp" rel="noopener noreferrer"&gt;pio-mcp&lt;/a&gt;&lt;br&gt;
Release notes: &lt;a href="https://github.com/jl-codes/platformio-mcp/releases/tag/v2.0.0" rel="noopener noreferrer"&gt;v2.0.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm &lt;a href="https://twitter.com/forkbombETH" rel="noopener noreferrer"&gt;@forkbombETH&lt;/a&gt; on X. Issues and PRs welcome on GitHub. If you build something cool with this, lmk.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx pio-mcp dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A huge warm thank you to &lt;a href="https://x.com/mattmcneill" rel="noopener noreferrer"&gt;Matt Mcneill&lt;/a&gt; for being an amazing collaborator and pushing for the features that make v2 amazing!&lt;/p&gt;

</description>
      <category>iot</category>
      <category>mcp</category>
      <category>ai</category>
      <category>firmware</category>
    </item>
    <item>
      <title>20 one-shot prompts that turn Kanban into an autonomous coding machine</title>
      <dc:creator>Tony Loehr</dc:creator>
      <pubDate>Mon, 06 Apr 2026 16:30:00 +0000</pubDate>
      <link>https://forem.com/tonythehacker/20-one-shot-prompts-that-turn-kanban-into-an-autonomous-coding-machine-4ho</link>
      <guid>https://forem.com/tonythehacker/20-one-shot-prompts-that-turn-kanban-into-an-autonomous-coding-machine-4ho</guid>
      <description>&lt;p&gt;Most people look at Cline Kanban and see a board. Cards, columns, drag and drop. But Kanban isn't a project management tool. It's an orchestration layer for coding agents, one with a particularly robust feature: the Kanban Agent in sidebar chat is where the real leverage lives.&lt;/p&gt;

&lt;p&gt;One prompt in the Kanban Agent can decompose a complex project into linked task cards, fan them out for parallel execution across multiple agents, and chain them so one finishing triggers the next. The result is end-to-end autonomous workflows that go from a single sentence to committed code across your entire codebase.&lt;/p&gt;

&lt;p&gt;We put together 20 starter prompts across five categories. Each one is copy-paste ready for the Kanban sidebar chat. They create linked dependency chains, maximize parallel agent execution, and produce real, working code. Install with &lt;code&gt;npm i -g cline&lt;/code&gt;, run &lt;code&gt;cline&lt;/code&gt; in any project directory, and try them.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/lYiiBKzvfEQ"&gt;
  &lt;/iframe&gt;
 Kanban sidebar agent creating linked task cards from a single prompt  &lt;/p&gt;
&lt;h3&gt;
  
  
  Greenfield app scaffolding
&lt;/h3&gt;

&lt;p&gt;These prompts build new projects from scratch. The key pattern: set up the foundation first, then fan out parallel tasks for features that don't depend on each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Express API from scratch&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a production-ready Express API for this project. Break it into 
tasks: 1) Set up Express with TypeScript, tsconfig, and a dev script 
with nodemon 2) Add a health check endpoint at GET /health returning 
{ status: "ok", timestamp } 3) Add structured JSON logging with pino 
4) Add global error handling middleware with proper error response 
format 5) Add CORS and helmet security middleware. Link them 
sequentially -- each builds on the last. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. React + Vite frontend&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scaffold a React frontend with Vite for this project. Tasks: 1) 
Initialize Vite with React and TypeScript template, add path aliases 
in tsconfig and vite.config 2) Set up React Router with a layout 
component, home page, and 404 page 3) Add a reusable component 
library -- Button, Card, Input, Modal -- in src/components/ui with 
basic styling 4) Add a dark/light theme provider using CSS variables 
and React context. Link 1 → 2 → 3, and 1 → 4 so theming and 
components run in parallel after routing is set up. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. CLI tool&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a Node.js CLI tool in this repo. Tasks: 1) Set up the project 
with TypeScript, a bin entry in package.json, and commander.js for 
argument parsing 2) Add a "init" command that scaffolds a config file 
interactively using prompts 3) Add a "run" command that reads the 
config and executes the main logic with a progress spinner using ora 
4) Add colorized output with chalk and a --verbose flag for debug 
logging. Link 1 → 2, 1 → 3, and 1 → 4 so all three commands build in 
parallel after setup. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;⭐ 4. Full-stack with database&lt;/strong&gt; – A single prompt gives you a typed Express API backed by SQLite with full CRUD, input validation, and seed data. Five linked tasks, two parallel branches.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set up a full-stack app with Express backend and SQLite database. 
Tasks: 1) Initialize Express with TypeScript and install better-
sqlite3 2) Create a database module in src/db.ts that initializes 
SQLite, creates a "users" table with id, name, email, created_at 3) 
Add CRUD API routes: GET /users, GET /users/:id, POST /users, PUT 
/users/:id, DELETE /users/:id 4) Add input validation middleware 
using zod schemas for the POST and PUT routes 5) Add seed script that 
populates 10 sample users. Link 1 → 2 → 3 → 4, and 2 → 5 so seeding 
runs in parallel with route development. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/lYiiBKzvfEQ"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Codebase modernization and migration
&lt;/h3&gt;

&lt;p&gt;Legacy code is where Kanban's parallel execution really shines. These prompts audit first, then fan out multiple refactoring tasks simultaneously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. JavaScript to TypeScript migration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Migrate this JavaScript project to TypeScript. Tasks: 1) Add 
tsconfig.json with strict mode, install typescript and ts-node, 
rename entry point to .ts 2) Rename all .js files in src/ to .ts and 
fix immediate type errors with explicit type annotations 3) Add type 
definitions for all function parameters and return types across the 
codebase 4) Replace any require() calls with ES module imports and 
update package.json with "type": "module" if needed 5) Add a build 
script using tsc and verify the compiled output runs correctly. Link 
sequentially 1 → 2 → 3 → 4 → 5. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6. Dependency audit and upgrade&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Audit and upgrade dependencies in this project. Tasks: 1) Run npm 
outdated, identify all packages with major version bumps, and create 
a report as UPGRADE_PLAN.md listing each package, current version, 
target version, and known breaking changes 2) Upgrade all non-
breaking minor and patch versions across the project 3) Upgrade major 
version packages one at a time, fixing breaking changes in the code 
after each upgrade 4) Remove any unused dependencies identified by 
depcheck. Link 1 → 2, 1 → 3, and 1 → 4 so cleanup and upgrades run in 
parallel after the audit. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;⭐ 7. Add ESLint and Prettier&lt;/strong&gt; -- This prompt runs two completely independent tooling setups in parallel, then applies each tool's auto-fixes in separate worktrees. Zero conflicts because each agent works in isolation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add code quality tooling to this project. Tasks: 1) Install and 
configure ESLint with a flat config file using @eslint/js and 
typescript-eslint, with rules for no-unused-vars, consistent-return, 
and no-console as warnings 2) Install and configure Prettier with a 
.prettierrc that uses single quotes, no semicolons, and 2-space tabs 
3) Run eslint --fix across the entire codebase and commit the auto-
fixed changes 4) Run prettier --write across the entire codebase and 
commit the formatted changes. Link 1 → 3 and 2 → 4 so linting and 
formatting run in parallel. Start tasks 1 and 2.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/g1tcAK5WqcE"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Extract shared utilities&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Refactor this codebase to extract duplicated logic. Tasks: 1) Scan 
the codebase for duplicated patterns -- repeated validation logic, 
string formatting, date handling, error construction -- and list them 
in a REFACTOR_PLAN.md 2) Create a src/utils/ directory with modules 
for each identified pattern: validation.ts, format.ts, dates.ts, 
errors.ts 3) Replace all duplicated code across the codebase with 
imports from the new utility modules 4) Add unit tests for each 
utility module using the existing test framework. Link 1 → 2 → 3, and 
2 → 4 so tests and refactoring run in parallel. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testing and quality
&lt;/h3&gt;

&lt;p&gt;Testing is one of the highest-value uses for Kanban because unit tests, integration tests, and documentation are naturally independent -- they fan out perfectly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⭐ 9. Comprehensive test suite&lt;/strong&gt; -- Four tasks, but the real magic is the linking pattern: unit tests and integration tests build simultaneously after the test framework is configured, then converge on the CI coverage gate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add a test suite to this project. Tasks: 1) Install and configure 
vitest with TypeScript support, add test and test:coverage scripts to 
package.json 2) Write unit tests for all utility functions and helper 
modules in src/utils or src/lib, aiming for 100% coverage on those 
files 3) Write integration tests for all API routes using supertest, 
covering success cases and error cases 4) Add a test:ci script that 
runs tests with coverage and fails if coverage drops below 80%. Link 
1 → 2 and 1 → 3 so unit and integration tests build in parallel, then 
2 → 4 and 3 → 4 so the CI script comes last. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/wVqxTKwygDs"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. API documentation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Document all APIs in this project. Tasks: 1) Install swagger-jsdoc 
and swagger-ui-express, configure them to serve docs at /api-docs 2) 
Add JSDoc annotations with @swagger tags to every route handler 
documenting the method, path, parameters, request body schema, and 
response schema 3) Add example request/response payloads for each 
endpoint in the swagger annotations 4) Add a README section 
documenting how to access the API docs locally and listing all 
available endpoints with brief descriptions. Link 1 → 2 → 3, and run 
4 in parallel after 1. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;11. Error handling hardening&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Harden error handling across this codebase. Tasks: 1) Create a custom 
AppError class in src/errors.ts that extends Error with statusCode, 
isOperational, and context fields, plus factory functions for 
notFound, badRequest, unauthorized, and internal errors 2) Add an 
Express error-handling middleware that catches AppError instances and 
returns structured JSON error responses with appropriate status codes 
3) Audit every route handler and replace raw throw/try-catch patterns 
with the new AppError classes 4) Add a process-level uncaught 
exception and unhandled rejection handler that logs and gracefully 
shuts down. Link 1 → 2 → 3, and 1 → 4 in parallel. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;12. Add logging and observability&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add structured logging to this application. Tasks: 1) Install pino 
and pino-http, create a logger module in src/logger.ts that outputs 
JSON logs with configurable log levels via LOG_LEVEL env var 2) Add 
request logging middleware using pino-http that logs method, url, 
status code, and response time for every request 3) Add contextual 
logging to all existing route handlers and service functions -- log 
on entry, on error, and on completion with relevant context like user 
IDs or resource IDs 4) Add a correlation ID middleware that generates 
a UUID per request and attaches it to all log lines for that request. 
Link 1 → 2 and 1 → 4 in parallel, then 2 → 3 and 4 → 3 so the route 
logging comes last. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Feature development
&lt;/h3&gt;

&lt;p&gt;These prompts add real product features. The linking patterns here are more complex because features have more interdependencies -- but Kanban handles the orchestration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⭐ 13. Authentication system&lt;/strong&gt; -- This is the most complex single prompt in the collection. Five tasks, three parallel branches, a convergence point. One sidebar message gives you a complete auth system with registration, login, JWT middleware, and route protection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add JWT authentication to this Express app. Tasks: 1) Install 
jsonwebtoken and bcryptjs, create a src/auth/ directory with modules 
for password hashing and JWT token generation/verification with 
configurable secret and expiry via env vars 2) Add POST 
/auth/register endpoint that validates email/password, hashes the 
password, stores the user, and returns a JWT 3) Add POST /auth/login 
endpoint that validates credentials, compares the password hash, and 
returns a JWT 4) Add an auth middleware that extracts the JWT from 
the Authorization header, verifies it, and attaches the user to 
req.user 5) Protect all existing routes except /health and /auth/* 
with the auth middleware. Link 1 → 2, 1 → 3, 1 → 4 so register, 
login, and middleware build in parallel, then 2 → 5, 3 → 5, 4 → 5 so 
route protection comes last. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/lqYA0cvyejE"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;14. Search and filtering&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add search and filtering to the existing list endpoints in this API. 
Tasks: 1) Create a query parser utility in src/utils/query.ts that 
extracts page, limit, sort, order, and arbitrary filter fields from 
req.query with sensible defaults and validation 2) Update the GET 
list endpoints to accept ?search= parameter that does a case-
insensitive partial match across text fields 3) Add pagination 
support -- return results with { data, total, page, limit, totalPages 
} response format 4) Add sort support with ?
sort=field&amp;amp;order=asc|desc. Link 1 → 2, 1 → 3, 1 → 4 so search, 
pagination, and sorting build in parallel after the query parser. 
Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;15. File upload endpoint&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add file upload capability to this Express app. Tasks: 1) Install 
multer and configure it with disk storage in an uploads/ directory, 
10MB file size limit, and allowed extensions for images (jpg, png, 
gif, webp) 2) Add POST /upload endpoint that accepts a single file, 
validates it, stores it, and returns { filename, originalName, size, 
mimetype, url } 3) Add GET /uploads/:filename endpoint that serves 
the uploaded file with proper content-type headers and 404 handling 
4) Add a cleanup utility that deletes uploaded files older than 30 
days, callable via a DELETE /uploads/cleanup endpoint. Link 1 → 2 → 
3, and 1 → 4 in parallel. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;16. WebSocket real-time updates&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add WebSocket support to this Express app for real-time updates. 
Tasks: 1) Install ws, integrate a WebSocket server with the existing 
HTTP server, and create a connection manager in src/ws.ts that tracks 
connected clients by ID 2) Add a broadcast utility that sends a JSON 
message to all connected clients or to specific client IDs 3) Modify 
the existing POST, PUT, and DELETE route handlers to emit WebSocket 
events after successful mutations -- e.g., { event: "user:created", 
data: user } 4) Add a heartbeat ping/pong mechanism that detects and 
cleans up stale connections every 30 seconds. Link 1 → 2 → 3, and 1 → 
4 in parallel. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DevOps and infrastructure
&lt;/h3&gt;

&lt;p&gt;Infrastructure tasks are often tedious and repetitive. They're also perfectly suited for parallel execution because a Dockerfile, a CI config, and a .dockerignore don't depend on each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;17. Dockerize the application&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dockerize this application. Tasks: 1) Create a multi-stage Dockerfile 
with a builder stage that installs deps and compiles TypeScript, 
production stage that copies only compiled output and production 
deps, runs as non-root user on port 3000 2) Create a docker-
compose.yml with the app service, health check, environment variables 
from .env, and a volume mount for uploads if applicable 3) Add a 
.dockerignore file excluding node_modules, .git, .env, dist, and test 
files 4) Add npm scripts: docker:build, docker:run, docker:stop and 
document them in the README. Link 1 → 3 in parallel (both are 
independent files), then 1 → 2 → 4 for the compose and docs. Start 
tasks 1 and 3.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;⭐ 18. GitHub Actions CI/CD&lt;/strong&gt; -- Four tasks, three running in parallel from the start. CI workflow, release workflow, and contributing docs all build simultaneously, then converge on adding README badges. This is the kind of infrastructure setup that normally takes an afternoon -- Kanban does it in minutes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add GitHub Actions CI/CD to this project. Tasks: 1) Create 
.github/workflows/ci.yml that runs on push and PR to main -- checks 
out code, installs deps, runs linting, runs tests with coverage, and 
fails if coverage is below threshold 2) Create 
.github/workflows/release.yml that runs on tags matching v* -- builds 
the project, creates a GitHub release with auto-generated notes 3) 
Add a branch protection rules recommendation in CONTRIBUTING.md 
documenting that main requires CI to pass 4) Add status badges for CI 
workflow to the top of README.md. Link 1 → 4 and 2 → 4 so badges come 
after both workflows exist. Run 1, 2, and 3 in parallel. Start all 
tasks.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/fp9Aw4wgNnk"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;19. Environment configuration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add proper environment configuration to this project. Tasks: 1) 
Install dotenv, create a src/config.ts module that loads and 
validates all environment variables with defaults, exports a typed 
config object -- include PORT, NODE_ENV, LOG_LEVEL, DATABASE_URL, 
JWT_SECRET 2) Create .env.example with all required variables and 
placeholder values, add .env to .gitignore 3) Replace all process.env 
references scattered across the codebase with imports from the config 
module 4) Add a startup validation that checks all required env vars 
are present and logs which are missing with a clear error message 
before the app exits. Link 1 → 2 and 1 → 3 in parallel, then 3 → 4. 
Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;20. Monorepo setup&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Convert this project into a monorepo. Tasks: 1) Install and configure 
Turborepo with a root turbo.json, move the existing app code into 
packages/api, update all paths and imports accordingly 2) Create 
packages/shared with common TypeScript types, utility functions, and 
constants that will be shared across packages 3) Create packages/web 
as a minimal React + Vite frontend that imports types from 
packages/shared 4) Configure the root package.json with workspace 
scripts: dev (runs all packages), build (builds all), test (tests 
all), and lint (lints all). Link 1 → 2, 1 → 3 in parallel (both 
depend on the monorepo structure), then 2 → 4 and 3 → 4 so workspace 
scripts come after all packages exist. Start task 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Now show us yours
&lt;/h4&gt;

&lt;p&gt;These 20 prompts are starting points. The real creative potential is in the workflows you build for your own projects -- the migration scripts nobody else has thought of, the testing patterns specific to your stack, the infrastructure recipes that save your team hours every week.&lt;/p&gt;

&lt;p&gt;We want to see what you come up with. Share your best one-shot Kanban prompts with &lt;strong&gt;#OneShotShip&lt;/strong&gt; on Twitter/X, or post them in our &lt;a href="https://discord.gg/cline" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; and &lt;a href="https://www.reddit.com/r/cline/" rel="noopener noreferrer"&gt;Reddit&lt;/a&gt;. Tag us at &lt;strong&gt;Cline&lt;/strong&gt; so we can find them. The most creative and effective prompts will get featured in future Cline content.&lt;/p&gt;

&lt;p&gt;And if you're building open source tools, workflows, or integrations on top of Kanban, our &lt;a href="https://cline.bot/blog/5m-installs-1m-open-source-grant-program" rel="noopener noreferrer"&gt;$1M open source grant program&lt;/a&gt; is accepting applications. Build something great and get funded to keep going.&lt;/p&gt;

&lt;p&gt;Get started:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; cline
cline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ai</category>
      <category>automation</category>
      <category>community</category>
      <category>npm</category>
    </item>
  </channel>
</rss>
