release · codex plugin · claude code mod

circuit-skills in ChatGPT and Claude: a board viewer that runs the checks

2026-10-04 · Dan Newcome

circuit-skills is how we design printed circuit boards with an agent: the circuit is code, placement is code, a router does the copper, and a set of checks decides whether the board is done. Until now it was skills and scripts. The agent ran them, read their output, and we looked at the board in KiCad when something went wrong. Today it ships in two new forms: a Codex plugin for the ChatGPT desktop app, and a Claude Code mod. Both add the thing that was missing, a view of the board inside the conversation, and both give the agent the same checks the pipeline uses.

The same routed keypad board in the Codex plugin's board tab, with layer toggles and DRC marker types on the left, and in the Claude Code pane, drawn in coloured terminal cells beside the conversation

01 / Why a viewer, and not text-to-board

The hard part of a board is not drawing it, it is knowing whether it is right. Our einhander re-run made that concrete. A router reported success while a net was missing, an export mirrored three capacitors, and our own check printed "CLEAN" with open nets. Every one of those showed up as DRC markers on the routed board; what found them was reading those markers, on the board, next to a verdict we trust. That is what these plugins put in front of you and the agent: the board that will actually be fabbed, the markers on it, and the gates' verdict.

02 / What you get in ChatGPT (Codex)

A viewer with five tabs, opened from the sidebar, beside a conversation, or by clicking a .kicad_pcb or .circuit.tsx file in your workspace.

The Board tab: the routed einhander keypad with front copper in red, back copper in blue, the outline in yellow, layer checkboxes and DRC marker types in a sidebar

Board is the routed KiCad board, layer by layer. Inner planes start hidden, because a solid plane hides everything else. Every DRC marker sits on the copper it names. The types that block fabrication (shorts, crossings, open nets, clearance) are shown; the cosmetic ones are listed but hidden. Click a type to step through its markers:

Zoomed in on the USB-C connector: an unconnected-item marker drawn as two orange circles joined by a line, where a USB D+ track stops one pad short

Schematic and Netlist come from the tscircuit design, and the netlist filters by net, part or pin. 3D is KiCad's own model of the routed board, orbitable.

Left, the auto-laid-out tscircuit schematic of the RP2040 keypad; right, the routed board in 3D

Checks runs the pipeline's gates and says plainly what is failing:

The Checks tab: Failing: drc_check, a line saying critical routing is not assessed, routing metrics, and each gate's output with pass/fail pills

The agent gets three tools: open_board, check_board and get_netlist. The viewer also tells the agent what is open and what the last check found, so "review the board I have open" works without paths. It refreshes on its own when the board file is saved, keeping your tab, zoom and layer choices.

03 / What you get in Claude Code

A pane docked beside the conversation, drawn by a Claude Code mod. In a terminal it draws the board in coloured half-block characters, so it works in any terminal, not only ones that can show images. On Claude's desktop and editor surfaces it is written to draw an SVG instead.

Claude Code in a terminal: on the left, the /board command and its summary; on the right, a docked pane with the board drawn in red and blue cells inside a yellow outline, orange marks on the two open connections, the verdict FAILING: drc_check, routing metrics, a legend and buttons

That capture is a real session: /board on the einhander re-run, with no model call involved. The mod draws the board from its own geometry: front and back copper, pads, vias, holes and the outline. Open nets are drawn in orange, with a line between the two ends. Buttons step through the issues and zoom to them, switch between front and back, rerun the checks and reload. The pane redraws when the board is saved, and the status line keeps the verdict in view. The model gets the same three tools as in Codex.

04 / Install

Both need Node.js 18+, KiCad 9+ with kicad-cli on the path, and Python 3 for the checks. The schematic and netlist need tscircuit installed in the project (npm install there). Nothing to build: the bundled files are committed.

ChatGPT desktop / Codex, from a clone of punkfab/circuit-skills:

codex plugin marketplace add /path/to/circuit-skills
codex plugin add circuit-skills@circuit-skills

Then quit the app completely and reopen it. Closing the window is not enough: the app keeps a background server running, and that server only reads the plugin list when it starts. This caught us out on day one. Circuit viewer then appears in the sidebar. To update after a pull: codex plugin marketplace upgrade, remove and re-add the plugin, and quit and reopen again. Tested with Codex 0.157.

Claude Code, for one session:

claude --plugin-dir /path/to/circuit-skills/claude/circuit-viewer

Or for every session, including Claude Desktop's Code tab (which now has an official Linux beta), add it to ~/.claude/settings.json:

"env": { "CLAUDE_CODE_PLUGIN_DIRS": "/path/to/circuit-skills/claude/circuit-viewer" }

Then /board ~/your-project/pcb, or ask Claude to open a board. The skills themselves (pcb-layout, circuit-sim, pcb-enclosure-fit, pcb-3d-render) come with the Codex plugin; for Claude Code, link them into ~/.claude/skills/ as before.

05 / How it works

One backend, two front ends, and no new opinions about the board. Every view is made by the same tools the pipeline uses: kicad-cli exports each layer and the 3D model and runs DRC, tsci exports the schematic and netlist. The verdict comes from pcb-layout's own gate scripts, run unchanged:

The track, via and plane-copper figures come from a small reader for KiCad's board file. It matches KiCad's own numbers exactly on einhander (1463.8 mm of track, 49 vias), so neither front end needs KiCad's Python module. The layer images are exported in board coordinates, which is why each DRC marker lands exactly on the copper it is about.

The Codex plugin is an MCP app: a local server the app starts, and a single self-contained viewer page that asks the server for each view as you open its tab. The Claude mod runs inside Claude Code, where it cannot install anything or even learn its own folder. So it carries the backend with it: a 39 kB bundle, gate scripts included, which it runs with node by piping in the source. There is no install location and nothing to configure.

06 / Built by two agents

Most of this was written by agents, in two different apps. Claude, in Claude Code, built the Codex plugin, the Claude mod and their tests. The tests run every tab in a real browser against the real server, and they caught a bug a real host would have hit: the project picker used a form, which ChatGPT's sandbox does not allow to submit. Meanwhile Codex, working inside ChatGPT on a board of its own (the ArtNode re-drive), opened two pull requests against the same repository. The first added live refresh, an optional FastRoute router, and a fix for pad positions on rotated parts, which the checks had been computing with the wrong rotation direction. The second added the critical-routing gate. Both landed after tests, and the new gate runs in both front ends.

07 / Limits

Everything is open at punkfab/circuit-skills, with the full history of how it got here. Have a board you want routed, checked and seen before it is ordered? Start a project →