Control your CNC machine running gSender directly from an Elgato Stream Deck. Supports all Stream Deck models including the Stream Deck + with dial/encoder actions.
The plugin connects to gSender via its built-in Socket.IO server (port 8000) and piggybacks on the existing serial connection, so you can use it alongside the gSender UI without conflict.
- gSender running with remote access enabled (default port 8000)
- Elgato Stream Deck software v6.4+
- A GRBL or grblHAL based CNC controller
npm install
npm run build
npx streamdeck link com.sienci.gsender.sdPluginRestart Stream Deck software after linking.
The plugin ships with pre-configured profiles for the Stream Deck +. On first install, both an Idle and Running profile are added to your profile list. You can switch between them manually or customize them to your liking.
Actions are organized into three categories based on typical usage:
- Idle/Setup — Actions you'll use most when the machine is idle: jogging, zeroing, positioning
- Running a Program — Actions you'll use during a running G-code job: pause, stop, overrides
- Advanced — Additional actions for power users and custom workflows
These are the actions you'll reach for most when setting up a job — positioning the machine, zeroing axes, and getting ready to cut.
Shows the current machine position (absolute coordinates) on the button face. Displays OFFLINE when not connected to gSender.
| Type | Keypad (read-only display) |
| Settings | None |
Initiates a homing cycle ($H). The machine moves to its limit switches to establish a known position.
| Type | Keypad |
| Settings | None |
Clears an alarm state and unlocks the machine ($X). Use after homing or after an alarm.
| Type | Keypad |
| Settings | None |
Jogs the machine in a configured axis and direction. Uses the current jog distance and feedrate.
| Type | Keypad |
| Settings | Axis (X, Y, Z), Direction (+ or -), Skip if jogging (prevents command stacking) |
Tip: Set up 6 jog buttons for X+, X-, Y+, Y-, Z+, Z- for full directional control.
Jog an axis using the Stream Deck + dial. Rotate to jog, push to cancel. Shows current axis position on the touchscreen.
| Type | Encoder (Stream Deck +) |
| Settings | Axis (X, Y, Z), Skip if jogging |
| Rotate | Jog in configured axis |
| Push | Cancel current jog |
Immediately cancels any in-progress jog movement.
| Type | Keypad |
| Settings | None |
Cycles through a list of preset jog distances. Each press advances to the next distance in the list. The current distance is shown on the button.
| Type | Keypad |
| Settings | Axis group (XY or Z), Distances (comma-separated list, e.g. 0.1, 1, 10, 50) |
Sets the current position as zero for the respective axis. Uses G10 L20 P1.
| Type | Keypad |
| Settings | None |
Sets the current position as zero for all axes (X, Y, Z) simultaneously.
| Type | Keypad |
| Settings | None |
Rapid moves to the zero position on the respective axis (G0).
| Type | Keypad |
| Settings | None |
Rapid moves to zero on all axes simultaneously.
| Type | Keypad |
| Settings | None |
Safely moves to XY zero by first raising Z to a safe height (G28 Z), then rapid moving X and Y to zero. Prevents dragging the bit across the workpiece.
| Type | Keypad |
| Settings | None |
Important: Requires G28 safe position to be set. Configure with
G28.1in gSender first.
These actions are designed for use while a G-code job is executing. They give you real-time control over the running program.
Smart button that starts a loaded G-code file when idle, or resumes the job when paused/held. The button title updates dynamically: START, RUNNING, or RESUME.
| Type | Keypad |
| Settings | None |
Toggles between pausing and resuming. When running, it engages feed hold and pauses the sender. When paused, it sends cycle start and resumes. The button title shows PAUSE or RESUME.
| Type | Keypad |
| Settings | None |
This combines GRBL feed hold (firmware-level) with gSender's sender pause (software-level) for reliable pause/resume behavior.
Performs a full program abort sequence:
- Feed hold (stops motion immediately)
- M5 (stops spindle)
- M9 (turns off coolant)
- Force stops the gSender sender
- Resets the controller after 500ms (returns to Idle state)
| Type | Keypad |
| Settings | None |
Brutal instant stop. Immediately resets the GRBL controller, which:
- Kills all motion instantly
- Stops the spindle
- Releases stepper motors (machine enters Alarm state)
- Force stops the gSender sender
| Type | Keypad |
| Settings | None |
Warning: The machine will lose its position reference after an E-Stop. You'll need to home and re-zero.
Adjust the Z offset in real-time while a program is running. Uses G43.1 (dynamic tool length offset) for grblHAL controllers. Push the dial to reset the offset to zero (G49).
| Type | Encoder (Stream Deck +) |
| Settings | Step size (mm, default 0.01) |
| Rotate | Adjust Z offset (CW = shallower, CCW = deeper) |
| Push | Reset offset to zero |
Note: Requires grblHAL. Standard GRBL may not support G43.1.
Adjust the feed rate override using the dial. Push to reset to 100%. Range: 10% - 200%.
| Type | Encoder (Stream Deck +) |
| Settings | Step size (%, default 10) |
| Rotate | Increase/decrease feed override |
| Push | Reset to 100% |
Adjust the spindle speed override using the dial. Push to reset to 100%. Range: 10% - 200%.
| Type | Encoder (Stream Deck +) |
| Settings | Step size (%, default 10) |
| Rotate | Increase/decrease spindle override |
| Push | Reset to 100% |
Set the feed rate override to a specific percentage with one press.
| Type | Keypad |
| Settings | Value (%, e.g. 50, 100, 150) |
Set the spindle speed override to a specific percentage with one press.
| Type | Keypad |
| Settings | Value (%, e.g. 50, 100, 150) |
Set the rapid movement override. GRBL supports three levels: 100%, 50%, or 25%.
| Type | Keypad |
| Settings | Value (100, 50, or 25) |
These actions cover additional functionality for power users, custom workflows, and less commonly needed controls.
Runs a gSender macro by name. Macros are loaded automatically when the plugin connects.
| Type | Keypad |
| Settings | Macro name (must match the name in gSender exactly) |
Sends a custom G-code command. The button title shows the first 8 characters of the command.
| Type | Keypad |
| Settings | G-code (any valid G-code command) |
Tip: Use this for custom commands like
G28.1(set safe position), tool changes, or controller-specific commands.
Manually control spindle speed using the dial. Sends M3 S<speed> on rotation. Push to stop the spindle (M5).
| Type | Encoder (Stream Deck +) |
| Settings | Step size (RPM, default 2000), Max speed (RPM, default 24000) |
| Rotate | Increase/decrease spindle RPM |
| Push | Stop spindle (M5) |
Immediately stops the spindle (M5) and resets the speed to 0.
| Type | Keypad |
| Settings | None |
Disconnects and reconnects to gSender. Useful if the connection gets into a bad state.
| Type | Keypad |
| Settings | None |
Manually re-fetches the macro list from gSender. Normally macros are loaded automatically on connection.
| Type | Keypad |
| Settings | None |
Displays the current connection status. Shows ONLINE or OFFLINE with distinct button states.
| Type | Keypad (read-only display) |
| Settings | None |
Displays the current GRBL machine state: Idle, Run, Hold, Jog, Alarm, etc.
| Type | Keypad (read-only display) |
| Settings | None |
Sends a soft reset to the GRBL controller. Use with caution — this will stop all motion and may require re-homing.
| Type | Keypad |
| Settings | None |
Standalone feed hold command. Immediately pauses motion at the firmware level. Use Cycle Start to resume.
| Type | Keypad |
| Settings | None |
Standalone cycle start command. Resumes motion after a feed hold at the firmware level.
| Type | Keypad |
| Settings | None |
Standalone resume command. Resumes the gSender sender after a pause. In most cases, use the Start/Resume or Pause/Resume Toggle buttons instead.
| Type | Keypad |
| Settings | None |
The plugin includes pre-configured profiles for the Stream Deck +. These are installed automatically and provide a starting point for your own layout.
| Profile | Description |
|---|---|
| gSender - Idle | Optimized for setup and positioning: jog controls, zeroing, go-to-zero, position display |
| gSender - Running | Optimized for active jobs: start/pause/stop, overrides, live Z adjust, emergency stop |
You can customize these profiles or create your own. To export your customized profile for sharing: right-click the profile in Stream Deck software and select Export.
The plugin connects to localhost:8000 by default. To change the host or port, configure the global settings in any action's Property Inspector.
- Plugin connects to gSender's Socket.IO server
- Requests the serial port list
- If a port is already in use (by gSender UI), it piggybacks on that connection
- If no port is in use, it opens the first available port
- Status polling begins at 1-second intervals
- grblHAL — Full support including G43.1 live Z adjustment
- GRBL — Full support except live Z adjustment (G43.1 not available)
npm install # Install dependencies
npm run build # Build the plugin
npm run watch # Build on file changes
npx streamdeck link com.sienci.gsender.sdPlugin # Link for development
npm run restart # Restart Stream Deck softwareMIT