Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


[early stage of development]

CNC controller interface (and supporting logic) written in JS because…it's what I had laying around?


At the moment most of these are desired features, not yet implemented.

  • smooth jog control via ordinary G-code (proof-of-concept working!)
  • nearly-automatic tool change and probing/edgefinding support
  • machine and work coordinate system management
  • scaling and feedrate/spindle overrides
  • toolpath preview [this seems like such a separation of concerns,
  • freehand sketching of motion to be played back?
  • remote library/file browser for selecting G-code from a shared folder/database (see architecture notes below for use cases)


Right now this is just a jumble of code roughly divided into a "client" file and a "server" file. However, I think a better division of labor would be something like:

  • interface: directs the engine's operation based on user input
  • engine: processes G-code and other interface commands vs. controller state
  • driver: handles raw communication with the controller, e.g. over a USB port
  • controller: the "CNC itself", i.e. the Grbl or similar board that does the actual work

I imagine the engine is where the "heavy lifting" should end up. By separating the interface from this, and by separating this from the driver, we would allow — latency permitting — various combinations. Perhaps the interface and driver would be hosted on an original Raspberry Pi, reserving its processor for rendering the UI by offloading any significat G-code processing to a faster machine elsewhere on the premises. Or the engine and driver could both be on a Pi next to the machine, with the operator using their phone or an old tablet/eReader as the interface.


JavaScript-based CNC controller (primarily intended to send send G-code to Grbl)






No releases published


No packages published