{"adoption": {"forks": 621, "observed_at": "2026-08-28T04:07:06.381009+00:00", "stars": 2639}, "canonical_url": "https://ross.abutalabs.com/products/cncjs", "card": {"archived": false, "artifact_type": "application", "description": "A web-based interface for CNC milling controller running Grbl, Marlin, Smoothieware, or TinyG.", "domain": ["hardware", "self-hosted", "cross-platform"], "enriched": true, "function": ["web-framework", "http-server", "websocket", "gui", "developer-tools"], "health_score": 99, "homepage": "https://cnc.js.org", "language": "JavaScript", "license": "MIT", "license_family": "permissive", "maturity": "stable", "member_repos": ["cncjs/cncjs"], "name": "cncjs/cncjs", "platform": ["windows", "iot", "self-hosted"], "pushed_at": "2026-08-20T16:59:02+00:00", "repo": "cncjs/cncjs", "stars": 2639, "tags": ["cnc", "gcode", "grbl", "marlin", "smoothieware", "tinyg", "g2core", "serial-port", "raspberry-pi", "pendant", "3d-visualizer", "machine-control", "automation", "nodejs", "linux", "macos", "docker"], "topics": ["cnc", "gcode", "tinyg", "raspberry-pi", "cnc-milling-controller", "smoothieware", "smoothie", "cncjs", "g2core", "grbl", "serial", "pendant", "linux", "marlin"], "urls": [], "use_cases": ["control a CNC mill from a web browser", "run Grbl or Marlin from a Raspberry Pi", "visualize G-code tool paths in 3D before cutting", "set Z zero with a touch plate probe", "jog axes and home a CNC machine remotely", "run G-code macros to automate routine tasks", "monitor a CNC machine with a webcam", "connect multiple clients to one serial port"], "what_it_is": "CNCjs is a full-featured web-based interface for CNC milling controllers running Grbl, Grbl-Mega, Marlin, Smoothieware, TinyG, or g2core. It runs on Node.js (commonly on a Raspberry Pi), connects to the controller over serial/USB/Bluetooth/WiFi, and provides a browser UI with a 3D tool-path visualizer, DRO, jog controls, probing, macros, and webcam monitoring.", "when_to_avoid": ["you need 3D printer-specific features like bed leveling or filament management", "you want a native desktop-only workflow without a browser", "your controller firmware is unsupported", "you need CAM/slicing - CNCjs controls machines but does not generate G-code"], "when_to_choose": ["you have a Grbl, Marlin, Smoothieware, TinyG, or g2core controller and want a browser-based control panel", "you want to run the controller interface on a Raspberry Pi or any Node.js machine", "you need multi-client access to a single serial port", "you want pendant, macro, probing, and webcam support in one tool"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/cncjs", "repo": "cncjs/cncjs", "role": "main", "score": 98}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:06.381009+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:19:09.314920+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ddd9c1f5c9e44a2a4c9e0f083a9c2834ed8ec29cf77c6b8d38c1df8b739bf722", "fetched_at": "2026-08-28T04:07:06.381009+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cncjs/cncjs"}, {"content_hash": "dba700733e7f040769b5a83ddd4271dcfdafd5a7d56236b04bb93f6a889da1c1", "fetched_at": "2026-08-29T10:02:24.443317+00:00", "kind": "homepage", "missing": false, "url": "https://cnc.js.org"}, {"content_hash": "aa04eabf519bb08b1462fab4c25f71fab3c2fdac4fc6e3dc0c6535b2c2bdedd6", "fetched_at": "2026-08-29T10:02:24.452547+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs"}, {"content_hash": "8152d825b3df66b31b9a171ac017f44b3ad489fdef6881edcdd303c8ba2b0e1f", "fetched_at": "2026-08-29T10:02:24.454399+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/user-guide"}, {"content_hash": "9c8b98da36d5d0ea9b547ebf38ecc009a55f2dbc219851ddf4d2902585723ab2", "fetched_at": "2026-08-29T10:02:24.456316+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/installation"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:06.381009+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:19:09.314920+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ddd9c1f5c9e44a2a4c9e0f083a9c2834ed8ec29cf77c6b8d38c1df8b739bf722", "fetched_at": "2026-08-28T04:07:06.381009+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cncjs/cncjs"}, {"content_hash": "dba700733e7f040769b5a83ddd4271dcfdafd5a7d56236b04bb93f6a889da1c1", "fetched_at": "2026-08-29T10:02:24.443317+00:00", "kind": "homepage", "missing": false, "url": "https://cnc.js.org"}, {"content_hash": "aa04eabf519bb08b1462fab4c25f71fab3c2fdac4fc6e3dc0c6535b2c2bdedd6", "fetched_at": "2026-08-29T10:02:24.452547+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs"}, {"content_hash": "8152d825b3df66b31b9a171ac017f44b3ad489fdef6881edcdd303c8ba2b0e1f", "fetched_at": "2026-08-29T10:02:24.454399+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/user-guide"}, {"content_hash": "9c8b98da36d5d0ea9b547ebf38ecc009a55f2dbc219851ddf4d2902585723ab2", "fetched_at": "2026-08-29T10:02:24.456316+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/installation"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:19:09.314920+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ddd9c1f5c9e44a2a4c9e0f083a9c2834ed8ec29cf77c6b8d38c1df8b739bf722", "fetched_at": "2026-08-28T04:07:06.381009+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cncjs/cncjs"}, {"content_hash": "dba700733e7f040769b5a83ddd4271dcfdafd5a7d56236b04bb93f6a889da1c1", "fetched_at": "2026-08-29T10:02:24.443317+00:00", "kind": "homepage", "missing": false, "url": "https://cnc.js.org"}, {"content_hash": "aa04eabf519bb08b1462fab4c25f71fab3c2fdac4fc6e3dc0c6535b2c2bdedd6", "fetched_at": "2026-08-29T10:02:24.452547+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs"}, {"content_hash": "8152d825b3df66b31b9a171ac017f44b3ad489fdef6881edcdd303c8ba2b0e1f", "fetched_at": "2026-08-29T10:02:24.454399+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/user-guide"}, {"content_hash": "9c8b98da36d5d0ea9b547ebf38ecc009a55f2dbc219851ddf4d2902585723ab2", "fetched_at": "2026-08-29T10:02:24.456316+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/installation"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:07:06.381009+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:06.381009+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:06.381009+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:19:09.314920+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ddd9c1f5c9e44a2a4c9e0f083a9c2834ed8ec29cf77c6b8d38c1df8b739bf722", "fetched_at": "2026-08-28T04:07:06.381009+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cncjs/cncjs"}, {"content_hash": "dba700733e7f040769b5a83ddd4271dcfdafd5a7d56236b04bb93f6a889da1c1", "fetched_at": "2026-08-29T10:02:24.443317+00:00", "kind": "homepage", "missing": false, "url": "https://cnc.js.org"}, {"content_hash": "aa04eabf519bb08b1462fab4c25f71fab3c2fdac4fc6e3dc0c6535b2c2bdedd6", "fetched_at": "2026-08-29T10:02:24.452547+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs"}, {"content_hash": "8152d825b3df66b31b9a171ac017f44b3ad489fdef6881edcdd303c8ba2b0e1f", "fetched_at": "2026-08-29T10:02:24.454399+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/user-guide"}, {"content_hash": "9c8b98da36d5d0ea9b547ebf38ecc009a55f2dbc219851ddf4d2902585723ab2", "fetched_at": "2026-08-29T10:02:24.456316+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/installation"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:06.381009+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:06.381009+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:19:09.314920+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ddd9c1f5c9e44a2a4c9e0f083a9c2834ed8ec29cf77c6b8d38c1df8b739bf722", "fetched_at": "2026-08-28T04:07:06.381009+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cncjs/cncjs"}, {"content_hash": "dba700733e7f040769b5a83ddd4271dcfdafd5a7d56236b04bb93f6a889da1c1", "fetched_at": "2026-08-29T10:02:24.443317+00:00", "kind": "homepage", "missing": false, "url": "https://cnc.js.org"}, {"content_hash": "aa04eabf519bb08b1462fab4c25f71fab3c2fdac4fc6e3dc0c6535b2c2bdedd6", "fetched_at": "2026-08-29T10:02:24.452547+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs"}, {"content_hash": "8152d825b3df66b31b9a171ac017f44b3ad489fdef6881edcdd303c8ba2b0e1f", "fetched_at": "2026-08-29T10:02:24.454399+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/user-guide"}, {"content_hash": "9c8b98da36d5d0ea9b547ebf38ecc009a55f2dbc219851ddf4d2902585723ab2", "fetched_at": "2026-08-29T10:02:24.456316+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/installation"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:06.381009+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:06.381009+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:06.381009+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:19:09.314920+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ddd9c1f5c9e44a2a4c9e0f083a9c2834ed8ec29cf77c6b8d38c1df8b739bf722", "fetched_at": "2026-08-28T04:07:06.381009+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cncjs/cncjs"}, {"content_hash": "dba700733e7f040769b5a83ddd4271dcfdafd5a7d56236b04bb93f6a889da1c1", "fetched_at": "2026-08-29T10:02:24.443317+00:00", "kind": "homepage", "missing": false, "url": "https://cnc.js.org"}, {"content_hash": "aa04eabf519bb08b1462fab4c25f71fab3c2fdac4fc6e3dc0c6535b2c2bdedd6", "fetched_at": "2026-08-29T10:02:24.452547+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs"}, {"content_hash": "8152d825b3df66b31b9a171ac017f44b3ad489fdef6881edcdd303c8ba2b0e1f", "fetched_at": "2026-08-29T10:02:24.454399+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/user-guide"}, {"content_hash": "9c8b98da36d5d0ea9b547ebf38ecc009a55f2dbc219851ddf4d2902585723ab2", "fetched_at": "2026-08-29T10:02:24.456316+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/installation"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:06.381009+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:06.381009+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:19:09.314920+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ddd9c1f5c9e44a2a4c9e0f083a9c2834ed8ec29cf77c6b8d38c1df8b739bf722", "fetched_at": "2026-08-28T04:07:06.381009+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cncjs/cncjs"}, {"content_hash": "dba700733e7f040769b5a83ddd4271dcfdafd5a7d56236b04bb93f6a889da1c1", "fetched_at": "2026-08-29T10:02:24.443317+00:00", "kind": "homepage", "missing": false, "url": "https://cnc.js.org"}, {"content_hash": "aa04eabf519bb08b1462fab4c25f71fab3c2fdac4fc6e3dc0c6535b2c2bdedd6", "fetched_at": "2026-08-29T10:02:24.452547+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs"}, {"content_hash": "8152d825b3df66b31b9a171ac017f44b3ad489fdef6881edcdd303c8ba2b0e1f", "fetched_at": "2026-08-29T10:02:24.454399+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/user-guide"}, {"content_hash": "9c8b98da36d5d0ea9b547ebf38ecc009a55f2dbc219851ddf4d2902585723ab2", "fetched_at": "2026-08-29T10:02:24.456316+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/installation"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:19:09.314920+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ddd9c1f5c9e44a2a4c9e0f083a9c2834ed8ec29cf77c6b8d38c1df8b739bf722", "fetched_at": "2026-08-28T04:07:06.381009+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cncjs/cncjs"}, {"content_hash": "dba700733e7f040769b5a83ddd4271dcfdafd5a7d56236b04bb93f6a889da1c1", "fetched_at": "2026-08-29T10:02:24.443317+00:00", "kind": "homepage", "missing": false, "url": "https://cnc.js.org"}, {"content_hash": "aa04eabf519bb08b1462fab4c25f71fab3c2fdac4fc6e3dc0c6535b2c2bdedd6", "fetched_at": "2026-08-29T10:02:24.452547+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs"}, {"content_hash": "8152d825b3df66b31b9a171ac017f44b3ad489fdef6881edcdd303c8ba2b0e1f", "fetched_at": "2026-08-29T10:02:24.454399+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/user-guide"}, {"content_hash": "9c8b98da36d5d0ea9b547ebf38ecc009a55f2dbc219851ddf4d2902585723ab2", "fetched_at": "2026-08-29T10:02:24.456316+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/installation"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:19:09.314920+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ddd9c1f5c9e44a2a4c9e0f083a9c2834ed8ec29cf77c6b8d38c1df8b739bf722", "fetched_at": "2026-08-28T04:07:06.381009+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cncjs/cncjs"}, {"content_hash": "dba700733e7f040769b5a83ddd4271dcfdafd5a7d56236b04bb93f6a889da1c1", "fetched_at": "2026-08-29T10:02:24.443317+00:00", "kind": "homepage", "missing": false, "url": "https://cnc.js.org"}, {"content_hash": "aa04eabf519bb08b1462fab4c25f71fab3c2fdac4fc6e3dc0c6535b2c2bdedd6", "fetched_at": "2026-08-29T10:02:24.452547+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs"}, {"content_hash": "8152d825b3df66b31b9a171ac017f44b3ad489fdef6881edcdd303c8ba2b0e1f", "fetched_at": "2026-08-29T10:02:24.454399+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/user-guide"}, {"content_hash": "9c8b98da36d5d0ea9b547ebf38ecc009a55f2dbc219851ddf4d2902585723ab2", "fetched_at": "2026-08-29T10:02:24.456316+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/installation"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:19:09.314920+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ddd9c1f5c9e44a2a4c9e0f083a9c2834ed8ec29cf77c6b8d38c1df8b739bf722", "fetched_at": "2026-08-28T04:07:06.381009+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cncjs/cncjs"}, {"content_hash": "dba700733e7f040769b5a83ddd4271dcfdafd5a7d56236b04bb93f6a889da1c1", "fetched_at": "2026-08-29T10:02:24.443317+00:00", "kind": "homepage", "missing": false, "url": "https://cnc.js.org"}, {"content_hash": "aa04eabf519bb08b1462fab4c25f71fab3c2fdac4fc6e3dc0c6535b2c2bdedd6", "fetched_at": "2026-08-29T10:02:24.452547+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs"}, {"content_hash": "8152d825b3df66b31b9a171ac017f44b3ad489fdef6881edcdd303c8ba2b0e1f", "fetched_at": "2026-08-29T10:02:24.454399+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/user-guide"}, {"content_hash": "9c8b98da36d5d0ea9b547ebf38ecc009a55f2dbc219851ddf4d2902585723ab2", "fetched_at": "2026-08-29T10:02:24.456316+00:00", "kind": "site_page", "missing": false, "url": "https://cnc.js.org/docs/installation"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "longevity": 100, "rhythm": 98}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 4030, "days_push": 13, "days_rel": 13, "gap_med": 24, "n_releases_24m": 10}, "score": 98, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}