{"id":19938806,"url":"https://github.com/winder/universal-g-code-sender","last_synced_at":"2026-03-17T08:02:45.443Z","repository":{"id":3728022,"uuid":"4801382","full_name":"winder/Universal-G-Code-Sender","owner":"winder","description":"A cross-platform G-Code sender for GRBL, Smoothieware, TinyG and G2core.","archived":false,"fork":false,"pushed_at":"2026-03-15T10:31:32.000Z","size":72515,"stargazers_count":2176,"open_issues_count":203,"forks_count":810,"subscribers_count":165,"default_branch":"master","last_synced_at":"2026-03-15T23:23:56.559Z","etag":null,"topics":["cnc","g2core","gcode","gcode-editor","gcode-parser","gcode-sender","gcode-viewer","grbl","grbl-control","hacktoberfest","java","smoothieware","tinyg"],"latest_commit_sha":null,"homepage":"http://winder.github.io/ugs_website/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/winder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"COPYING","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["breiler","winder"],"custom":["https://paypal.me/universalgcodesender"]}},"created_at":"2012-06-26T22:30:07.000Z","updated_at":"2026-03-15T10:31:36.000Z","dependencies_parsed_at":"2023-12-20T08:03:31.065Z","dependency_job_id":"dc22ea55-8b62-4c73-8c3f-5cc25e32a055","html_url":"https://github.com/winder/Universal-G-Code-Sender","commit_stats":{"total_commits":2577,"total_committers":64,"mean_commits":40.265625,"dds":0.4183158711680248,"last_synced_commit":"b8f32ed0dcfb76711b97395548078968399be560"},"previous_names":[],"tags_count":48,"template":false,"template_full_name":null,"purl":"pkg:github/winder/Universal-G-Code-Sender","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winder%2FUniversal-G-Code-Sender","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winder%2FUniversal-G-Code-Sender/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winder%2FUniversal-G-Code-Sender/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winder%2FUniversal-G-Code-Sender/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/winder","download_url":"https://codeload.github.com/winder/Universal-G-Code-Sender/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winder%2FUniversal-G-Code-Sender/sbom","scorecard":{"id":1237460,"data":{"date":"2025-07-28","repo":{"name":"github.com/winder/Universal-G-Code-Sender","commit":"79ea53a45c1bbced6ff12da01fa34e055cbba0bc"},"scorecard":{"version":"v5.2.1-26-g4feedb85","commit":"4feedb857ab8d82158aa9774bf8054df41992180"},"score":2.8,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#packaging"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#cii-best-practices"}},{"name":"Code-Review","score":2,"reason":"Found 7/30 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/nightly.yaml:1","Warn: no topLevel permission defined: .github/workflows/pr.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#token-permissions"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: COPYING:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: COPYING:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v2.1.15 not signed: https://api.github.com/repos/winder/Universal-G-Code-Sender/releases/222953567","Warn: release artifact v2.1.14 not signed: https://api.github.com/repos/winder/Universal-G-Code-Sender/releases/212271861","Warn: release artifact v2.1.13 not signed: https://api.github.com/repos/winder/Universal-G-Code-Sender/releases/206641574","Warn: release artifact v2.1.12 not signed: https://api.github.com/repos/winder/Universal-G-Code-Sender/releases/193784175","Warn: release artifact v2.1.11 not signed: https://api.github.com/repos/winder/Universal-G-Code-Sender/releases/188867947","Warn: release artifact v2.1.15 does not have provenance: https://api.github.com/repos/winder/Universal-G-Code-Sender/releases/222953567","Warn: release artifact v2.1.14 does not have provenance: https://api.github.com/repos/winder/Universal-G-Code-Sender/releases/212271861","Warn: release artifact v2.1.13 does not have provenance: https://api.github.com/repos/winder/Universal-G-Code-Sender/releases/206641574","Warn: release artifact v2.1.12 does not have provenance: https://api.github.com/repos/winder/Universal-G-Code-Sender/releases/193784175","Warn: release artifact v2.1.11 does not have provenance: https://api.github.com/repos/winder/Universal-G-Code-Sender/releases/188867947"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#signed-releases"}},{"name":"Binary-Artifacts","score":1,"reason":"binaries present in source code","details":["Warn: binary detected: ugs-core/BundlingTools/one-jar-ant-task-0.97.jar:1","Warn: binary detected: ugs-core/BundlingTools/one-jar-ant-task-0.98.jar:1","Warn: binary detected: ugs-core/junit-4.10.jar:1","Warn: binary detected: ugs-platform/application/installer/7zip/7z.1602.ConLinux32.sfx:1","Warn: binary detected: ugs-platform/application/installer/7zip/7z.1602.ConMacOSX64.sfx:1","Warn: binary detected: ugs-platform/application/installer/7zip/7z.1602.ConWin32.sfx:1","Warn: binary detected: ugs-platform/application/installer/7zip/7z.1602.Linux32:1","Warn: binary detected: ugs-platform/application/installer/7zip/7z.1602.MacOSX64:1","Warn: binary detected: ugs-platform/application/installer/7zip/7z.1602.Win32:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#binary-artifacts"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#fuzzing"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:126: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:128: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:134: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/nightly.yaml:147: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:162: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:164: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:170: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/nightly.yaml:183: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:197: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:199: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:205: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/nightly.yaml:218: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/nightly.yaml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/nightly.yaml:75: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:90: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:92: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly.yaml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/nightly.yaml:111: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/nightly.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/pr.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/pr.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/pr.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/release.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/release.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/release.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yaml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/winder/Universal-G-Code-Sender/release.yaml/master?enable=pin","Info:   0 out of  24 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   7 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":3,"reason":"7 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2014-14 / GHSA-652x-xj99-gmcc","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2014-13 / GHSA-cfj3-7x9c-4p3h","Warn: Project is vulnerable to: PYSEC-2018-28 / GHSA-x84v-xcm2-53pg","Warn: Project is vulnerable to: GHSA-j288-q9x7-2f5v","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/4feedb857ab8d82158aa9774bf8054df41992180/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-09-11T14:06:46.768Z","repository_id":3728022,"created_at":"2025-09-11T14:06:46.776Z","updated_at":"2025-09-11T14:06:46.776Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30618075,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T04:46:40.957Z","status":"ssl_error","status_checked_at":"2026-03-17T04:46:32.538Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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","g2core","gcode","gcode-editor","gcode-parser","gcode-sender","gcode-viewer","grbl","grbl-control","hacktoberfest","java","smoothieware","tinyg"],"created_at":"2024-11-12T23:42:01.306Z","updated_at":"2026-03-17T08:02:45.436Z","avatar_url":"https://github.com/winder.png","language":"Java","readme":"![Universal G-Code Sender](https://github.com/winder/Universal-G-Code-Sender/raw/master/pictures/ugs_header.png \"UGS Splash Image\")\n\n\n[![Last commit](https://img.shields.io/github/last-commit/winder/Universal-G-Code-Sender.svg?maxAge=1800)](https://github.com/winder/Universal-G-Code-Sender/commits/master)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/winder/Universal-G-code-sender/nightly.yaml?branch=master)](https://github.com/winder/Universal-G-Code-Sender/actions/workflows/nightly.yaml)\n[![Crowdin](https://badges.crowdin.net/universalgcodesender/localized.svg)](https://translate.universalgcodesender.com/project/universalgcodesender)\n[![Downloads](https://img.shields.io/github/downloads/winder/universal-g-code-sender/total?label=downloads)](https://github.com/winder/Universal-G-Code-Sender#downloads)\n[![Releases](https://img.shields.io/github/v/release/winder/Universal-G-Code-Sender)](https://github.com/winder/Universal-G-Code-Sender/releases)\n[![Discord](https://img.shields.io/discord/1257702590137897072?label=discord%20chat)](https://discord.com/invite/4DYywtyGYK)\n\nUniversal G-Code Sender is a Java based, cross platform G-Code sender, compatible with [GRBL](https://github.com/gnea/grbl/), [TinyG](https://github.com/synthetos/TinyG), [g2core](https://github.com/synthetos/g2) and [Smoothieware](http://smoothieware.org/).\n\nWebpage: https://universalgcodesender.com/ \u003cbr/\u003e\nDiscussion forum: https://github.com/winder/Universal-G-Code-Sender/discussions \u003cbr/\u003e\nDiscord chat: https://discord.com/invite/4DYywtyGYK \u003cbr/\u003e\nTranslations: https://translate.universalgcodesender.com/ \u003cbr/\u003e\n\nTechnical details:\n\n* [JSSC](https://github.com/scream3r/java-simple-serial-connector) or [JSerialComm](https://github.com/Fazecast/jSerialComm) for serial communication\n* [JogAmp](https://jogamp.org/) for OpenGL\n* [Netbeans Platform](https://netbeans.org/features/platform/)\n* [JTS](https://github.com/locationtech/jts) for geometric transformations\n* [Batik](https://xmlgraphics.apache.org/batik/) for reading SVG\n\n## Downloads\nBelow you will find the latest release of UGS.\u003cbr/\u003e For older releases please visit the [releases page](https://github.com/winder/Universal-G-Code-Sender/releases).\n\nUnpack and start the program ```bin/ugsplatform```\n\n\n| Latest release (v2.1.20)                                                                                                                                                       | Nightly build                                                                                                                                                                         |\n|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| [![Windows 64-bit](pictures/os_windows.png) Windows 64-bit](https://github.com/winder/Universal-G-Code-Sender/releases/download/v2.1.20/win64-ugs-platform-app-2.1.20.zip)      | [![Windows 64-bit](pictures/os_windows.png) Windows 64-bit](https://github.com/winder/Universal-G-Code-Sender/releases/download/nightly/win64-ugs-platform-app-2.0-SNAPSHOT.zip)      |\n| [![Mac OSX](pictures/os_mac.png) Mac OSX](https://github.com/winder/Universal-G-Code-Sender/releases/download/v2.1.20/macosx-x64-ugs-platform-app-2.1.20.dmg)                   | [![Mac OSX](pictures/os_mac.png) Mac OSX](https://github.com/winder/Universal-G-Code-Sender/releases/download/nightly/macosx-x64-ugs-platform-app-2.0-SNAPSHOT.dmg)                   |\n| [![Mac OSX](pictures/os_mac.png) Mac OSX ARM64](https://github.com/winder/Universal-G-Code-Sender/releases/download/v2.1.20/macosx-aarch64-ugs-platform-app-2.1.20.dmg)         | [![Mac OSX ARM64](pictures/os_mac.png) Mac OSX ARM64](https://github.com/winder/Universal-G-Code-Sender/releases/download/nightly/macosx-aarch64-ugs-platform-app-2.0-SNAPSHOT.dmg)   | \n| [![Linux x64](pictures/os_linux.png) Linux 64-bit](https://github.com/winder/Universal-G-Code-Sender/releases/download/v2.1.20/linux-x64-ugs-platform-app-2.1.20.tar.gz)        | [![Linux x64](pictures/os_linux.png) Linux 64-bit](https://github.com/winder/Universal-G-Code-Sender/releases/download/nightly/linux-x64-ugs-platform-app-2.0-SNAPSHOT.tar.gz)        |\n| [![Linux ARM](pictures/os_linux_arm.png) Linux ARM](https://github.com/winder/Universal-G-Code-Sender/releases/download/v2.1.20/linux-arm-ugs-platform-app-2.1.20.tar.gz)       | [![Linux ARM](pictures/os_linux_arm.png) Linux ARM](https://github.com/winder/Universal-G-Code-Sender/releases/download/nightly/linux-arm-ugs-platform-app-2.0-SNAPSHOT.tar.gz)       |\n| [![Linux ARM](pictures/os_linux_arm.png) Linux ARM64](https://github.com/winder/Universal-G-Code-Sender/releases/download/v2.1.20/linux-aarch64-ugs-platform-app-2.1.20.tar.gz) | [![Linux ARM](pictures/os_linux_arm.png) Linux ARM64](https://github.com/winder/Universal-G-Code-Sender/releases/download/nightly/linux-aarch64-ugs-platform-app-2.0-SNAPSHOT.tar.gz) | \n| [![Zip](pictures/zip.png) All platforms](https://github.com/winder/Universal-G-Code-Sender/releases/download/v2.1.20/ugs-platform-app-2.1.20.zip)                               | [![Zip](pictures/zip.png) All platforms](https://github.com/winder/Universal-G-Code-Sender/releases/download/nightly/ugs-platform-app-2.0-SNAPSHOT.zip)                               |\n\n\n## Screenshots\n\nUGS Platform main window\n\n![UGS Platform](https://github.com/winder/Universal-G-Code-Sender/raw/master/pictures/2.0_platform_ugs_platform.png \"UGS Platform\")\n\nCustomizable panel layout\n\n![Customizable panel layout](https://github.com/winder/Universal-G-Code-Sender/raw/master/pictures/2.0_platform_customizable_panels.png \"Customizable panel layout\")\n\nMenu actions with customizable keybindings\n\n![Actions](https://github.com/winder/Universal-G-Code-Sender/raw/master/pictures/2.0_platform_actions_menu.png \"Actions\")\n\nMenu with plugins\n\n![Plugins](https://github.com/winder/Universal-G-Code-Sender/raw/master/pictures/2.0_platform_plugins_menu.png \"Plugins\")\n\nOne of many plugins\n\n![Dowel Maker](https://github.com/winder/Universal-G-Code-Sender/raw/master/pictures/2.0_platform_dowel_maker_plugin.png \"Dowel maker plugin\")\n\nBasic gcode editor\n\n![Basic gcode editor](https://github.com/winder/Universal-G-Code-Sender/raw/master/pictures/2.0_platform_editor.png \"Basic gcode editor\")\n\nVector graphics designer for generating GCode toolpaths\n\n![Designer](https://github.com/winder/Universal-G-Code-Sender/raw/master/pictures/2.0_platform_designer.png \"Basic gcode editor\")\n\n\n## Development\n\u003cdetails\u003e\u003csummary\u003eShow details on how to compile the software\u003c/summary\u003e\n\u003cp\u003e\n\nFor development we use [Maven](http://maven.apache.org) and [Java 17](https://adoptium.net/) for compiling.\n\n#### Compiling and starting the application\n\nUGS Classic: \n```bash\n./mvnw install\n./mvnw exec:java -Dexec.mainClass=\"com.willwinder.universalgcodesender.MainWindow\" -pl ugs-core\n```\n\nUGS Platform: \n```bash\n./mvnw install\n./mvnw nbm:run-platform -pl ugs-platform/application\n```\n\n\n#### Execute all tests\n\n```bash\n./mvnw test\n```\n\n\n#### Building the self-executing JAR\n\n```bash\n./mvnw install\n./mvnw package -pl ugs-classic\n```\n\n\n#### Build a UniversalGcodeSender.zip release file\n\n```bash\n./mvnw package -pl ugs-classic assembly:assembly\n```\n\n#### Develop via IntelliJ\n\nIf you are more used to IntelliJ, you can also build, run and debug it there.\n\n- Run  `./mvnw nbm:run-platform -pl ugs-platform/application` once via terminal to build everything\n- Import the Source, `File` -\u003e `New` -\u003e `Project from existing Sources`\n- Setup a new \"Run Configuration\", `Java Application`, with following settings:\n  - Main Class: `org.netbeans.Main`\n  - VM Options:\n```\n-Dpolyglot.engine.WarnInterpreterOnly=false\n-Dnetbeans.user=$ProjectFileDir$/ugs-platform/application/target/userdir\n-Dnetbeans.home=$ProjectFileDir$/ugs-platform/application/target/ugsplatform/platform\n-Dnetbeans.logger.console=true\n-Dnetbeans.indexing.noFileRefresh=true\n-Dnetbeans.moduleitem.dontverifyclassloader=true\n-Dnetbeans.dirs=$ProjectFileDir$/ugs-platform/application/target/ugsplatform/ugsplatform:$ProjectFileDir$/ugs-platform/application/target/ugsplatform/platform:$ProjectFileDir$/ugs-platform/application/target/ugsplatform/ide:$ProjectFileDir$/ugs-platform/application/target/ugsplatform/extra:$ProjectFileDir$/ugs-platform/application/target/ugsplatform/java\n--add-opens=java.base/java.net=ALL-UNNAMED\n--add-opens=java.base/java.lang.ref=ALL-UNNAMED\n--add-opens=java.base/java.lang=ALL-UNNAMED\n--add-opens=java.base/java.security=ALL-UNNAMED\n--add-opens=java.base/java.util=ALL-UNNAMED\n--add-opens=java.base/java.nio=ALL-UNNAMED\n--add-exports=java.base/sun.reflect.annotation=ALL-UNNAMED\n--add-opens=java.prefs/java.util.prefs=ALL-UNNAMED\n--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED\n--add-opens=java.desktop/javax.swing.text=ALL-UNNAMED\n--add-opens=java.desktop/javax.swing=ALL-UNNAMED\n--add-opens=java.desktop/java.awt=ALL-UNNAMED\n--add-opens=java.desktop/java.awt.event=ALL-UNNAMED\n--add-opens=java.desktop/sun.awt.X11=ALL-UNNAMED\n--add-opens=java.desktop/javax.swing.plaf.synth=ALL-UNNAMED\n--add-opens=java.desktop/com.sun.java.swing.plaf.gtk=ALL-UNNAMED\n--add-opens=java.desktop/sun.awt.shell=ALL-UNNAMED\n--add-opens=java.desktop/sun.awt.im=ALL-UNNAMED\n--add-exports=java.desktop/sun.awt=ALL-UNNAMED\n--add-exports=java.desktop/java.awt.peer=ALL-UNNAMED\n--add-exports=java.desktop/com.sun.beans.editors=ALL-UNNAMED\n--add-exports=java.desktop/sun.swing=ALL-UNNAMED\n--add-exports=java.desktop/sun.awt.im=ALL-UNNAMED\n--add-exports=java.desktop/com.sun.java.swing.plaf.motif=ALL-UNNAMED\n``` \n  - Program arguments: `--branding ugsplatform`\n  - Working dir: `$ProjectFileDir$`\n  - Use classpath of module: `ugs-platform-app` \n- There is a [runConfiguration](.idea/runConfigurations/UGS_Platform.xml) in the repository, which should be available after importing the project\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eShow code documentation.\u003c/summary\u003e\n\u003cp\u003e\n\n### High-Level Architecture\n\n1.  **Core Module (`ugs-core`)**: This is the heart of UGS. It contains:\n    * **Communication Layer**: Handles serial communication (or other protocols like TCP/IP for some controllers) with the CNC machine's firmware (e.g., GRBL). It translates G-code commands into signals the controller understands and interprets responses from the controller.\n    * **G-code Parser and Interpreter**: Processes G-code files, breaks them down into individual commands, and manages the sending sequence.\n    * **Machine State Management**: Keeps track of the machine's current position (X, Y, Z coordinates), feed rate, spindle speed, and other relevant operational parameters. This is the data that populates the \"Controller State (DRO)\" panel.\n    * **Toolpath Generation/Visualization Logic**: While UGS isn't primarily a CAM (Computer-Aided Manufacturing) software, it contains logic to interpret G-code and generate a visual representation of the toolpath for the user.\n    * **Settings and Configuration Management**: Handles loading and saving user preferences, machine settings, and connection parameters.\n\n2.  **Platform/Application Layer (`ugs-platform/application` and other modules)**: This layer builds upon the core functionality and provides the graphical user interface (GUI) and specific features.\n    * **NetBeans Platform**: UGS Platform leverages the NetBeans Platform, which provides a robust framework for building desktop applications. This means the UI is composed of \"modules\" or \"plugins,\" each responsible for a specific set of functionalities (e.g., a module for the visualizer, a module for the console, a module for the DRO).\n    * **User Interface (UI) Components**: These are the visual elements the user interacts with, such as buttons, text fields, tables, and the visualizer. These components are typically Swing-based (Java's GUI toolkit) or, less commonly, JavaFX.\n    * **Event Handling**: Manages user interactions (button clicks, keyboard input, mouse movements) and translates them into calls to the core module or other platform services.\n    * **Plugin System**: The modular nature allows for easy addition of new features or customization through plugins.\n\n3.  **Third-Party Libraries**: UGS relies on various external libraries for tasks like:\n    * Serial communication (e.g., JSSC - Java Simple Serial Connector).\n    * 3D visualization (e.g., JOGL for OpenGL integration).\n    * Logging.\n    * JSON parsing (for settings).\n\n### UI elements\n\nThe user-interface elements of ugs-platform can be found in the `ugs-platform` folder. Each window in the platform-application is a Panel object. We list differnt ui elements together with their location below:\n\n- Controller State (DRO): This is the window to see the current state of the machine (connected/disconnected) and its current position. The code is located under `ugs-platform/ugs-platform-plugin-dro/src/main/java/.../panels/MachineStatusPanel.java`.\n\n- Jog Controller: This window contains buttons to jog the machine. The code is located under `ugs-platform/ugs-platform-plugin-jog/src/main/java/.../jog/JogPannel.java`. In the resources folder, you will find svg images which are displayed inside the jog buttons.\n\n- Overrides pannel: `ugs-core/src/com/.../uielements/panels/OverridesPanel.java`.\n\n- language-specific text: In the folder `ugs-core/src/com/.../resources/`, you will find a lot of `.properties` files. These contain language-specific text that is shown to the user, such as label text, button text etc.\n\n### Logs\n\nApplication logs, including detailed debug messages and error reports, are primarily written to the messages.log file. This file is located within the application's user directory at `ugs-platform/application/target/userdir/var/log/messages.log` when running from the build target. In the event of an unexpected application crash or erratic behavior, reviewing this log file is the first recommended step, as it often contains stack traces and error messages that can pinpoint the root cause of the problem. Additionally, for severe JVM crashes, a `hs_err_pid\u003cPID\u003e.log` file might be generated in the application's working directory, offering further low-level diagnostic information.\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n\n## Supported by\n[![JetBrains logo.](https://resources.jetbrains.com/storage/products/company/brand/logos/jetbrains.svg)](https://jb.gg/OpenSourceSupport)\n","funding_links":["https://github.com/sponsors/breiler","https://github.com/sponsors/winder","https://paypal.me/universalgcodesender"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwinder%2Funiversal-g-code-sender","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwinder%2Funiversal-g-code-sender","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwinder%2Funiversal-g-code-sender/lists"}