Introducing
Autoroute KiCad boards in minutes, not days.
Connect your agent
Sign in and create an API key on your account page, then save it as $HOME/zap-key.txt and run chmod 600 $HOME/zap-key.txt.
No key yet? Any MCP client: npx -y zap-pcb-mcp routes small boards (up to 300 pads, 2 or 4 copper layers) through the free trial, no sign-up.
mkdir -p $HOME/zap && cd $HOME/zap && curl -sO https://zap.mutual.solutions/downloads/zap_mcp.py
claude mcp add zap -e ZAP_API_KEY_FILE=$HOME/zap-key.txt -- python3 $HOME/zap/zap_mcp.py{"mcpServers": {"zap": {"command": "python3",
"args": ["/absolute/path/to/zap_mcp.py"],
"env": {"ZAP_API_KEY_FILE": "/absolute/path/to/zap-key.txt"}}}}[mcp_servers.zap]
command = "python3"
args = ["/absolute/path/to/zap_mcp.py"]
env = { ZAP_API_KEY_FILE = "/absolute/path/to/zap-key.txt" }claude mcp add --transport http zap https://zap.mutual.solutions/mcpcurl -sO https://zap.mutual.solutions/downloads/zap.py
export ZAP_API_KEY_FILE=$HOME/zap-key.txt
python3 zap.py run myboard.kicad_pcbThen restart the agent.
1 CPU core each, up to 60 minutes per board.
Zap!
- Time
- 20 s
- Unrouted
- 0
- Errors
- 1
TraceMaker
- Time
- 72 s
- Unrouted
- 0
- Errors
- 3
tscircuit
- Time
- 89 s
- Unrouted
- 0
- Errors
- 419
Freerouting
- Time
- 205 s
- Unrouted
- 11
- Errors
- 4
FTDI JTAG programmer by Anthony Bernaert · CERN-OHL-P-2.0 · source
Your rules, in full
Rule types it cannot take · lower is better
| Zap! | Trace | Free | ts | |
|---|---|---|---|---|
| Track and via spacing | full | full | approximated | cannot be given |
| Net-class widths and via sizes | full | full | full | approximated |
| Differential pairs: coupling and length | full | full | cannot be given | approximated |
| Copper pours | full | cannot be given | cannot be given | cannot be given |
| Keep-out areas | full | full | approximated | approximated |
| Custom rules (.kicad_dru) | full | full | cannot be given | cannot be given |
fullapproximatedcannot be given
All rule types
tscircuit: 18 rule types
| rule type | boards |
|---|---|
| Rounded, oval and chamfered pads are given as rectangles of the pad size, corners filled in (the input format has no rounded shape; tscircuit's own KiCad import does the same) | 25 |
| No track-to-track or via-to-via spacing rule; the pad spacing is used instead, and some solver stages use a fixed 0.1 mm | 25 |
| No copper pours: power and ground are routed as tracks | 25 |
| One track width per connection: no width ranges, neck-downs or length tuning | 25 |
| No length-matching limits for differential pairs | 17 |
| Differential pairs that reach more than two pads are routed as ordinary nets | 12 |
| Keep-out areas that only forbid pours or parts are ignored (it makes no pours) | 12 |
| Custom-shape pads are covered by rectangles that follow the pad outline (exact where its edges are straight and square) | 7 |
| Spacing overrides on single pads or parts are dropped | 5 |
| Odd-shaped copper inside parts is covered by rectangles that follow its outline | 5 |
| One spacing for every net class (the default class) | 3 |
| The board's custom design rules (.kicad_dru) cannot be expressed | 2 |
| Odd-shaped keep-out areas are covered by rectangles that follow their outline | 2 |
| Internal cut-outs are blocked on every layer | 2 |
| Via-only keep-outs are left out (vias placed there count as errors) | 2 |
| One via size for every net class (the default class) | 1 |
| Track-only keep-outs also block vias (stricter than the board) | 1 |
| Odd-shaped board cut-outs are covered by rectangles that follow their outline | 1 |
Freerouting: 9 rule types
| rule type | boards |
|---|---|
| No hole clearance rule (KiCad's minimum hole clearance; Freerouting used 0) | 25 |
| No minimum hole-to-hole distance | 25 |
| No copper pours: power and ground are routed as tracks | 25 |
| No length or skew rules (net-class or custom) | 25 |
| Differential pairs: no coupling, gap, uncoupled-length or skew rule; routed as independent nets | 17 |
| Keep-out areas that only forbid pours or parts were removed so tracks may pass, as KiCad allows | 11 |
| Copper-to-edge spacing above 0.25 mm not passed on (Freerouting used 0.25 mm) | 10 |
| The board's custom design rules (.kicad_dru) are not exported | 2 |
| Track-only keep-outs also block vias (stricter than the board) | 1 |
TraceMaker: 1 rule type
| rule type | boards |
|---|---|
| No copper pours: power and ground are routed as tracks | 25 |
TraceMaker reported no other board rule it could not evaluate on the 25 public boards; it writes no copper pours.
Zap! reads KiCad net classes and custom rules itself and refuses a job whose rules it cannot read; it refused none of the 25 boards.
Every measure
Boards fully connected
of 25 boards · higher is better
Unrouted connections
total over 25 boards · lower is better
Shorts between nets
total over 25 boards · lower is better
Design-rule errors
total over 25 boards · lower is better
Time on boards both finished
median, lower is better
Connections routed on each board
largest board first
Unrouted connections on each board
largest board first
Shorts on each board
largest board first
Design-rule errors on each board
largest board first
Seconds on each board
largest board first
Antmicro ECP5 DC-SCM93.8%11305093780.9%352023timed outgave upgave upgave upgave upgave up1.3%1,81808timed out100%009–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 113 | 0 | 50 | 937 |
| TraceMaker | 352 | 0 | 23 | timed out |
| tscircuit | 1,843 | gave up | gave up | gave up |
| Freerouting | 1,818 | 0 | 8 | timed out |
| Human designs | 0 | 0 | 9 | – |
tscircuit routed no connection. Error: its pre-check reported a connection as impossible, but the designers' own route for it fits the converted board.













































KiCad layer colours · grey: board edge · dark circles: drill holes
Antmicro ECP5 DC-SCM by Antmicro · Apache-2.0 · source
HackRF Pro99.3%110964292.2%13009timed outgave upgave upgave upgave upgave up95.2%800210timed out100%008–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 11 | 0 | 9 | 642 |
| TraceMaker | 130 | 0 | 9 | timed out |
| tscircuit | 1,364 | gave up | gave up | gave up |
| Freerouting | 80 | 0 | 210 | timed out |
| Human designs | 0 | 0 | 8 | – |
tscircuit routed no connection. Error: its pre-check reported a connection as impossible, but the designers' own route for it fits the converted board.



































KiCad layer colours · grey: board edge · dark circles: drill holes
HackRF Pro by Great Scott Gadgets · CERN-OHL-P-2.0 · source
EmberOne99.5%50144598.4%1800timed out98.2%2059799577100%002182,653100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 5 | 0 | 1 | 445 |
| TraceMaker | 18 | 0 | 0 | timed out |
| tscircuit | 20 | 59 | 799 | 577 |
| Freerouting | 0 | 0 | 218 | 2,653 |
| Human designs | 0 | 0 | 0 | – |
Numbers only: its licence (CERN-OHL-S) asks that modified designs be shared in full. Source.
Buildbotics controller99.2%70451594.8%4604timed out99.8%12178991,38397.0%260203timed out100%005–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 7 | 0 | 4 | 515 |
| TraceMaker | 46 | 0 | 4 | timed out |
| tscircuit | 1 | 217 | 899 | 1,383 |
| Freerouting | 26 | 0 | 203 | timed out |
| Human designs | 0 | 0 | 5 | – |
Numbers only: its licence (CERN-OHL-S) asks that modified designs be shared in full. Source.
Kintex PCIe board99.1%603056791.9%57055timed outtimed outtimed outtimed outtimed outtimed out100%01263timed out100%0018–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 6 | 0 | 30 | 567 |
| TraceMaker | 57 | 0 | 55 | timed out |
| tscircuit | 706 | timed out | timed out | timed out |
| Freerouting | 0 | 1 | 263 | timed out |
| Human designs | 0 | 0 | 18 | – |
tscircuit routed no connection. Killed at the 75-minute backstop, past its 60-minute time limit, while still inside one solver step; no routing written.













































KiCad layer colours · grey: board edge · dark circles: drill holes
Kintex PCIe board by Piotr Binkowski · Apache-2.0 · source
discretesim test board100%0004095.7%25003,00799.6%21656613989.3%6200613100%000–
Antmicro STM32H7 HDMI SO-DIMM board100%00421993.6%360203timed out87.4%712011,122470100%00240timed out100%004–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 4 | 219 |
| TraceMaker | 36 | 0 | 203 | timed out |
| tscircuit | 71 | 201 | 1,122 | 470 |
| Freerouting | 0 | 0 | 240 | timed out |
| Human designs | 0 | 0 | 4 | – |



































KiCad layer colours · grey: board edge · dark circles: drill holes
Antmicro STM32H7 HDMI SO-DIMM board by Antmicro · Apache-2.0 · source
Tiliqua (apfaudio)99.6%201753392.0%42016timed outcrashedcrashedcrashedcrashedcrashed100%002421,727100%0014–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 2 | 0 | 17 | 533 |
| TraceMaker | 42 | 0 | 16 | timed out |
| tscircuit | 510 | crashed | crashed | crashed |
| Freerouting | 0 | 0 | 242 | 1,727 |
| Human designs | 0 | 0 | 14 | – |
tscircuit routed no connection. Error after 1442 s: repair04 merge rejected a new via in the boundary collar.
Numbers only: its licence (CERN-OHL-S) asks that modified designs be shared in full. Source.
Antmicro CM4 baseboard LVDS adapter100%001347899.7%109timed out99.7%1338943998.4%60137733100%001–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 13 | 478 |
| TraceMaker | 1 | 0 | 9 | timed out |
| tscircuit | 1 | 3 | 389 | 439 |
| Freerouting | 6 | 0 | 137 | 733 |
| Human designs | 0 | 0 | 1 | – |



































KiCad layer colours · grey: board edge · dark circles: drill holes
Antmicro CM4 baseboard LVDS adapter by Antmicro · Apache-2.0 · source
Bitaxe Ultra (fork)100%00342099.0%303timed out100%02444425699.6%116986100%003–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 3 | 420 |
| TraceMaker | 3 | 0 | 3 | timed out |
| tscircuit | 0 | 24 | 444 | 256 |
| Freerouting | 1 | 1 | 69 | 86 |
| Human designs | 0 | 0 | 3 | – |
Numbers only: its licence (CERN-OHL-S) asks that modified designs be shared in full. Source.
Xerxes96.4%1101551891.4%27013timed out92.0%2518481234100%00237172100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 11 | 0 | 15 | 518 |
| TraceMaker | 27 | 0 | 13 | timed out |
| tscircuit | 25 | 18 | 481 | 234 |
| Freerouting | 0 | 0 | 237 | 172 |
| Human designs | 0 | 0 | 0 | – |



































KiCad layer colours · grey: board edge · dark circles: drill holes
Xerxes by Rapid Analysis · Apache-2.0 · source
RP2350-PICO2-BB4887.3%340237688.8%3002timed out98.8%32151,02894197.0%80245557100%000–
FTDI JTAG programmer100%00120100%00372100%0214198995.8%1104205100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 1 | 20 |
| TraceMaker | 0 | 0 | 3 | 72 |
| tscircuit | 0 | 21 | 419 | 89 |
| Freerouting | 11 | 0 | 4 | 205 |
| Human designs | 0 | 0 | 0 | – |

























KiCad layer colours · grey: board edge · dark circles: drill holes
FTDI JTAG programmer by Anthony Bernaert · CERN-OHL-P-2.0 · source
Antmicro GMSL serializer98.4%401413199.2%20133,382step limitstep limitstep limitstep limitstep limit92.1%20018547100%007–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 4 | 0 | 14 | 131 |
| TraceMaker | 2 | 0 | 13 | 3,382 |
| tscircuit | 252 | step limit | step limit | step limit |
| Freerouting | 20 | 0 | 18 | 547 |
| Human designs | 0 | 0 | 7 | – |
tscircuit routed no connection. Limit: a fixed step limit inside one solver stage (it ran out of iterations).

























KiCad layer colours · grey: board edge · dark circles: drill holes
Antmicro GMSL serializer by Antmicro · Apache-2.0 · source
Seven99.1%20040294.1%1402timed out100%02554013092.5%1807692100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 2 | 0 | 0 | 402 |
| TraceMaker | 14 | 0 | 2 | timed out |
| tscircuit | 0 | 25 | 540 | 130 |
| Freerouting | 18 | 0 | 7 | 692 |
| Human designs | 0 | 0 | 0 | – |

























KiCad layer colours · grey: board edge · dark circles: drill holes
Seven by ID8 Engineering AB · CERN-OHL-P-2.0 · source
Argos demo board100%00024100%000511100%018114104100%001104100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 0 | 24 |
| TraceMaker | 0 | 0 | 0 | 511 |
| tscircuit | 0 | 18 | 114 | 104 |
| Freerouting | 0 | 0 | 1 | 104 |
| Human designs | 0 | 0 | 0 | – |
Numbers only: its licence (CERN-OHL-S) asks that modified designs be shared in full. Source.
Antmicro CVBS-to-MIPI bridge100%00210998.5%301timed out100%03224014498.1%4016410100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 2 | 109 |
| TraceMaker | 3 | 0 | 1 | timed out |
| tscircuit | 0 | 32 | 240 | 144 |
| Freerouting | 4 | 0 | 16 | 410 |
| Human designs | 0 | 0 | 0 | – |

























KiCad layer colours · grey: board edge · dark circles: drill holes
Antmicro CVBS-to-MIPI bridge by Antmicro · Apache-2.0 · source
Trellis Core100%00020100%000559100%0213080100%002130100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 0 | 20 |
| TraceMaker | 0 | 0 | 0 | 559 |
| tscircuit | 0 | 2 | 130 | 80 |
| Freerouting | 0 | 0 | 2 | 130 |
| Human designs | 0 | 0 | 0 | – |

























KiCad layer colours · grey: board edge · dark circles: drill holes
Trellis Core by Protolux Electronics SARL-S · CERN-OHL-P-2.0 · source
Antmicro PMOD I3C sensor board100%00710100%00732497.2%5382324299.4%1286414100%007–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 7 | 10 |
| TraceMaker | 0 | 0 | 7 | 324 |
| tscircuit | 5 | 38 | 232 | 42 |
| Freerouting | 1 | 2 | 86 | 414 |
| Human designs | 0 | 0 | 7 | – |

























KiCad layer colours · grey: board edge · dark circles: drill holes
Antmicro PMOD I3C sensor board by Antmicro · Apache-2.0 · source
Ender-3 load-cell bed-levelling sensor100%00229100%002109100%01328510399.3%10271100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 2 | 29 |
| TraceMaker | 0 | 0 | 2 | 109 |
| tscircuit | 0 | 13 | 285 | 103 |
| Freerouting | 1 | 0 | 2 | 71 |
| Human designs | 0 | 0 | 0 | – |















KiCad layer colours · grey: board edge · dark circles: drill holes
Ender-3 load-cell bed-levelling sensor by Lakshminarayanan · MIT · source
ECP5 BGA-381 FT2232HQ FIFO board100%0006995.8%600timed out82.6%2502663100%000120100%000–
RP2040 development board99.2%10418492.0%11052,174100%016279351887.7%17035257100%003–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 1 | 0 | 4 | 184 |
| TraceMaker | 11 | 0 | 5 | 2,174 |
| tscircuit | 0 | 162 | 793 | 518 |
| Freerouting | 17 | 0 | 35 | 257 |
| Human designs | 0 | 0 | 3 | – |
Numbers only: by decision. Source.
Antmicro signal-integrity test board100%0008895.3%50031966.3%36172034100%000529100%003–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 0 | 88 |
| TraceMaker | 5 | 0 | 0 | 319 |
| tscircuit | 36 | 17 | 20 | 34 |
| Freerouting | 0 | 0 | 0 | 529 |
| Human designs | 0 | 0 | 3 | – |

























KiCad layer colours · grey: board edge · dark circles: drill holes
Antmicro signal-integrity test board by Antmicro · Apache-2.0 · source
Antmicro dual IPEX CSI interposer100%00933100%0069412100%003561100%006871100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 9 | 33 |
| TraceMaker | 0 | 0 | 69 | 412 |
| tscircuit | 0 | 0 | 35 | 61 |
| Freerouting | 0 | 0 | 68 | 71 |
| Human designs | 0 | 0 | 0 | – |

























KiCad layer colours · grey: board edge · dark circles: drill holes
Antmicro dual IPEX CSI interposer by Antmicro · Apache-2.0 · source
Arduino water-level monitor100%0005100%00011100%0038100%00717100%000–
Boards fully connected
of 25 boards · higher is better
Unrouted connections
total over 25 boards · lower is better
Shorts between nets
total over 25 boards · lower is better
Design-rule errors
total over 25 boards · lower is better
Time on boards both finished
median, lower is better
Zap!, TraceMaker, Freerouting: 6 CPU threads; tscircuit: 1. Up to 60 minutes per board.
Connections routed on each board
largest board first
Unrouted connections on each board
largest board first
Shorts on each board
largest board first
Design-rule errors on each board
largest board first
Seconds on each board
largest board first
Antmicro ECP5 DC-SCM96.6%61031timed out87.0%239026timed outgave upgave upgave upgave upgave up1.0%1,82406timed out100%009–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 61 | 0 | 31 | timed out |
| TraceMaker | 239 | 0 | 26 | timed out |
| tscircuit | 1,843 | gave up | gave up | gave up |
| Freerouting | 1,824 | 0 | 6 | timed out |
| Human designs | 0 | 0 | 9 | – |
tscircuit routed no connection. Error: its pre-check reported a connection as impossible, but the designers' own route for it fits the converted board.





Antmicro ECP5 DC-SCM by Antmicro · Apache-2.0 · source
HackRF Pro99.7%409timed out94.7%88010timed outgave upgave upgave upgave upgave up93.6%1060208timed out100%008–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 4 | 0 | 9 | timed out |
| TraceMaker | 88 | 0 | 10 | timed out |
| tscircuit | 1,364 | gave up | gave up | gave up |
| Freerouting | 106 | 0 | 208 | timed out |
| Human designs | 0 | 0 | 8 | – |
tscircuit routed no connection. Error: its pre-check reported a connection as impossible, but the designers' own route for it fits the converted board.





HackRF Pro by Great Scott Gadgets · CERN-OHL-P-2.0 · source
EmberOne100%00177499.9%100timed out98.2%2059799577100%002182,432100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 1 | 774 |
| TraceMaker | 1 | 0 | 0 | timed out |
| tscircuit | 20 | 59 | 799 | 577 |
| Freerouting | 0 | 0 | 218 | 2,432 |
| Human designs | 0 | 0 | 0 | – |
Numbers only: its licence (CERN-OHL-S) asks that modified designs be shared in full. Source.
Buildbotics controller99.6%304timed out98.5%1304timed out99.8%12178991,38397.1%250203timed out100%005–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 3 | 0 | 4 | timed out |
| TraceMaker | 13 | 0 | 4 | timed out |
| tscircuit | 1 | 217 | 899 | 1,383 |
| Freerouting | 25 | 0 | 203 | timed out |
| Human designs | 0 | 0 | 5 | – |
Numbers only: its licence (CERN-OHL-S) asks that modified designs be shared in full. Source.
Kintex PCIe board99.4%4036timed out99.5%3052timed outtimed outtimed outtimed outtimed outtimed out100%012633,116100%0018–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 4 | 0 | 36 | timed out |
| TraceMaker | 3 | 0 | 52 | timed out |
| tscircuit | 706 | timed out | timed out | timed out |
| Freerouting | 0 | 1 | 263 | 3,116 |
| Human designs | 0 | 0 | 18 | – |
tscircuit routed no connection. Killed at the 75-minute backstop, past its 60-minute time limit, while still inside one solver step; no routing written.





Kintex PCIe board by Piotr Binkowski · Apache-2.0 · source
discretesim test board100%0007396.3%21003,25099.6%21656613989.3%6200597100%000–
Antmicro STM32H7 HDMI SO-DIMM board100%00437796.6%190203timed out87.4%712011,122470100%002403,290100%004–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 4 | 377 |
| TraceMaker | 19 | 0 | 203 | timed out |
| tscircuit | 71 | 201 | 1,122 | 470 |
| Freerouting | 0 | 0 | 240 | 3,290 |
| Human designs | 0 | 0 | 4 | – |





Antmicro STM32H7 HDMI SO-DIMM board by Antmicro · Apache-2.0 · source
Tiliqua (apfaudio)100%00181,52299.4%3018timed outcrashedcrashedcrashedcrashedcrashed100%00242476100%0014–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 18 | 1,522 |
| TraceMaker | 3 | 0 | 18 | timed out |
| tscircuit | 510 | crashed | crashed | crashed |
| Freerouting | 0 | 0 | 242 | 476 |
| Human designs | 0 | 0 | 14 | – |
tscircuit routed no connection. Error after 1442 s: repair04 merge rejected a new via in the boundary collar.
Numbers only: its licence (CERN-OHL-S) asks that modified designs be shared in full. Source.
Antmicro CM4 baseboard LVDS adapter100%0013790100%001163099.7%1338943998.4%60137552100%001–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 13 | 790 |
| TraceMaker | 0 | 0 | 11 | 630 |
| tscircuit | 1 | 3 | 389 | 439 |
| Freerouting | 6 | 0 | 137 | 552 |
| Human designs | 0 | 0 | 1 | – |





Antmicro CM4 baseboard LVDS adapter by Antmicro · Apache-2.0 · source
Bitaxe Ultra (fork)100%00374699.0%303timed out100%02444425699.6%126950100%003–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 3 | 746 |
| TraceMaker | 3 | 0 | 3 | timed out |
| tscircuit | 0 | 24 | 444 | 256 |
| Freerouting | 1 | 2 | 69 | 50 |
| Human designs | 0 | 0 | 3 | – |
Numbers only: its licence (CERN-OHL-S) asks that modified designs be shared in full. Source.
Xerxes100%0014timed out100%001462192.0%2518481234100%0023790100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 14 | timed out |
| TraceMaker | 0 | 0 | 14 | 621 |
| tscircuit | 25 | 18 | 481 | 234 |
| Freerouting | 0 | 0 | 237 | 90 |
| Human designs | 0 | 0 | 0 | – |





Xerxes by Rapid Analysis · Apache-2.0 · source
RP2350-PICO2-BB4890.7%2503timed out90.7%2502timed out98.8%32151,02894198.5%40254742100%000–
FTDI JTAG programmer100%00194100%001108100%0214198995.8%1104168100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 1 | 94 |
| TraceMaker | 0 | 0 | 1 | 108 |
| tscircuit | 0 | 21 | 419 | 89 |
| Freerouting | 11 | 0 | 4 | 168 |
| Human designs | 0 | 0 | 0 | – |





FTDI JTAG programmer by Anthony Bernaert · CERN-OHL-P-2.0 · source
Antmicro GMSL serializer99.6%1014timed out99.2%2013timed outstep limitstep limitstep limitstep limitstep limit92.1%20018337100%007–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 1 | 0 | 14 | timed out |
| TraceMaker | 2 | 0 | 13 | timed out |
| tscircuit | 252 | step limit | step limit | step limit |
| Freerouting | 20 | 0 | 18 | 337 |
| Human designs | 0 | 0 | 7 | – |
tscircuit routed no connection. Limit: a fixed step limit inside one solver stage (it ran out of iterations).





Antmicro GMSL serializer by Antmicro · Apache-2.0 · source
Seven99.1%200timed out100%0012,062100%02554013092.5%1807608100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 2 | 0 | 0 | timed out |
| TraceMaker | 0 | 0 | 1 | 2,062 |
| tscircuit | 0 | 25 | 540 | 130 |
| Freerouting | 18 | 0 | 7 | 608 |
| Human designs | 0 | 0 | 0 | – |





Seven by ID8 Engineering AB · CERN-OHL-P-2.0 · source
Argos demo board100%00079100%00086100%018114104100%00128100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 0 | 79 |
| TraceMaker | 0 | 0 | 0 | 86 |
| tscircuit | 0 | 18 | 114 | 104 |
| Freerouting | 0 | 0 | 1 | 28 |
| Human designs | 0 | 0 | 0 | – |
Numbers only: its licence (CERN-OHL-S) asks that modified designs be shared in full. Source.
Antmicro CVBS-to-MIPI bridge100%002181100%00079100%03224014498.1%4016283100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 2 | 181 |
| TraceMaker | 0 | 0 | 0 | 79 |
| tscircuit | 0 | 32 | 240 | 144 |
| Freerouting | 4 | 0 | 16 | 283 |
| Human designs | 0 | 0 | 0 | – |





Antmicro CVBS-to-MIPI bridge by Antmicro · Apache-2.0 · source
Trellis Core100%000622100%000827100%0213080100%00242100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 0 | 622 |
| TraceMaker | 0 | 0 | 0 | 827 |
| tscircuit | 0 | 2 | 130 | 80 |
| Freerouting | 0 | 0 | 2 | 42 |
| Human designs | 0 | 0 | 0 | – |





Trellis Core by Protolux Electronics SARL-S · CERN-OHL-P-2.0 · source
Antmicro PMOD I3C sensor board100%00713100%0079197.2%5382324299.4%1186197100%007–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 7 | 13 |
| TraceMaker | 0 | 0 | 7 | 91 |
| tscircuit | 5 | 38 | 232 | 42 |
| Freerouting | 1 | 1 | 86 | 197 |
| Human designs | 0 | 0 | 7 | – |





Antmicro PMOD I3C sensor board by Antmicro · Apache-2.0 · source
Ender-3 load-cell bed-levelling sensor100%00252100%00239100%01328510399.3%10237100%000–
ECP5 BGA-381 FT2232HQ FIFO board100%000141100%00015982.6%2502663100%00035100%000–
RP2040 development board100%0042,69592.8%10053,072100%016279351887.7%17035227100%003–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 4 | 2,695 |
| TraceMaker | 10 | 0 | 5 | 3,072 |
| tscircuit | 0 | 162 | 793 | 518 |
| Freerouting | 17 | 0 | 35 | 227 |
| Human designs | 0 | 0 | 3 | – |
Numbers only: by decision. Source.
Antmicro signal-integrity test board100%00015495.3%50035566.3%36172034100%000198100%003–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 0 | 154 |
| TraceMaker | 5 | 0 | 0 | 355 |
| tscircuit | 36 | 17 | 20 | 34 |
| Freerouting | 0 | 0 | 0 | 198 |
| Human designs | 0 | 0 | 3 | – |





Antmicro signal-integrity test board by Antmicro · Apache-2.0 · source
Antmicro dual IPEX CSI interposer100%00872100%008991100%003561100%006824100%000–
| router | Unrouted | Shorts | Rule errors | Seconds |
|---|---|---|---|---|
| Zap! | 0 | 0 | 8 | 72 |
| TraceMaker | 0 | 0 | 89 | 91 |
| tscircuit | 0 | 0 | 35 | 61 |
| Freerouting | 0 | 0 | 68 | 24 |
| Human designs | 0 | 0 | 0 | – |





Antmicro dual IPEX CSI interposer by Antmicro · Apache-2.0 · source
Exact numbers
| 25 boards | Fully connectedboards ↑ | Unroutedconnections ↓ | Shortscount ↓ | Rule errorscount ↓ | Secondsmedian, all boards ↓ | Longestseconds ↓ | Timed outboards ↓ | Connected, no errorsboards ↑ | Manufacturing findingsJLCPCB limits ↓ |
|---|---|---|---|---|---|---|---|---|---|
| Zap! | 14 | 196 | 0 | 187 | 184 | 937 | 0 | 6 | 1,181 |
| Zap!, 60 minutesoption minutes: 60 | 15 | 124 | 0 | 166 | 427 | timed out | 10 | 6 | 1,214 |
| TraceMaker | 7 | 808 | 0 | 439 | timed out (14 of 25) | timed out | 14 | 3 | 2,202 |
| tscircuit60-minute limit | 10 | 4,864 | 1,081 | 8,617 | 130 | timed out | 1 | 0 | 5,100 |
| Freerouting | 11 | 2,073 | 4 | 2,318 | 529 | timed out | 5 | 2 | 2,376 |
| Human designs | 25 | 0 | 0 | 82 | – | – | – | 13 | 3,235 |
| Variants | |||||||||
| Zap! previous buildserved until 2026-10-13 | 10 | 230 | 0 | 200 | 42 | 770 | 0 | 5 | 6,009 |
| TraceMakerwithout pairs first | 7 | 1,143 | 0 | 370 | 601 | 605 | 0 | 2 | 2,067 |
| tscircuit10-minute limit | 10 | 5,885 | 648 | 6,693 | 142 | 694 | 0 | 0 | 3,452 |
Manufacturing findings: Zap!'s check against JLCPCB standard limits.
Boards from the other routers' own projects
KiCad default rules (no rules file in their repositories).
| board | routed by | Unrouted↓ | Shorts↓ | Rule errors↓ | Seconds↓ |
|---|---|---|---|---|---|
| KiCad demo: PIC programmer | Zap! (earlier run) | 0 | 0 | 0 | 21 |
| TraceMaker (earlier 10-minute run) | 4 | 0 | 0 | 108 | |
| tscircuit (10 min) | 0 | 20 | 72 | 19 | |
| Published (human-routed) | 0 | 0 | 0 | – | |
| KiCad demo: video | Zap! (earlier run) | 231 | 0 | 0 | 699 |
| TraceMaker (earlier 10-minute run) | 248 | 0 | 0 | 601 | |
| tscircuit (10 min) | 1,458 | 0 | 0 | 603 | |
| Published (human-routed) | 0 | 0 | 0 | – | |
| TraceMaker test board (plane + SMD) | Zap! (earlier run) | 1 | 0 | 0 | 1 |
| TraceMaker (earlier 10-minute run) | 1 | 0 | 0 | 267 | |
| tscircuit (10 min) | 0 | 49 | 262 | 231 | |
| Published (published unrouted) | 47 | 0 | 0 | – | |
| tscircuit Core1106 carrier | Zap! (earlier run) | 0 | 0 | 1 | 46 |
| TraceMaker (earlier 10-minute run) | 5 | 0 | 1 | 601 | |
| tscircuit (10 min) | 0 | 2 | 464 | 100 | |
| Published (routed by tscircuit's own pipeline) | 0 | 0 | 1,452 | – | |
| tscircuit RP2040 LiPo charger | Zap! (earlier run) | 20 | 0 | 6 | 7 |
| TraceMaker (earlier 10-minute run) | 4 | 0 | 6 | 601 | |
| tscircuit (10 min) | 0 | 5 | 258 | 49 | |
| Published (routed by tscircuit's own pipeline) | 0 | 5 | 510 | – |
Exact numbers
| 25 boards | Fully connectedboards ↑ | Unroutedconnections ↓ | Shortscount ↓ | Rule errorscount ↓ | Secondsmedian, all boards ↓ | Longestseconds ↓ | Timed outboards ↓ | Connected, no errorsboards ↑ | Manufacturing findingsJLCPCB limits ↓ |
|---|---|---|---|---|---|---|---|---|---|
| Zap!best of attempts within 60 minutes, 6 CPU threads | 18 | 100 | 0 | 174 | 746 | timed out | 8 | 6 | 1,298 |
| TraceMaker | 12 | 432 | 0 | 461 | 2,062 | timed out | 10 | 5 | 2,704 |
| tscircuit60-minute limit | 10 | 4,864 | 1,081 | 8,617 | 130 | timed out | 1 | 0 | 5,100 |
| Freerouting | 11 | 2,100 | 4 | 2,323 | 283 | timed out | 3 | 2 | 2,382 |
| Human designs | 25 | 0 | 0 | 82 | – | – | – | 13 | 3,235 |
| Variants | |||||||||
| Zap! previous buildserved until 2026-10-13 | 10 | 230 | 0 | 200 | 42 | 770 | 0 | 5 | 6,009 |
| TraceMakerwithout pairs first | 7 | 1,143 | 0 | 370 | 601 | 605 | 0 | 2 | 2,067 |
| tscircuit10-minute limit | 10 | 5,885 | 648 | 6,693 | 142 | 694 | 0 | 0 | 3,452 |
Manufacturing findings: Zap!'s check against JLCPCB standard limits.
Boards from the other routers' own projects
KiCad default rules (no rules file in their repositories).
| board | routed by | Unrouted↓ | Shorts↓ | Rule errors↓ | Seconds↓ |
|---|---|---|---|---|---|
| KiCad demo: PIC programmer | Zap! (earlier run) | 0 | 0 | 0 | 21 |
| TraceMaker (earlier 10-minute run) | 4 | 0 | 0 | 108 | |
| tscircuit (10 min) | 0 | 20 | 72 | 19 | |
| Published (human-routed) | 0 | 0 | 0 | – | |
| KiCad demo: video | Zap! (earlier run) | 231 | 0 | 0 | 699 |
| TraceMaker (earlier 10-minute run) | 248 | 0 | 0 | 601 | |
| tscircuit (10 min) | 1,458 | 0 | 0 | 603 | |
| Published (human-routed) | 0 | 0 | 0 | – | |
| TraceMaker test board (plane + SMD) | Zap! (earlier run) | 1 | 0 | 0 | 1 |
| TraceMaker (earlier 10-minute run) | 1 | 0 | 0 | 267 | |
| tscircuit (10 min) | 0 | 49 | 262 | 231 | |
| Published (published unrouted) | 47 | 0 | 0 | – | |
| tscircuit Core1106 carrier | Zap! (earlier run) | 0 | 0 | 1 | 46 |
| TraceMaker (earlier 10-minute run) | 5 | 0 | 1 | 601 | |
| tscircuit (10 min) | 0 | 2 | 464 | 100 | |
| Published (routed by tscircuit's own pipeline) | 0 | 0 | 1,452 | – | |
| tscircuit RP2040 LiPo charger | Zap! (earlier run) | 20 | 0 | 6 | 7 |
| TraceMaker (earlier 10-minute run) | 4 | 0 | 6 | 601 | |
| tscircuit (10 min) | 0 | 5 | 258 | 49 | |
| Published (routed by tscircuit's own pipeline) | 0 | 5 | 510 | – |
Method
- Measured 12–14 Oct 2026.
- Boards: 25 public KiCad projects, open licence, human-routed. Placement kept; tracks, vias and pours removed; the board's own net classes and rules.
- TraceMaker and Freerouting: 1 CPU core, up to 60 min per board, no GPU; TraceMaker used up to 25 GB, more than Zap!'s 14 GB; Freerouting's Java memory capped at 12 GB.
- tscircuit: 1 CPU core, up to 60 min per board; it checks its limit only between solver steps, so a run still inside one step was stopped at 75 min. Zap! stops after a fixed amount of work on 1 CPU core: 3.1 min median, 16 min longest.
- Zap!: router build re92d124, the build zap.mutual.solutions runs now; the same machines and session as the others, 1 CPU core, single run (the service default). One board, the Antmicro ECP5 DC-SCM, can't yet be routed on zap.mutual.solutions: the service runs several routing attempts at once, and on this board together they need more than its 14 GB job limit.
- Zap!, 60 minutes: the upload option minutes: 60, in the same session on 1 CPU core per board; 10 of 25 boards used the full 60 minutes. The hosted service runs up to 6 of its attempts at once.
- Check: KiCad 10.0.6 design-rule check after refilling pours, each board's rules; at most 199 findings of one kind per board (499 for spacing).
- Fully connected: every pad that should be joined is joined.
- Time: for each router, the median seconds on the boards that both it and Zap! fully connected within 3,600 s, beside Zap!'s median on those same boards; the board view lists every board's time.
- Timed out: a run over 3,600 s; its time reads timed out, its other numbers are scored from the board it left.
- Unrouted: pad pairs that should be joined but are not (KiCad's count).
- Short: copper of two nets touching.
- Errors: design-rule errors, shorts included; 74 per router come from the placement.
- Time: start to finished board file.
- Colour: Zap! cyan, others grey; board view log10(1 + value) against the column's largest value.
- Race: FTDI JTAG programmer, a dense board where every router finished; shown as one of the 25.
- Race, Zap!: copper per net in the order of a traced re-run, byte-identical to the measured run, its times scaled to the measured run; final shapes.
- Race, others: TraceMaker, tscircuit, Freerouting: in-between states recorded from runs of the same versions and settings, final board identical to the benchmark, times scaled to the benchmark run.
- Race clock: 6 times real time until Zap! finishes, then moved by scrolling. Unrouted starts at KiCad's count on the unrouted board (260). Number colours: best of the four cyan, worst coral, log scale.
Versions and settings
| Zap! | Zap! router build re92d124.57335f59, the build zap.mutual.solutions runs now; boards routed 2026-10-14 | the same machines and session as the others, 1 CPU core per board, single run (the service default); no clock: stops after a fixed amount of work (3.1 min median, 16 min longest here); makes its own copper pours |
|---|---|---|
| Zap!, 60 minutesoption minutes: 60 | Zap! router build re92d124.57335f59, the build zap.mutual.solutions runs now; boards routed 2026-10-14 | the same machines and session as the others, 1 CPU core per board: the single run, then more attempts one after another (twice and four times the work, then other router settings) until one has every connection and no short, or 60 minutes pass; keeps the best |
| TraceMaker | TraceMaker v0.9.0-116-g49fbd3c (main branch, commit 49fbd3c of 2026-10-14, the latest public version when run), built CPU-only with GCC 14.2; boards routed 2026-10-14 | --time 3600 --threads 1 --no-kb --diff-pairs --keep-vias-off-pads --vias-off-pads-below 1000; 1 CPU core per board, no GPU |
| tscircuit60-minute limit | @tscircuit/capacity-autorouter 0.0.973 (AutoroutingPipelineSolver9_PreloadedTraceGraph) on Node.js v24.21.0, through this page's runner from the corrected input conversion; boards routed 2026-10-14 (UTC) | effort 1 (tscircuit's default); 1 CPU core per board; solver limit 3,600 s (60 minutes, the Zap! service's job limit), stopped at 75 minutes at the latest; a board stopped at the limit has no routing, since tscircuit returns routing only after its last stage |
| Freerouting | Freerouting 2.5.0 (latest stable release, published 2026-10-05; tag v2.5.0, build revision b647a2f824cfbc54bc4dcaee71b03b7cd945eb76 from the jar manifest), routed through the Specctra DSN and SES files that KiCad's Freerouting plugin uses (exported and imported with KiCad 10.0.6); boards routed 2026-10-14 | 1 CPU core, 60-minute job limit, 12 GB Java memory cap, its own defaults otherwise |
| Zap! previous buildserved until 2026-10-13 | Zap! router build r009e659.8f766f9f, served until service release 2026.10.13.29 on 2026-10-13; boards routed 2026-10-12 | same settings as the served build |
| TraceMakerwithout pairs first | TraceMaker v0.9.0-90-gc6fcb7b (an earlier build, commit of 2026-10-11); boards routed 2026-10-13 | --time 600 --threads 1, without --diff-pairs (TraceMaker's own default pair handling) |
| tscircuit10-minute limit | @tscircuit/capacity-autorouter 0.0.973 (AutoroutingPipelineSolver9_PreloadedTraceGraph) on Node.js v24.21.0; boards routed 2026-10-13 (UTC) from the corrected input conversion | effort 1 (tscircuit's default); solver stopped at 600 s. tscircuit routes in stages and returns routing only after its last stage, so a board stopped at the limit has no routing at all: it never returns a partial result |
Where tscircuit wrote no routing
| cause | boards |
|---|---|
| Error: its pre-check reported a connection as impossible, but the designers' own route for it fits the converted board | 2 |
| Limit: a fixed step limit inside one solver stage (it ran out of iterations) | 1 |
| Error after 1442 s: repair04 merge rejected a new via in the boundary collar | 1 |
| Killed at the 75-minute backstop, past its 60-minute time limit, while still inside one solver step; no routing written | 1 |
On tscircuit's own benchmark
| problem set | Problems | Zap!verified % | tscircuitverified % | Zap!solver says % | tscircuitsolver says % |
|---|---|---|---|---|---|
| dataset01 | 85 | 100.0 | 100.0 | 100.0 | 100.0 |
| srj18 | 15 | 100.0 | 86.7 | 100.0 | 100.0 |
| srj19 | 200 | 71.0 | 92.0 | 71.0 | 93.5 |
| srj20 | 200 | 51.5 | 79.0 | 51.5 | 79.0 |
| srj21 | 10 | 100.0 | 100.0 | 100.0 | 100.0 |
| srj23 | 76 | 100.0 | 97.4 | 86.8 | 98.7 |
Run 2026-10-13. tscircuit's checker for both; verified = every requested connection complete. Zap!: build 009e659 (served until 2026-10-13), JLC minimum via (0.4 mm; the problems use 0.3 mm). tscircuit: @tscircuit/capacity-autorouter 0.0.976 at 1256328 (commit of 2026-10-12), MIT licence. srj18 without one problem that overlaps our held-out boards.
Reproduce
# TraceMaker 49fbd3c, CPU-only build, on 1 CPU core
tracemaker route in.kicad_pcb -o routed.kicad_pcb --time 3600 --threads 1 --no-kb --diff-pairs \
--keep-vias-off-pads --vias-off-pads-below 1000
# Freerouting 2.5.0 on 1 CPU core, on the DSN that KiCad exports
java -Xmx12g -Xms256m -jar \
freerouting-2.5.0.jar -de in.dsn -do \
out.ses --gui.enabled=false --api_server.enabled=false --profile.allow_telemetry=false \
--usage_and_diagnostic_data.disable_analytics=true --router.max_threads=1 --router.job_timeout=01:00:00 --router.result_json=result.json
# tscircuit: @tscircuit/capacity-autorouter 0.0.973 on 1 CPU core through this page's runner,
# effort 1, 60-minute limit, stopped at 75 minutes at the latest
# Zap! through the service (API key: sign in at /auth/login and create one on your account page)
python3 zap.py run in.kicad_pcb
# check any result
kicad-cli pcb drc --refill-zones --severity-all --format json -o drc.json routed.kicad_pcb
Data: compare.json, written 2026-10-14 15:17:52 UTC. Questions or a board to add: hello@mutual.solutions.
Method
- Measured 12–14 Oct 2026.
- Boards: 25 public KiCad projects, open licence, human-routed. Placement kept; tracks, vias and pours removed; the board's own net classes and rules.
- TraceMaker and Freerouting: 6 CPU threads, up to 60 min per board, no GPU; Freerouting's Java memory capped at 12 GB.
- Runs on 14 October (UTC): TraceMaker and Freerouting 09:30 to 10:40, Zap! 12:35 and 16:14 to 17:15; all on the same machine type, with 6 consecutive vCPUs per board.
- Peak memory per board: TraceMaker 60 GB, Freerouting 8 GB, Zap! 69 GB, the sum of its attempts running at once.
- tscircuit uses one thread: 1 CPU core, up to 60 min per board; it checks its limit only between solver steps, so a run still inside one step was stopped at 75 min. Zap! keeps the best of its attempts within 60 minutes on 6 CPU threads: 12.4 min median, 8 of 25 boards timed out.
- Zap!: router build re92d124 on 6 CPU threads per board: up to 6 routing attempts at once with different settings of the build, new ones as threads free up, until one has every connection and no short (the running ones then finish) or 60 minutes pass; keeps the best. One board, the Antmicro ECP5 DC-SCM, can't yet be routed on zap.mutual.solutions: the service runs several routing attempts at once, and on this board together they need more than its 14 GB job limit.
- Check: KiCad 10.0.6 design-rule check after refilling pours, each board's rules; at most 199 findings of one kind per board (499 for spacing).
- Fully connected: every pad that should be joined is joined.
- Time: for each router, the median seconds on the boards that both it and Zap! fully connected within 3,600 s, beside Zap!'s median on those same boards; the board view lists every board's time.
- Timed out: a run over 3,600 s; its time reads timed out, its other numbers are scored from the board it left.
- Unrouted: pad pairs that should be joined but are not (KiCad's count).
- Short: copper of two nets touching.
- Errors: design-rule errors, shorts included; 74 per router come from the placement.
- Time: start to finished board file.
- Colour: Zap! cyan, others grey; board view log10(1 + value) against the column's largest value.
- Race: FTDI JTAG programmer, a dense board where every router finished; shown as one of the 25.
- Race, Zap!: copper per net in the order of a traced re-run, byte-identical to the measured run, its times scaled to the measured run; final shapes.
- Race, others: TraceMaker, tscircuit, Freerouting: in-between states recorded from runs of the same versions and settings, final board identical to the benchmark, times scaled to the benchmark run.
- Race clock: 6 times real time until Zap! finishes, then moved by scrolling. Unrouted starts at KiCad's count on the unrouted board (260). Number colours: best of the four cyan, worst coral, log scale.
Versions and settings
| Zap!best of attempts within 60 minutes, 6 CPU threads | Zap! router build re92d124.57335f59, the build zap.mutual.solutions runs now; boards routed 2026-10-14 | 6 CPU threads per board: up to 6 routing attempts at once with different settings of the build, new ones as threads free up, until one has every connection and no short (the running ones then finish) or 60 minutes pass; keeps the best (12.4 min median, 8 of 25 boards timed out here); makes its own copper pours |
|---|---|---|
| TraceMaker | TraceMaker v0.9.0-116-g49fbd3c (main branch, commit 49fbd3c of 2026-10-14, the latest public version when run), built CPU-only with GCC 14.2; boards routed 2026-10-14 | --time 3600 --threads 6 --no-kb --diff-pairs --keep-vias-off-pads --vias-off-pads-below 1000; 6 CPU threads per board, no GPU |
| tscircuit60-minute limit | @tscircuit/capacity-autorouter 0.0.973 (AutoroutingPipelineSolver9_PreloadedTraceGraph) on Node.js v24.21.0, through this page's runner from the corrected input conversion; boards routed 2026-10-14 (UTC) | effort 1 (tscircuit's default); 1 CPU core per board; solver limit 3,600 s (60 minutes, the Zap! service's job limit), stopped at 75 minutes at the latest; a board stopped at the limit has no routing, since tscircuit returns routing only after its last stage |
| Freerouting | Freerouting 2.5.0 (latest stable release, published 2026-10-05; tag v2.5.0, build revision b647a2f824cfbc54bc4dcaee71b03b7cd945eb76 from the jar manifest), routed through the Specctra DSN and SES files that KiCad's Freerouting plugin uses (exported and imported with KiCad 10.0.6); boards routed 2026-10-14 | 6 CPU threads, 60-minute job limit, 12 GB Java memory cap, its own defaults otherwise |
| Zap! previous buildserved until 2026-10-13 | Zap! router build r009e659.8f766f9f, served until service release 2026.10.13.29 on 2026-10-13; boards routed 2026-10-12 | same settings as the served build |
| TraceMakerwithout pairs first | TraceMaker v0.9.0-90-gc6fcb7b (an earlier build, commit of 2026-10-11); boards routed 2026-10-13 | --time 600 --threads 1, without --diff-pairs (TraceMaker's own default pair handling) |
| tscircuit10-minute limit | @tscircuit/capacity-autorouter 0.0.973 (AutoroutingPipelineSolver9_PreloadedTraceGraph) on Node.js v24.21.0; boards routed 2026-10-13 (UTC) from the corrected input conversion | effort 1 (tscircuit's default); solver stopped at 600 s. tscircuit routes in stages and returns routing only after its last stage, so a board stopped at the limit has no routing at all: it never returns a partial result |
Where tscircuit wrote no routing
| cause | boards |
|---|---|
| Error: its pre-check reported a connection as impossible, but the designers' own route for it fits the converted board | 2 |
| Limit: a fixed step limit inside one solver stage (it ran out of iterations) | 1 |
| Error after 1442 s: repair04 merge rejected a new via in the boundary collar | 1 |
| Killed at the 75-minute backstop, past its 60-minute time limit, while still inside one solver step; no routing written | 1 |
On tscircuit's own benchmark
| problem set | Problems | Zap!verified % | tscircuitverified % | Zap!solver says % | tscircuitsolver says % |
|---|---|---|---|---|---|
| dataset01 | 85 | 100.0 | 100.0 | 100.0 | 100.0 |
| srj18 | 15 | 100.0 | 86.7 | 100.0 | 100.0 |
| srj19 | 200 | 71.0 | 92.0 | 71.0 | 93.5 |
| srj20 | 200 | 51.5 | 79.0 | 51.5 | 79.0 |
| srj21 | 10 | 100.0 | 100.0 | 100.0 | 100.0 |
| srj23 | 76 | 100.0 | 97.4 | 86.8 | 98.7 |
Run 2026-10-13. tscircuit's checker for both; verified = every requested connection complete. Zap!: build 009e659 (served until 2026-10-13), JLC minimum via (0.4 mm; the problems use 0.3 mm). tscircuit: @tscircuit/capacity-autorouter 0.0.976 at 1256328 (commit of 2026-10-12), MIT licence. srj18 without one problem that overlaps our held-out boards.
Reproduce
# TraceMaker 49fbd3c, CPU-only build, on 6 CPU threads
tracemaker route in.kicad_pcb -o routed.kicad_pcb --time 3600 --threads 6 --no-kb --diff-pairs \
--keep-vias-off-pads --vias-off-pads-below 1000
# Freerouting 2.5.0 on 6 CPU threads, on the DSN that KiCad exports
java -Xmx12g -Xms256m -jar \
freerouting-2.5.0.jar -de in.dsn -do \
out.ses --gui.enabled=false --api_server.enabled=false --profile.allow_telemetry=false \
--usage_and_diagnostic_data.disable_analytics=true --router.max_threads=6 --router.job_timeout=01:00:00 --router.result_json=result.json
# tscircuit: @tscircuit/capacity-autorouter 0.0.973 on 1 CPU core through this page's runner,
# effort 1, 60-minute limit, stopped at 75 minutes at the latest
# Zap! through the service (API key: sign in at /auth/login and create one on your account page)
python3 zap.py run in.kicad_pcb --minutes 60
# check any result
kicad-cli pcb drc --refill-zones --severity-all --format json -o drc.json routed.kicad_pcb
Data: compare.json, written 2026-10-14 17:23:57 UTC. Questions or a board to add: hello@mutual.solutions.
Boards and licences
| board | by | licence | source |
|---|---|---|---|
| Antmicro CM4 baseboard LVDS adapter | Antmicro | Apache-2.0 | 4af945e |
| Antmicro CVBS-to-MIPI bridge | Antmicro | Apache-2.0 | 7cbcec2 |
| Antmicro dual IPEX CSI interposer | Antmicro | Apache-2.0 | 6b6bd0a |
| Antmicro ECP5 DC-SCM | Antmicro | Apache-2.0 | 0019313 |
| Antmicro GMSL serializer | Antmicro | Apache-2.0 | 58641df |
| Antmicro PMOD I3C sensor board | Antmicro | Apache-2.0 | 5ee5d34 |
| Antmicro signal-integrity test board | Antmicro | Apache-2.0 | de0b592 |
| Antmicro STM32H7 HDMI SO-DIMM board | Antmicro | Apache-2.0 | 27e3ac9 |
| Arduino water-level monitor | Srushti D | MIT | 7b47f46 |
| Argos demo board | CNES | CERN-OHL-S-2.0 | 1eccb3f |
| Bitaxe Ultra (fork) | BastelPichi, fork of skot/bitaxe | CERN-OHL-S-2.0 | 0c3e71f |
| Buildbotics controller | Buildbotics LLC | CERN-OHL-S-2.0 | 1a2f36d |
| discretesim test board | cnlohr | MIT | f7a169e |
| ECP5 BGA-381 FT2232HQ FIFO board | gildobjanschi | MIT | 81403f7 |
| EmberOne | 256 Foundation | CERN-OHL-S-2.0 | b21b32c |
| Ender-3 load-cell bed-levelling sensor | Lakshminarayanan | MIT | eae5c6f |
| FTDI JTAG programmer | Anthony Bernaert | CERN-OHL-P-2.0 | c33005e |
| HackRF Pro | Great Scott Gadgets | CERN-OHL-P-2.0 | 359b98f |
| Kintex PCIe board | Piotr Binkowski | Apache-2.0 | 056792c |
| RP2040 development board | acon | MIT | d943286 |
| RP2350-PICO2-BB48 | Olimex Ltd | MIT | 74b0303 |
| Seven | ID8 Engineering AB | CERN-OHL-P-2.0 | 7c69a14 |
| Tiliqua (apfaudio) | Sebastian Holzapfel | CERN-OHL-S-2.0 | 4ee5878 |
| Trellis Core | Protolux Electronics SARL-S | CERN-OHL-P-2.0 | db4fe71 |
| Xerxes | Rapid Analysis | Apache-2.0 | 43abf57 |
No routing images for CERN-OHL-S boards (the licence asks that modified designs be shared in full). Licences checked 2026-10-13.








































































































