In theory, the quickest way to get a custom PCB made is to etch or mill it yourself. Here, we explore both methods.

Cold transfer toner method

A laser printer is used to print a mirrored design onto glossy (e.g. magazine) paper. We print the image onto the glossy paper by taping a patch of glossy paper onto normal paper, and feeding that through the laser printer. That image then needs to be transferred to the copper; i.e. we need to release the toner from the paper and transfer it onto the copper.

To release the toner from the paper, we use acetone, since toner dissolves in acetone. However, we can't use pure acetone, otherwise that would decimate the design. Instead, we need to use a mix of acetone and some other substance that doesn't dissolve the toner. This dissolves the toner enough to make it sticky, but not enough to destroy the design. It just so happens that nail polish remover often has this combination: it has some acetone, and some other ingredient. This could also be acheived by mixing acetone with rubbing alcohol.


The design was taped to the clean copper, and nail polish remover was poured onto the paper.

The board on the left didn't have much pressure applied; the acetone was poured on and left to dry, with only some light finger pressure once or twice. This resulted in a clean, but incomplete transfer.

The board on the right had too much pressure and movement. The acetone was poured on and then the paper was pressed and rubbed until the acetone dried. This resulted in more toner being transferred, but the design was decimated.

Below are the boards after having the paper residue removed with a wet sponge.

Moving on

A few more attempts were made at getting the toner transfer to work, but to no avail. Instead, milling was explored.

CNC Milling

The next method tried was CNC milling, using a Nomad milling machine. Sadly, these are expensive. However, similar results could be acheived with a cheaper machine.


KiCAD (or other EDA) → Gerber files → FlatCam → GCode → Carbide Motion (or other CNC control software that supports GCode)

Using FlatCam

Flatcam is the software that turns gerber files into GCode. Note that this software works on Linux (through wine), but is much more stable on Windows.

You will need to spend a fair amount of time in FlatCam getting the settings just right; your PCB can be made or ruined at this step!

There are tutorials that cover the basics of FlatCam, but below is some extra detail on things that might trip you up at first.


An ordinary board (i.e. with traces, PTHs and an edge cut) would require three bits. I used:

Tool diameter

When setting up the isolation routing for the front/back copper layer, the workflow is as follows: in the Tools menu, select calculator. Enter the tip diameter of the bit you're using (note that if your FlatCam is configured in metric in the preferences, you'll need to calculate the metric equivalent of imperial bit sizes), and the tip angle. Enter the cut depth; -0.1mm works well for traces. The Tool Diameter is calculated; use this number as the tool diameter in the Tools Table.

Then once you've generated your geometry object, enter in those values again and check that the cut depth (greyed out) matches your intended depth (here, -0.1mm)


In theory, slots are supported in FlatCam, but it errored out trying to process them. The workaround is to not use the slot defined in drill file; instead draw a new geometry: a straight line, and then generate a CNCjob Object from that.

Use multi-pass milling for slots to avoid straining your CNC, and for a cleaner cut.

Edge cuts

If the edge line cuts through copper, it will leave awful burrs. These can be sanded off, but instead, it's much easier to just mill away the copper near the edge line (with a PCB engraver/V bit) first, and then perform the cut (with a square bit).

Do this by using the edge line to generate an isolation geometry in addition to generating a board outline cut. Mill the isolation cut first, and then perform the outline cut.

Some other tips
  1. When exporting gerbers from KiCad, set the drill file config to combine PTH and NPTH into one file.
  2. Make traces as thick as you can, especially near PTHs (i.e. use teardrops)
  3. 0.4mm seemed like a possible minimum trace width, but this wasn't tested extensively.
  4. Using off-the-shelf copper clad board (which I assume has a 1.6mm thickness), a cut depth of 1.8mm worked well. 1.7mm was too shallow.
  5. Good bed-levelling is essential. Use the paper method. If the Z zero-point is too deep, traces will be too thin and burry. If it's too shallow, copper will be left behind.
  6. Use a waste board under the copper board. Wood is cheap, but can be uneven - use another copper-clad board if so.