{"id":13650499,"url":"https://github.com/cncjs/cncjs","last_synced_at":"2026-03-08T04:03:05.065Z","repository":{"id":36841180,"uuid":"41148102","full_name":"cncjs/cncjs","owner":"cncjs","description":"A web-based interface for CNC milling controller running Grbl, Marlin, Smoothieware, or TinyG.","archived":false,"fork":false,"pushed_at":"2025-03-11T20:50:04.000Z","size":90750,"stargazers_count":2394,"open_issues_count":209,"forks_count":579,"subscribers_count":153,"default_branch":"master","last_synced_at":"2025-04-23T23:11:45.649Z","etag":null,"topics":["cnc","cnc-milling-controller","cncjs","g2core","gcode","grbl","linux","marlin","pendant","raspberry-pi","serial","smoothie","smoothieware","tinyg"],"latest_commit_sha":null,"homepage":"https://cnc.js.org","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cncjs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":null,"patreon":null,"open_collective":"cncjs","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2015-08-21T09:39:18.000Z","updated_at":"2025-04-23T06:14:49.000Z","dependencies_parsed_at":"2023-09-29T08:54:36.415Z","dependency_job_id":"e8841377-68cd-4117-acf8-af4558c141ea","html_url":"https://github.com/cncjs/cncjs","commit_stats":{"total_commits":4010,"total_committers":44,"mean_commits":91.13636363636364,"dds":0.1104738154613466,"last_synced_commit":"de058adee349cb3be956a80e42819b44b0153716"},"previous_names":[],"tags_count":192,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cncjs%2Fcncjs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cncjs%2Fcncjs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cncjs%2Fcncjs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cncjs%2Fcncjs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cncjs","download_url":"https://codeload.github.com/cncjs/cncjs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250528871,"owners_count":21445518,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cnc","cnc-milling-controller","cncjs","g2core","gcode","grbl","linux","marlin","pendant","raspberry-pi","serial","smoothie","smoothieware","tinyg"],"created_at":"2024-08-02T02:00:37.321Z","updated_at":"2026-01-25T08:03:29.006Z","avatar_url":"https://github.com/cncjs.png","language":"JavaScript","readme":"# CNCjs [![Backers on Open Collective](https://opencollective.com/cncjs/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/cncjs/sponsors/badge.svg)](#sponsors) [![Travis CI Build Status](https://travis-ci.org/cncjs/cncjs.svg)](https://travis-ci.org/cncjs/cncjs) [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/qxx53wq32w3edule?svg=true)](https://ci.appveyor.com/project/cheton/cncjs) [![Coverage Status](https://coveralls.io/repos/github/cncjs/cncjs/badge.svg?branch=master)](https://coveralls.io/github/cncjs/cncjs?branch=master)\n\n[![NPM](https://nodei.co/npm/cncjs.png?downloads=true\u0026stars=true)](https://www.npmjs.com/package/cncjs)\n![cncjs](https://raw.githubusercontent.com/cncjs/cncjs/master/media/banner.png)\n\nCNCjs is a full-featured web-based interface for CNC controllers running [Grbl](https://github.com/grbl/grbl), [Marlin](https://github.com/MarlinFirmware/Marlin), [Smoothieware](https://github.com/Smoothieware/Smoothieware), or [TinyG](https://github.com/synthetos/TinyG).\n\nFor a more complete introduction, see the [Introduction](https://github.com/cncjs/cncjs/wiki/Introduction) section of the wiki page.\n\n![cncjs](https://cloud.githubusercontent.com/assets/447801/24392019/aa2d725e-13c4-11e7-9538-fd5f746a2130.png)\n\n## Features\n\n* Supported controllers\n    - [Grbl](https://github.com/gnea/grbl) ([Download](https://github.com/gnea/grbl/releases))\n    - [Grbl-Mega](https://github.com/gnea/grbl-Mega) ([Download](https://github.com/gnea/grbl-Mega/releases))\n    - [Marlin](https://github.com/MarlinFirmware/Marlin) ([Download](http://marlinfw.org/meta/download/))\n    - [Smoothieware](https://github.com/Smoothieware/Smoothieware) ([Download](https://github.com/Smoothieware/Smoothieware/tree/edge/FirmwareBin))\n    - [TinyG](https://github.com/synthetos/TinyG) (_Recommend: firmware version 0.97 build 449.xx_) ([Download](http://synthetos.github.io/))\n    - [g2core](https://github.com/synthetos/g2)\n* [Desktop App for Linux, Mac OS X, and Windows](https://github.com/cncjs/cncjs/wiki/Desktop-App)\n* 6-axis digital readout (DRO)\n* Tool path 3D visualization\n* Simultaneously communicate with multiple clients\n* Responsive view for small screen display with device width less than 720px\n    - \u003ci\u003eSafari on an iPhone 5S\u003c/i\u003e [\\[1\\]](https://cloud.githubusercontent.com/assets/447801/15633749/b817cd4a-25e7-11e6-9beb-600c65ea1324.PNG) [\\[2\\]](https://cloud.githubusercontent.com/assets/447801/15633750/b819b5f6-25e7-11e6-8bfe-d3e6247e443b.PNG)\n* Customizable workspace\n* [Custom widget](https://github.com/cncjs/cncjs-widget-boilerplate) (since 1.9.10)\n* Custom MDI (Multiple Document Interface) command buttons (since 1.9.13)\n* My Account\n* Commands\n* Events\n* [Keyboard Shortcuts](https://cnc.js.org/docs/user-guide/#keyboard-shortcuts)\n* [Contour ShuttleXpress](https://cnc.js.org/docs/user-guide/#contour-shuttlexpress)\n* Multi-Language Support \n* Watch Directory\n* [Tool Change](https://github.com/cncjs/cncjs/wiki/Tool-Change) (since 1.9.11)\n* Z-Probe\n\n## Custom Widgets\n\n* [cncjs-widget-boilerplate](https://github.com/cncjs/cncjs-widget-boilerplate) - Creating custom widgets for CNCjs.\n\n## Pendants\n\n### Boilerplate Code\n\n* [cncjs-pendant-boilerplate](https://github.com/cncjs/cncjs-pendant-boilerplate) - A bare minimum example to develop a cncjs pendant.\n\n### Existing Pendants\n\n* [cncjs-pendant-keyboard](https://github.com/cncjs/cncjs-pendant-keyboard) - A simple pendant (using wireless keyboard or usb) to CNCJS.\n* [cncjs-pendant-numpad](https://github.com/mariolukas/cncjs-pendant-numpad) - A simple pendant (using wireless numpad or usb) to CNCJS.\n* [cncjs-pendant-lcd](https://github.com/cncjs/cncjs-pendant-lcd) - CNCjs Web Kiosk for Raspberry Pi Touch Displays.\n* [cncjs-pendant-ps3](https://github.com/cncjs/cncjs-pendant-ps3) - Dual Shock / PS3 Bluetooth Remote Pendant for CNCjs.\n* [cncjs-pendant-raspi-gpio](https://github.com/cncjs/cncjs-pendant-raspi-gpio) - Simple Raspberry Pi GPIO Pendant control for CNCjs.\n\n## Tablet UI\n\n* [cncjs-pendant-tinyweb](https://github.com/cncjs/cncjs-pendant-tinyweb) - A tiny web console for small 320x240 LCD display.\u003cbr\u003e\n    ![cncjs-pendant-tinyweb](https://raw.githubusercontent.com/cncjs/cncjs/master/media/tinyweb-axes.png)\n* [cncjs-shopfloor-tablet](https://github.com/cncjs/cncjs-shopfloor-tablet) - A simplified UI for cncjs optimized for tablet computers in a production (shop floor) environment.\u003cbr\u003e\n    ![cncjs-shopfloor-tablet](https://user-images.githubusercontent.com/4861133/33970662-4a8244b2-e018-11e7-92ab-5a379e3de461.PNG)\n\n## Browser Support\n\n![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png)\u003cbr\u003eChrome | ![Edge](https://raw.github.com/alrra/browser-logos/master/src/edge/edge_48x48.png)\u003cbr\u003eEdge | ![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png)\u003cbr\u003eFirefox | ![IE](https://raw.github.com/alrra/browser-logos/master/src/archive/internet-explorer_9-11/internet-explorer_9-11_48x48.png)\u003cbr\u003eIE | ![Opera](https://raw.github.com/alrra/browser-logos/master/src/opera/opera_48x48.png)\u003cbr\u003eOpera | ![Safari](https://raw.github.com/alrra/browser-logos/master/src/safari/safari_48x48.png)\u003cbr\u003eSafari\n--- | --- | --- | --- | --- | --- |\n Yes | Yes | Yes| Not supported | Yes | Yes | \n\n## Supported Node.js Versions\n\n| Version | Supported Level |\n| :------ |:--------------- |\n| \u003c= 10   | Not supported   |\n| 12      | Supported       |\n| \u003e= 14   | Recommended     |\n\n## Getting Started\n\n### Node.js Installation\n\nNode.js 14 or higher is recommended. You can install [Node Version Manager](https://github.com/creationix/nvm) to manage multiple Node.js versions. If you have `git` installed, just clone the `nvm` repo, and check out the latest version:\n```\ngit clone https://github.com/creationix/nvm.git ~/.nvm\ncd ~/.nvm\ngit checkout `git describe --abbrev=0 --tags`\ncd ..\n. ~/.nvm/nvm.sh\n```\n\nAdd these lines to your `~/.bash_profile`, `~/.bashrc`, or `~/.profile` file to have it automatically sourced upon login: \n```bash\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] \u0026\u0026 . \"$NVM_DIR/nvm.sh\" # This loads nvm\n```\n\nOnce installed, you can select Node.js versions with:\n```\nnvm install 14\nnvm use 14\n```\n\nIt's also recommended that you upgrade npm to the latest version. To upgrade, run:\n```\nnpm install npm@latest -g\n```\n\n### Installation\n\nInstall cncjs as a non-root user, or the [serialport](https://github.com/node-serialport/node-serialport) module may not install correctly on some platforms like Raspberry Pi.\n```\nnpm install -g cncjs\n```\n\nIf you're going to use sudo or root to install cncjs, you need to specify the `--unsafe-perm` option to run npm as the root account.\n```\nsudo npm install --unsafe-perm -g cncjs\n```\n\nCheck out [https://github.com/cncjs/cncjs/wiki/Installation](https://github.com/cncjs/cncjs/wiki/Installation) for other installation methods.\n\n### Upgrade\n\nRun `npm install -g cncjs@latest` to install the latest version. To determine the version, use `cncjs --version`.\n\n### Usage\n\nRun `cncjs` to start the server, and visit `http://yourhostname:8000/` to view the web interface. Pass `--help` to `cncjs` for more options.\n\n```\npi@rpi3$ cncjs -h\n\n  Usage: cncjs [options]\n\n\n  Options:\n\n    --version                       output the version number\n    -p, --port \u003cport\u003e                   Set listen port (default: 8000)\n    -H, --host \u003chost\u003e                   Set listen address or hostname (default: 0.0.0.0)\n    -b, --backlog \u003cbacklog\u003e             Set listen backlog (default: 511)\n    -c, --config \u003cfilename\u003e             Set config file (default: ~/.cncrc)\n    -v, --verbose                       Increase the verbosity level (-v, -vv, -vvv)\n    -m, --mount \u003croute-path\u003e:\u003ctarget\u003e   Add a mount point for serving static files\n    -w, --watch-directory \u003cpath\u003e        Watch a directory for changes\n    --access-token-lifetime \u003clifetime\u003e  Access token lifetime in seconds or a time span string (default: 30d)\n    --allow-remote-access               Allow remote access to the server (default: false)\n    --controller \u003ctype\u003e                 Specify CNC controller: Grbl|Marlin|Smoothie|TinyG|g2core (default: '')\n    -h, --help                          output usage information\n\n  Examples:\n\n    $ cncjs -vv\n    $ cncjs --mount /pendant:/home/pi/tinyweb\n    $ cncjs --mount /widget:~+/widget --mount /pendant:~/pendant\n    $ cncjs --mount /widget:https://cncjs.github.io/cncjs-widget-boilerplate/v1/\n    $ cncjs --watch-directory /home/pi/watch\n    $ cncjs --access-token-lifetime 60d  # e.g. 3600, 30m, 12h, 30d\n    $ cncjs --allow-remote-access\n    $ cncjs --controller Grbl\n```\n\nInstead of passing command line options for `--watch-directory`, `--access-token-lifetime`, `--allow-remote-access`, and `--controller`, you can create a `~/.cncrc` file that contains the following configuration in JSON format:\n```json\n{\n    \"mountPoints\": [\n        {\n            \"route\": \"/pendant\",\n            \"target\": \"/home/pi/tinyweb\"\n        },\n        {\n            \"route\": \"/widget\",\n            \"target\": \"https://cncjs.github.io/cncjs-widget-boilerplate/v1/\"\n        }\n    ],\n    \"watchDirectory\": \"/path/to/dir\",\n    \"accessTokenLifetime\": \"30d\",\n    \"allowRemoteAccess\": false,\n    \"controller\": \"\"\n}\n```\n\nTo troubleshoot issues, run:\n```\ncncjs -vvv\n```\n\n### Configuration File\n\nThe configuration file \u003cb\u003e.cncrc\u003c/b\u003e contains settings that are equivalent to the cncjs command-line options. The configuration file is stored in user's home directory. To find out the actual location of the home directory, do the following:\n\n* Linux/Mac\n  ```sh\n  echo $HOME\n  ```\n\n* Windows\n  ```sh\n  echo %USERPROFILE%\n  ```\n\nCheck out an example configuration file [here](https://github.com/cncjs/cncjs/blob/master/examples/.cncrc).\n\n### File Format\n\nSee https://github.com/cncjs/cncjs/issues/242#issuecomment-352294549 for a detailed explanation.\n\n```json\n{\n  \"ports\": [\n     {\n       \"path\": \"/dev/ttyAMA0\",\n       \"manufacturer\": \"\"\n     }\n  ],\n  \"baudrates\": [115200, 250000],\n  \"mountPoints\": [\n    {\n      \"route\": \"/widget\",\n      \"target\": \"https://cncjs.github.io/cncjs-widget-boilerplate/v1/\"\n    }\n  ],\n  \"watchDirectory\": \"/path/to/dir\",\n  \"accessTokenLifetime\": \"30d\",\n  \"allowRemoteAccess\": false,\n  \"controller\": \"\",\n  \"state\": {\n    \"checkForUpdates\": true,\n    \"controller\": {\n      \"exception\": {\n        \"ignoreErrors\": false\n      }\n    }\n  },\n  \"commands\": [\n    {\n      \"title\": \"Update (root user)\",\n      \"commands\": \"sudo npm install -g cncjs@latest --unsafe-perm; pkill -f cncjs\"\n    },\n    {\n      \"title\": \"Update (non-root user)\",\n      \"commands\": \"npm install -g cncjs@latest; pkill -f cncjs\"\n    },\n    {\n      \"title\": \"Reboot\",\n      \"commands\": \"sudo /sbin/reboot\"\n    },\n    {\n      \"title\": \"Shutdown\",\n      \"commands\": \"sudo /sbin/shutdown\"\n    }\n  ],\n  \"events\": [],\n  \"macros\": [],\n  \"users\": []\n}\n```\n\n## Documentation\n\nhttps://cnc.js.org/docs/\n\n## Examples\n\nThere are several *.gcode files in the [examples](https://github.com/cncjs/cncjs/tree/master/examples) directory. You can use the GCode widget to load a GCode file and make a trial run.\n\nIf you don't have a CAM software, try using [jscut](http://jscut.org/) to create G-Code from *.svg. It's a simple CAM package that runs in the browser.\n\nCheck out a live demo at http://jscut.org/jscut.html.\n\n## Contributions\n\nUse [GitHub issues](https://github.com/cncjs/cncjs/issues) for requests.\n\nPull requests welcome! Learn how to [contribute](CONTRIBUTING.md).\n\n## Localization\n\nYou can help translate resource files in both of [app](https://github.com/cncjs/cncjs/tree/master/src/app/i18n) and [server](https://github.com/cncjs/cncjs/tree/master/src/server/i18n) directories from English to other languages. Check out [Localization guide](https://github.com/cncjs/cncjs/blob/master/CONTRIBUTING.md#localization) to learn how to get started. If you are not familiar with GitHub development, you can [open an issue](https://github.com/cncjs/cncjs/issues) or send your translations to cheton@gmail.com.\n\nLocale | Language | Status | Contributors \n:----- | :------- | :----- | :-----------\n[cs](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/cs) | Čeština (Czech) | ✔ | [Miroslav Zuzelka](https://github.com/dronecz)\n[de](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/de) | Deutsch (German) | ✔ | [Thorsten Godau](https://github.com/dl9sec), [Max B.](https://github.com/mbs38)\n[es](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/es) | Español (Spanish) | ✔ | [Juan Biondi](https://github.com/yeyeto2788), [hasecilu](https://github.com/hasecilu)\n[fr](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/fr) | Français (French) | ✔ | [Simon Maillard](https://github.com/maisim), [CorentinBrulé](https://github.com/CorentinBrule)\n[hu](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/hu) | Magyar (Hungarian) | ✔ | Sipos Péter\n[it](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/it) | Italiano (Italian) | ✔ | [vince87](https://github.com/vince87)\n[ja](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/ja) | 日本語 (Japanese) | ✔ | [Naoki Okamoto](https://github.com/toonaoki)\n[nl](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/nl) | Nederlands (Netherlands) | ✔ | [dutchpatriot](https://github.com/dutchpatriot)\n[pt-br](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/pt-br) | Português (Brasil) | ✔ | [cmsteinBR](https://github.com/cmsteinBR)\n[ru](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/ru) | Ру́сский (Russian) | ✔ | [Denis Yusupov](https://github.com/minithc)\n[uk](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/uk) | українська (Ukrainian) | ✔ | [khvalera](https://github.com/khvalera)\n[tr](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/tr) | Türkçe (Turkish) | ✔ | Ali GÜNDOĞDU\n[zh-cn](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/zh-cn) | 简体中文 (Simplified Chinese) | ✔ | [Mandy Chien](https://github.com/MandyChien), [Terry Lee](https://github.com/TerryShampoo)\n[zh-tw](https://github.com/cncjs/cncjs/tree/master/src/app/i18n/zh-tw) | 繁體中文 (Traditional Chinese) | ✔ | [Cheton Wu](https://github.com/cheton)\n\n## Donate\n\nIf you would like to support this project, you can make a donation using PayPal. Thank you!\n\n[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=38CYN33CWPBR2)\n\n## Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n\u003ca href=\"graphs/contributors\"\u003e\u003cimg src=\"https://opencollective.com/cncjs/contributors.svg?width=890\u0026button=false\" /\u003e\u003c/a\u003e\n\n\n## Backers\n\nThank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/cncjs#backer)]\n\n\u003ca href=\"https://opencollective.com/cncjs#backers\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/cncjs/backers.svg?width=890\"\u003e\u003c/a\u003e\n\n\n## Sponsors\n\nSupport this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/cncjs#sponsor)]\n\n\u003ca href=\"https://opencollective.com/cncjs/sponsor/0/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/cncjs/sponsor/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/cncjs/sponsor/1/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/cncjs/sponsor/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/cncjs/sponsor/2/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/cncjs/sponsor/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/cncjs/sponsor/3/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/cncjs/sponsor/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/cncjs/sponsor/4/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/cncjs/sponsor/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/cncjs/sponsor/5/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/cncjs/sponsor/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/cncjs/sponsor/6/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/cncjs/sponsor/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/cncjs/sponsor/7/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/cncjs/sponsor/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/cncjs/sponsor/8/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/cncjs/sponsor/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/cncjs/sponsor/9/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/cncjs/sponsor/9/avatar.svg\"\u003e\u003c/a\u003e\n\n\n\n## License\n\nLicensed under the [MIT License](https://raw.githubusercontent.com/cncjs/cncjs/master/LICENSE).\n","funding_links":["https://opencollective.com/cncjs","https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=38CYN33CWPBR2"],"categories":["Software","JavaScript","CNCing"],"sub_categories":["G-code","Controlling Software"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcncjs%2Fcncjs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcncjs%2Fcncjs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcncjs%2Fcncjs/lists"}