I put this little machine together with some parts I had sitting around. There is nothing too fancy about it but has great accuracy. The machine runs on GRBl the control software is CNCjs with a really great Auto-leveling extension . I am really happy with the cheap rotary tool and flexible shaft that allowed for a smaller Z-axis setup.I wasted a ton of time looking for and testing GRBL compatible controller software that also had an auto leveling feature.

Here is a list of software that was tested with notes about why it was not selected. I am running MAC / Linux setups for CNC control, PCB design and G-code generation.

bCNC – Looked promising but the serial connection consistently failed. Lots of people love it though.

Universal Gcode Sender (platform edition) – Really nice looking, it is a huge set forward from the basic UGS with tons of nice features. Unfortunately automatic bed leveling is currently disabled.

ChiliPeppr (grbl)- This is a totally great option, however I was looking for a stand alone application.

OpenCNCPilot – Looks awesome, runs on Windows so I did not bother to give it a go.

Just for clarity here is how I got the Auto-leveling extension to interface with CNCjs.

-Install “git”

-Install “node.js” (which should also install “npm”)

-Install CNCjs

CNCJS_SECRET environment variable must be set with the following command.

export CNCJS_SECRET=$(grep secret ~/.cncrc | sed “s/[ \t]+//g” | tr ‘,’ ‘ ‘ | cut -d’:’ -f2 | sed ‘s/”//g’ | sed ‘s/ //

The Actual install of the plug in is here.

git clone https://github.com/kreso-t/cncjs-kt-ext.git
cd cncjs-kt-ext
npm install
node . --port /dev/ttyACM0

Now you need to figure out which network port CNCjs runs on. If you are using a CNCjs “server” install, it is most likely 8000. If you are running the CNCjs standalone application, you will need to go to “View” menu, “View in browser”, this will open another CNCjs interface in your browser, and the port number will be displayed at the end of the URL (in my case it showed “”, so the port is 61678. It changes every time you relaunch the CNCjs app unfortunately.

Launch the Auto-level extension, still from the command line, by typing:

Your output should look like this:

Now you need to create a macro in CNCjs (clicking the “+” in the Macro widget), name it “autolevel”, and paste exactly this piece of text:

(#autolevel )

The parameters are as so:

(#autolevel D[distance] H[height] F[feedrate] M[margin])

This is a custom use example:

(#autolevel D7.5 H1.0 F20 M0.2)

And then your are done with the install. To use the feature,You then set your job zero on the piece as usual (the auto-level macro expects that it is the lower left corner of the job though), leave the cutter at 0,0,0, and run the auto-level macro from CNCjs.