A cross-platform G-Code sender for GRBL, Smoothieware, TinyG and G2core.
See the code
Universal G-Code Sender is a Java based, cross platform G-Code sender, compatible with GRBL, TinyG, g2core and Smoothieware.
Webpage: https://universalgcodesender.com/
Discussion forum: https://github.com/winder/Universal-G-Code-Sender/discussions
Discord chat: https://discord.com/invite/4DYywtyGYK
Translations: https://translate.universalgcodesender.com/
Technical details:
Below you will find the latest release of UGS.
For older releases please visit the releases page.
Unpack and start the program bin/ugsplatform
| Latest release (v2.1.27) | Nightly build |
|---|---|
Windows 64-bit | Windows 64-bit |
Mac OSX | Mac OSX |
Mac OSX ARM64 | Mac OSX ARM64 |
Linux 64-bit | Linux 64-bit |
Linux ARM64 | Linux ARM64 |
All platforms | All platforms |
UGS Platform main window

Customizable panel layout

Menu actions with customizable keybindings

Menu with plugins

One of many plugins

Basic gcode editor

Vector graphics designer for generating GCode toolpaths

For development we use Maven and Java 25 for compiling.
On Windows you might need to install zip:
winget install -e --id GnuWin32.Zip
UGS Classic:
./mvnw install
./mvnw exec:java -Dexec.mainClass="com.willwinder.universalgcodesender.MainWindow" -pl ugs-core
UGS Platform:
./mvnw install
./mvnw nbm:run-platform -pl ugs-platform/application
./mvnw test
./mvnw install
./mvnw package -pl ugs-classic
./mvnw package -pl ugs-classic assembly:assembly
If you are more used to IntelliJ, you can also build, run and debug it there.
./mvnw nbm:run-platform -pl ugs-platform/application once via terminal to build everythingFile -> New -> Project from existing SourcesJava Application, with following settings:
org.netbeans.Main-Dpolyglot.engine.WarnInterpreterOnly=false
-Dnetbeans.user=$ProjectFileDir$/ugs-platform/application/target/userdir
-Dnetbeans.home=$ProjectFileDir$/ugs-platform/application/target/ugsplatform/platform
-Dnetbeans.logger.console=true
-Dnetbeans.indexing.noFileRefresh=true
-Dnetbeans.moduleitem.dontverifyclassloader=true
-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
--add-opens=java.base/java.net=ALL-UNNAMED
--add-opens=java.base/java.lang.ref=ALL-UNNAMED
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.security=ALL-UNNAMED
--add-opens=java.base/java.util=ALL-UNNAMED
--add-opens=java.base/java.nio=ALL-UNNAMED
--add-exports=java.base/sun.reflect.annotation=ALL-UNNAMED
--add-opens=java.prefs/java.util.prefs=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.text=ALL-UNNAMED
--add-opens=java.desktop/javax.swing=ALL-UNNAMED
--add-opens=java.desktop/java.awt=ALL-UNNAMED
--add-opens=java.desktop/java.awt.event=ALL-UNNAMED
--add-opens=java.desktop/sun.awt.X11=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.plaf.synth=ALL-UNNAMED
--add-opens=java.desktop/com.sun.java.swing.plaf.gtk=ALL-UNNAMED
--add-opens=java.desktop/sun.awt.shell=ALL-UNNAMED
--add-opens=java.desktop/sun.awt.im=ALL-UNNAMED
--add-exports=java.desktop/sun.awt=ALL-UNNAMED
--add-exports=java.desktop/java.awt.peer=ALL-UNNAMED
--add-exports=java.desktop/com.sun.beans.editors=ALL-UNNAMED
--add-exports=java.desktop/sun.swing=ALL-UNNAMED
--add-exports=java.desktop/sun.awt.im=ALL-UNNAMED
--add-exports=java.desktop/com.sun.java.swing.plaf.motif=ALL-UNNAMED
--branding ugsplatform$ProjectFileDir$ugs-platform-app
Core Module (ugs-core): This is the heart of UGS. It contains:
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.
Third-Party Libraries: UGS relies on various external libraries for tasks like:
The 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:
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.
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.
Overrides pannel: ugs-core/src/com/.../uielements/panels/OverridesPanel.java.
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.
Application 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<PID>.log file might be generated in the application's working directory, offering further low-level diagnostic information.
427 followers · starred Dec 2018
683 followers · starred Mar 2026
32 followers · starred Oct 2023
312 followers · starred Oct 2015
A cross-platform G-Code sender for GRBL, Smoothieware, TinyG and G2core.
See the code
Universal G-Code Sender is a Java based, cross platform G-Code sender, compatible with GRBL, TinyG, g2core and Smoothieware.
Webpage: https://universalgcodesender.com/
Discussion forum: https://github.com/winder/Universal-G-Code-Sender/discussions
Discord chat: https://discord.com/invite/4DYywtyGYK
Translations: https://translate.universalgcodesender.com/
Technical details:
Below you will find the latest release of UGS.
For older releases please visit the releases page.
Unpack and start the program bin/ugsplatform
| Latest release (v2.1.27) | Nightly build |
|---|---|
Windows 64-bit | Windows 64-bit |
Mac OSX | Mac OSX |
Mac OSX ARM64 | Mac OSX ARM64 |
Linux 64-bit | Linux 64-bit |
Linux ARM64 | Linux ARM64 |
All platforms | All platforms |
UGS Platform main window

Customizable panel layout

Menu actions with customizable keybindings

Menu with plugins

One of many plugins

Basic gcode editor

Vector graphics designer for generating GCode toolpaths

For development we use Maven and Java 25 for compiling.
On Windows you might need to install zip:
winget install -e --id GnuWin32.Zip
UGS Classic:
./mvnw install
./mvnw exec:java -Dexec.mainClass="com.willwinder.universalgcodesender.MainWindow" -pl ugs-core
UGS Platform:
./mvnw install
./mvnw nbm:run-platform -pl ugs-platform/application
./mvnw test
./mvnw install
./mvnw package -pl ugs-classic
./mvnw package -pl ugs-classic assembly:assembly
If you are more used to IntelliJ, you can also build, run and debug it there.
./mvnw nbm:run-platform -pl ugs-platform/application once via terminal to build everythingFile -> New -> Project from existing SourcesJava Application, with following settings:
org.netbeans.Main-Dpolyglot.engine.WarnInterpreterOnly=false
-Dnetbeans.user=$ProjectFileDir$/ugs-platform/application/target/userdir
-Dnetbeans.home=$ProjectFileDir$/ugs-platform/application/target/ugsplatform/platform
-Dnetbeans.logger.console=true
-Dnetbeans.indexing.noFileRefresh=true
-Dnetbeans.moduleitem.dontverifyclassloader=true
-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
--add-opens=java.base/java.net=ALL-UNNAMED
--add-opens=java.base/java.lang.ref=ALL-UNNAMED
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.security=ALL-UNNAMED
--add-opens=java.base/java.util=ALL-UNNAMED
--add-opens=java.base/java.nio=ALL-UNNAMED
--add-exports=java.base/sun.reflect.annotation=ALL-UNNAMED
--add-opens=java.prefs/java.util.prefs=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.text=ALL-UNNAMED
--add-opens=java.desktop/javax.swing=ALL-UNNAMED
--add-opens=java.desktop/java.awt=ALL-UNNAMED
--add-opens=java.desktop/java.awt.event=ALL-UNNAMED
--add-opens=java.desktop/sun.awt.X11=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.plaf.synth=ALL-UNNAMED
--add-opens=java.desktop/com.sun.java.swing.plaf.gtk=ALL-UNNAMED
--add-opens=java.desktop/sun.awt.shell=ALL-UNNAMED
--add-opens=java.desktop/sun.awt.im=ALL-UNNAMED
--add-exports=java.desktop/sun.awt=ALL-UNNAMED
--add-exports=java.desktop/java.awt.peer=ALL-UNNAMED
--add-exports=java.desktop/com.sun.beans.editors=ALL-UNNAMED
--add-exports=java.desktop/sun.swing=ALL-UNNAMED
--add-exports=java.desktop/sun.awt.im=ALL-UNNAMED
--add-exports=java.desktop/com.sun.java.swing.plaf.motif=ALL-UNNAMED
--branding ugsplatform$ProjectFileDir$ugs-platform-app
Core Module (ugs-core): This is the heart of UGS. It contains:
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.
Third-Party Libraries: UGS relies on various external libraries for tasks like:
The 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:
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.
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.
Overrides pannel: ugs-core/src/com/.../uielements/panels/OverridesPanel.java.
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.
Application 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<PID>.log file might be generated in the application's working directory, offering further low-level diagnostic information.
427 followers · starred Dec 2018
683 followers · starred Mar 2026
32 followers · starred Oct 2023
312 followers · starred Oct 2015