
TopAndBottomLayer
grserwe/KiCadToGCodeSvelte
Convert KiCad PCB designs into CNC GCode for isolation-engraving traces on copper-clad board and drilling through-holes — entirely in the browser.

Convert KiCad PCB designs into CNC GCode for isolation-engraving traces on copper-clad board and drilling through-holes — entirely in the browser.
ShowerController is an open-source printed circuit board by grserwe, from the grserwe/KiCadToGCodeSvelte repository on GitHub. It is a 2-layer board of 145 × 100 mm with 22 parts on 70 nets, routed with 217 tracks and 24 vias.
It is built around the L7805 and TXS0108EPW. Its parts include 6 ICs, 5 connectors and 2 capacitors. It belongs with the ESP32 boards of this library.
Live at kicadtogcode.com — free, no sign-up, and your design never leaves your browser.
Convert KiCad PCB designs into CNC GCode for isolation-engraving traces on copper-clad board and drilling through-holes — entirely in the browser. This app replaced the original Blazor version (grserwe/KiCadToGCode) on the same domain.
.kicad_pcb file (KiCad 4 through 10) or a zipped KiCad project.kicad_pcb into a board model in board-local, Y-up millimeter coordinates. Legacy (module) and modern (footprint) dialects both supported.width/2 + tool radius; where tracks meet, the lines are mitered or joined by angular adjacency. A track that runs through a pad (a component lead sitting mid-track) is first split at that pad so both pieces end inside it.The profile program (<board>-profile.txt) cuts the board free, so it runs last. The Edge.Cuts drawings are chained end to end into closed loops (endpoints within 0.05 mm join; circles and polygons are loops already), the largest loop is the board boundary and loops inside it are holes. Every loop is wound so the material is on its left — boundary counter-clockwise, holes clockwise — and then offset to its right by the cutter radius: straight edges shift, outward arcs grow, inward arcs shrink, convex corners get an arc around the vertex and concave corners are trimmed to the intersection. Holes are cut before the boundary. With the bottom side mirrored, the loop direction is reversed so the machine still climb mills.
The cut is made in depth passes (total depth ÷ depth per pass, in output units). On the passes below the tab top, the cutter lifts to the tab height over each tab, which are spread evenly along the straight edges and kept clear of the corners. A board with no closed outline is cut along the rectangle of its extents, with a warning; an inside curve tighter than the cutter is reported and cut as a cusp.
The silkscreen output is an SVG, not GCode: LightBurn imports SVG and plans the laser job itself. The parser keeps every fp_*/gr_* drawing on F.SilkS, B.SilkS and Edge.Cuts (lines, arcs, circles, rectangles, polygons, in both the modern three-point and the KiCad 4/5 centre-and-angle arc dialects), placed with the same footprint transform the pads use. The SVG uses LightBurn's first three palette colours so each kind of geometry arrives on its own layer:
The bottom side is mirrored left-over-right (the face the laser sees), the same convention as the bottom isolation GCode. Silkscreen text (reference designators, labels) is parsed but not drawn yet — KiCad draws text with its own stroke font, which the engine doesn't carry — and a warning lists how many items were left out.
npm install
npm run dev # dev server
npm run test # vitest unit tests
npm run check # svelte-check / type-check
npm run lint # prettier + eslint
npm run build # production build (adapter-node)"Send feedback" in the footer (and "Report a problem" next to the output) opens a dialog that emails the message to the developer. The user's PCB file is attached by default — they can untick it — and they may add screenshots or other files. The current settings and any warnings on screen go into the email body. POST /api/feedback receives the form and sends it with nodemailer over SMTP, rate-limited per client and guarded by a honeypot field; without SMTP credentials it logs the message in dev and answers 503 in production.
Configure with SMTP_HOST, SMTP_USER, SMTP_PASS (optionally SMTP_PORT, default 465), EMAIL_FROM and FEEDBACK_TO — see .env.example. Production uses Resend's SMTP relay with a sender on the verified kicadtogcode.com domain. The Dockerfile raises adapter-node's BODY_SIZE_LIMIT to 25 MB so attachments fit.
Anonymous, cookie-free counts go to GoatCounter: page views, plus three events, board-converted, sample-converted and output-downloaded. Regenerating after a settings change isn't counted. src/lib/analytics.ts only ever sends those fixed names, never anything from the board, including its name. Results are at grserwe.goatcounter.com.
The site code comes from PUBLIC_GOATCOUNTER_CODE, set in fly.toml. Without it nothing loads, and the note on the landing page saying what is counted disappears too. GoatCounter's script also ignores localhost, so local development never adds to the numbers.
adapter-node, no database, no auth. The only server code is src/routes/api/feedback/ and src/lib/server/email.ts.src/lib/engine/ (sexpr/ tokenizer → parser/ → model/ → geometry/ → toolpath/ → gcode/, plus profile/ for the board cutout and silkscreen/ for the laser SVG), runnable in the browser worker and in vitest..github/workflows/deploy.yml): checks on every push/PR, deploy on master.| Qty | Value | Footprint | References |
|---|---|---|---|
| 4 | MountingHole | MountingHole:MountingHole_3.5mm_Pad | H1, H2, H3, H4 |
| 3 | R | Resistor_THT:R_Axial_DIN0411_L9.9mm_D3.6mm_P12.70mm_Horizontal | 4.7k1, 10k3, 10k4 |
| 2 | D1Relay | G3:D1Shield | U6, U7 |
| 1 | .1uf | Capacitor_THT:CP_Radial_D8.0mm_P2.50mm | C2 |
| 1 | .22uf | Capacitor_THT:CP_Radial_D8.0mm_P2.50mm | C1 |
| 1 | C | Capacitor_THT:CP_Radial_D8.0mm_P3.50mm | 100nf1 |
| 1 | C | Capacitor_THT:CP_Radial_D8.0mm_P2.50mm | 10uf1 |
| 1 | ESP32S-DEVKITV1-30Pin | ESP32:ESP32-DevKitV1-30Pin | U2 |
| 1 | L7805 | Package_TO_SOT_THT:TO-3P-3_Vertical | U10 |
| 1 | LD33v | Package_TO_SOT_THT:TO-3P-3_Vertical | U1 |
| 1 | Screw_Terminal_01x02 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2_1x02_P5.00mm_Horizontal | J9 |
| 1 | Screw_Terminal_01x03 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-3_1x03_P5.00mm_Horizontal | J5 |
| 1 | Screw_Terminal_01x04 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-4_1x04_P5.00mm_Horizontal | J2 |
| 1 | Screw_Terminal_01x06 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-6_1x06_P5.00mm_Horizontal | J3 |
| 1 | Screw_Terminal_01x18 | G3:TerminalBlock_Phoenix_MKDS-1,5-16_1x16_P5.00mm_Horizontal | J1 |
| 1 | TXS0108E | G3:DIP-20_512 | U3 |
It measures 145 × 100 mm and has 2 copper layers, 1.6 mm thick.
22 parts, built around the L7805 and TXS0108EPW. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the grserwe/KiCadToGCodeSvelte repository on GitHub, at the commit this page was made from: the board is static/samples/ShowerController.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask grserwe before reusing the design.

grserwe/KiCadToGCodeSvelte
Convert KiCad PCB designs into CNC GCode for isolation-engraving traces on copper-clad board and drilling through-holes — entirely in the browser.


FPGAwars/icezum
:star2: IceZUM Alhambra: an Arduino-like Open FPGA electronic board

MetalMusings/MyOwnEtherCATDevice
Documentation accompanying the "Make My Own EtherCAT device" video serie on Youtube.

NVIDIA-AI-IOT/my-jetson-nano-baseboard
An open source Jetson Nano baseboard and tools to design your own.

AndreiVladescu/ESP32-Bit-Pirate-Hardware
Carrier breaker-board for the ESP32-S3 Devkit. Works great with the ESP32-Bit-Pirate firmware.


scrapcomputing/ISABlaster
A software-defined ISA card powered by a Raspberry Pi Pico

florianbrede-ayet/esphome-toshiba-hvac-controller
ESPhome component & hardware to control Toshiba & Carrier HVAC units with WIFI interface