Chris Collins

Tools · embedded

PlatformIO project helper

Build, explain, and lint platformio.ini files — resolve extends, [env] inheritance, and ${…} interpolation per environment, pick boards with real IDs, and get the pio and Arduino CLI commands for each environment.

Added · updated 28 October 2026

Works with

How to use it

Builder

Each chip at the top is one [env:NAME]. Choose a board: type to search, or click a row on the Boards tab. Choosing a board fills in its platform (pinned to a version) and a framework it supports. The board card shows the MCU, clock, flash, RAM, upload speed, and the Arduino CLI FQBN. The form covers build flags, build_src_filter, lib_deps (with a list of popular libraries), upload and monitor settings, monitor filters, ESP32 partition tables and filesystems, f_cpu, debug probes, test and check tools, and extra scripts. Anything else goes in Other options and is copied as written.

The platformio.ini on the right updates as you type. With Move shared options into [env] on, options that are identical in every environment are written once into [env]. Each lib_deps line is explained below the list: ^1.2.3 allows compatible updates (>=1.2.3 <2.0.0, but only patch updates for 0.x versions), ~1.2.3 allows patch updates (<1.3.0), and a bare version is exact. For Git dependencies, pin a tag or commit with #v1.2.3.

Explain and lint

Paste or open an existing platformio.ini. The tool parses it the way PlatformIO’s configparser does: indented continuation lines, ; and # comments (inline ones need a space before them), and keys that are not case-sensitive. For each environment it lists every option’s final value, the section it came from, and any values it overrode. Lookup follows PlatformIO’s walk_options: first the environment, then the sections it extends (the last one listed is checked first), then [env]. ${section.option}, ${env.option}, ${this.option}, ${this._env_} and ${sysenv.NAME} are expanded. Add environment variables to see sysenv values; ${PROJECT_DIR}-style built-ins are left for build time.

The linter flags:

  • unknown options, and options in the wrong section

  • deprecated names (src_build_flags, src_filter, env_default, monitor_flags, test_build_project_src), with a note on lib_extra_dirs

  • missing platform or board, a board that belongs to another platform, or a framework the board does not support

  • unknown upload protocols, debug tools, and monitor filters

  • unpinned platforms and libraries

  • bad build_src_filter syntax

  • broken extends, missing references, and infinite recursion

  • Serial.begin() speeds in the pasted code that don’t match monitor_speed (the default is 9600)

Load into builder flattens each environment into the builder.

Commands

For the chosen environment, this tab lists the pio commands to build, upload, upload the filesystem, erase the flash, open menuconfig (ESP-IDF), use the serial monitor (with the env’s speed and filters), test, check, debug, and manage packages. Where the board has an Arduino core, it also lists the equivalent arduino-cli commands: the board-manager URL, core install, library installs, compile, upload, and monitor.

Data and limits

ESP32 boards come from the platform-espressif32 6.10 board manifests (Arduino core 2.0.17). The other boards (AVR, SAMD, Renesas, RP2040, STM32, Teensy, nRF52, ESP8266) are a curated set of common IDs. pio boards knows more than 1,500. The official platform supports the ESP32-C6 with ESP-IDF only; for Arduino 3.x use the community pioarduino platform. The Pico W and Pico 2 need Max Gerhardt’s platform-raspberrypi with board_build.core = earlephilhower. The option list follows PlatformIO Core 6. FQBNs for clone boards can differ between core versions.

Sharing

Share link copies a URL that opens this tool with your current settings — every value it remembers between visits, packed into ?s=. Opening a link replaces your saved settings for this tool. The system-environment box is not included, in case it holds secrets.

Runs entirely in your browser; nothing you type leaves this page.