Skip to content

Build1 publisher3 min readPublished

Per-board skill directories for Claude Code aim to capture pin maps and hardware gotchas

Model-written firmware compiled first try, flashed clean, and put colored noise on the panel because the cropped glass needs a drawing-window offset that only the vendor's wiki documents. A new repo packages that fact per board.

The Engineer · Build desk

Illustration accompanying Per-board skill directories for Claude Code aim to capture pin maps and hardware gotchas

What happened

  • Model-written display code compiled and flashed cleanly but showed noise: the ST7789 addresses 240x320 while the board's glass shows 172x320, so the driver must offset the drawing window by 34 pixels.
  • Other traps listed include Pico GPIO23, 24, 25 and 29 missing from the 40-pin header, ESP32 ADC2 timing out while Wi-Fi runs, and an STM32F411 at 100 MHz instead of 96 MHz silently killing USB.
  • The author is publishing one Claude Code skill per board, eight so far, each with an always-loaded SKILL.md, an on-demand reference directory and a template project that builds and flashes.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • constraint The compiler and the flasher both pass on these bugs, so an agent loop that iterates on build errors has no signal to iterate on; the only oracle is the board on the bench.
  • cost Each board in the collection costs someone the purchase and the debugging evening behind it, so coverage grows only as fast as hardware gets bought and probed.
  • decision Embedded teams now have a concrete choice between live search, which burns context and can return the wrong board revision, and a static skill snapshot tied to one project that flashed.
  • precedent Extracting every line of context from a working build sets a testable standard for hardware context packs: the file can be regenerated from the template, and drift shows up as a build that fails.

The offset comes straight out of the geometry. The ST7789 addresses a 240x320 frame; the glass on the board shows 172x320. The visible window sits in the middle of controller memory, so (240 - 172) / 2 leaves 34 hidden columns on each side [1]. Skip the offset and the image shifts sideways, a third of the content lands past the edge of the glass, and garbage creeps in from the other side [3].

Code written for a 240x320 ST7789 is correct code for a 240x320 ST7789, and the compiler will happily emit it for a panel you do not own. No reasoning failed. The board-specific part is the offset, the required color inversion and the big-endian byte order, which the post says sit in the vendor's wiki between two fine-print warnings and in no tutorial [4].

Firmware also puts these failures past every automatic check an agent has. The generated code compiles on the first attempt and flashes without errors [1]. A Pico project that drives GPIO23, 24, 25 or 29 compiles, flashes and appears to work, and those pins are not on the 40-pin header [6]. ESP32 ADC2 returns a timeout whenever the radio is up [7]. On the STM32F411, HAL_Delay() hangs when nobody defined SysTick_Handler, which the post calls documented almost nowhere [8]. A build-and-fix loop reads green on all four.

The author's diagnosis is stated plainly: "At its core, this is a missing-context problem." [16] The layout that follows is a context budget. SKILL.md is always loaded and holds the pin map, chip characteristics and the rules that prevent costly mistakes. reference/ holds the full pinout with alternate functions, peripherals and a table of gotchas, and it loads on demand [11]. The alternative he reports trying, a web search MCP, helps somewhat but burns context on every small lookup and turns up tutorials written for a different revision of the board [14].

Call it a provenance rule: template/ is a project that builds and flashes, and every line of the skill is extracted from it instead of written from memory [12]. The skill therefore describes a build that ran on the hardware.

Eight boards are in now: two STM32s, four ESP32s, the Arduino Nano on ATmega328P and the RP2040, which accounts for all eight [13][2]. Those are boards from the author's own collection [9]. That is the limit on coverage. The post does not report any measurement of firmware task outcomes with and without a skill [17], so the argument for the approach rests on the named failure modes: the shared SPI bus on the Waveshare ESP32-C6-LCD-1.47. Display and microSD share MOSI on GPIO6 and SCLK on GPIO7, and a model that splits them produces a conflict that looks like a dead memory card [5].

install.sh takes a board name, and Claude Code picks the skill up when you work with that board. /stm32f411-blackpill invokes it explicitly. Copying the directory into .claude/skills/ scopes it to one firmware project [15].

What to watch

  • Whether the repository ever publishes before-and-after results for firmware tasks run with and without a board skill.
  • Whether skills get pinned to board revisions, given the author's warning that search turns up tutorials for a different revision.
  • Whether coverage grows past the eight boards the author owns, and who supplies the bench time for boards he does not.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories