Design and Manufacturing Principles
This machine was designed as a versatile tool capable of performing most small machining tasks typically encountered in a small amateur or professional workshop. It fits well in a compact workshop or laboratory.
![]() |
![]() |
![]() |
Structure and Kinematics
I opted against a router-style structure because it is less rigid and significantly harder to calibrate. The classic structure of conventional milling machines (XY+Z) offers several advantages compared to a router structure (Y+XZ). First, the X and Y axes are interconnected, making it much easier to adjust their perpendicularity. The X and Y rail planes are naturally parallel. Second, and more importantly, the classic structure has fewer degrees of freedom, meaning fewer adjustments are required.
Additionally, each adjustment affects only one axis at a time. On a router, adjusting the Y-axis can disrupt the Z-axis, making the calibration process more complex and requiring more tools.
During the design phase, I focused on ensuring the machine could be finely and easily adjusted by following these principles:
- Minimize joints and the number of parts, avoiding components like angle brackets.
- Avoid thickness adjustments (e.g., no shims); all adjustments are rotational.
- Contact surfaces influencing kinematics are never machined surfaces, as no cutting process at my disposal guarantees perfect perpendicularity or parallelism.

First version
Rigidity
The entire structure is oversized for enhanced rigidity. I used 20mm-thick plates and heavy-duty aluminum profiles designed for structural applications. For instance, the head profile measures 80x160mm and weighs 2kg on its own. The entire structure is assembled using 8mm screws, allowing for secure clamping.
Detailed adjustment instructions will be provided.
Manufacturing
I assembled this milling machine with minimal tooling:
- A drill press.
- A ruler, compass, and carbide scribers.
- An angle grinder to size the linear guide rails.
- Pre-cut and dimensioned aluminum profiles and plates.
- A dial gauge with a stand for assembly and calibration.
![]() | ![]() | ![]() |
![]() |
Compactness and Work Area
Routers typically offer a larger work area compared to the classic structure. To maximize the working area, I did not use standard bearing blocks for the SFU1204 ball screws:
-
The assembly is reversed compared to the recommended setup: the fixed bearing block is placed opposite the motor, and there is no floating bearing.
-
The fixed bearing journal is reduced from 10mm to 8mm.
-
This means the ball screw is not a standard SFU, but it is still relatively easy to source.
-
Standard SFU screws can be used, but this would require adapting the design and accepting either a larger machine or a reduced travel range.

Specifications
- Footprint: 500x500x500mm
- Work area: 250x150x150mm
- Linear guides: 4x HGR15 on all three axes
- Motors: NEMA 22, 1.8Nm or 1.2Nm closed-loop
- Controller: FluidNC with CNCjs on a Raspberry Pi
- Speed: At least 4000mm/min
- Verified machining capacity: 1mm cuts with a 6mm end mill, achieving 0.01mm precision with the current spindle.
Great design and write up my dude, but I was shocked at your choice of spindle. I have a desktop mill myself that I'm souping up specifically for PCB production and it came with a 500w DC spindle very similar to yours. These cheap spindles are notorious for having a shitload of runout and mine was no exception, to the point that I had resigned myself to spending another ~$300 for a proper VFD / 80mm spindle combo. What's the runout like on your machine? I'd love to not have to upgrade to a spindle that makes my machine look comical due to being like 3/4 the size of the entire machine (3020 but I plan on moving to 3040 when I swap the leadscrews for ballscrews) since I don't plan on doing really anything but PCB production. And since they're so much cheaper than typical spindles swapping them out as they become less precise shouldn't be a huge deal - depending on how quickly that happens obviously.
Can I ask why you decided to pitch for closed loop steppers? They don't offer any increase in precision or accuracy unless the motors start skipping steps, and while I guess that is possible the NEMA23s should be more than powerful enough. Also, I see you put together a custom version of the FluidNC pendant, what changes did you make? I love the use of the M5 Dial and the skeuomorphism of the enclosure, but looks are a far second to functionality on something like this. I also have a (relatively) weak laser mounted alongside the spindle that I use to create solder mask and silkscreen without having to remove the PCB so having extra controllability is always good. I also haven't touched FluidNC yet, do you know if it allows the use of commercially available toolsetters?
Thanks in advance.