Convert KiCad schematic and PCB files to Circuit JSON format.
npm install kicad-to-circuit-json
# or
bun install kicad-to-circuit-jsonimport { KicadToCircuitJsonConverter } from "kicad-to-circuit-json"
import fs from "fs"
// Create a converter instance
const converter = new KicadToCircuitJsonConverter()
// Add KiCad files
const pcbContent = fs.readFileSync("path/to/file.kicad_pcb", "utf-8")
const schContent = fs.readFileSync("path/to/file.kicad_sch", "utf-8")
converter.addFile("example.kicad_pcb", pcbContent)
converter.addFile("example.kicad_sch", schContent)
// Run the conversion
converter.runUntilFinished()
// Get the Circuit JSON output
const circuitJson = converter.getOutput()
console.log(JSON.stringify(circuitJson, null, 2))
// Get diagnostics
console.log("Warnings:", converter.getWarnings())
console.log("Stats:", converter.getStats())The converter uses a staged pipeline architecture that mirrors the circuit-json-to-kicad converter:
- InitializeSchematicContextStage - Sets up coordinate transformations (KiCad → Circuit JSON)
- CollectLibrarySymbolsStage - Extracts symbols and creates
source_component+schematic_componententries - CollectSchematicTracesStage - Converts wires and junctions to
schematic_traceelements
- InitializePcbContextStage - Sets up PCB coordinate transformations
- CollectNetsStage - Builds net number to name mappings
- CollectFootprintsStage - Converts footprints to
pcb_componentwith pads/holes - CollectTracesStage - Converts segments and connected vias to
pcb_trace.routeelements - CollectViasStage - Emits fallback
pcb_viaelements for vias not represented in trace routes - CollectGraphicsStage - Extracts board outline and silkscreen graphics
The converter handles coordinate system differences between KiCad and Circuit JSON:
- Schematic:
scale(1/15, -1/15)with translation (inverse of CJ→KiCad transform) - PCB:
scale(1, -1)with translation
- ✅ Symbols/Components
- ✅ Symbol ports/pins
- ✅ Wires/traces
- ✅ Junctions
- ✅ Component properties (Reference, Value)
⚠️ Net labels (partial)⚠️ Power symbols (partial)
- ✅ Footprints/Components
- ✅ SMD pads
- ✅ Through-hole pads (plated holes)
- ✅ NPTH holes
- ✅ Traces/Segments
- ✅ Vias
- ✅ Board outline (Edge.Cuts)
- ✅ Silkscreen graphics
- ✅ Net mappings
This is an MVP implementation. Some limitations include:
- Component sizes are estimated (not derived from actual symbol geometry)
- Port positions are simplified (not fully transformed relative to component)
- Trace routing is basic (segments grouped by net/layer)
- Some pad shapes may not map perfectly
- Power symbols and net labels need enhancement
- Multi-sheet schematics not fully tested
# Install dependencies
bun install
# Build the library
bun run build
# Run the Vite viewer
bun run dev
# Build the Vite site
bun run build:site
# Type check
bunx tsc --noEmit
# Test
bun testThis repository now includes a small Vite app under site/ for local inspection
and demos.
bun run devThe page accepts drag-and-drop .kicad_pcb files, converts them with the local
library source, and renders the resulting Circuit JSON inside an embedded
runframe iframe preview. The site does not need the runframe package installed
locally.
- circuit-json-to-kicad - Convert Circuit JSON to KiCad (reverse direction)
- circuit-to-svg - Render Circuit JSON as SVG
MIT