A modern Electron-based machine controller for the Ghost Gunner CNC, built as a replacement for DDCut. GG Runner provides a guided three-step setup workflow, optic footprint milling, mounting hole drilling/tapping, and real-time feed/spindle override controls.
- Node.js 18 or later
- Ghost Gunner machine (GG2 or GG3) with GRBL firmware ≥ 20220800
- Gcode library folder — the
accurate armsdirectory containing theCode/subfolder (see Library Structure)
# Install dependencies
npm install
# Development (hot-reload Vite + Electron)
npm run dev
# Production build + launch
npm startOn first launch, use the 📂 Library button in the header to point GG Runner at your gcode library folder. The path is saved automatically for future sessions.
GG Runner guides you through a three-phase setup before any milling:
The machine moves to the clamping position for the selected slide type and then waits for you to physically install the slide into the jaws. Slide-specific instructions and reference images are shown at each step.
The machine probes the slide surface to find X, Y, and Z reference points. Stay nearby during probing — there should be a slight contact sound when the endmill touches the slide or clamp.
Computes and writes the work coordinate system (WCS) offsets for the selected slide. Once complete, the cut panel is unlocked.
Select an optic, position (Rear / Standard), and depth, then click Mill Footprint. The machine will:
- Run the footprint configuration gcode
- Apply any compensation offset for the selected depth
- Mill the optic pocket
- Return to home
Select a thread size (4-40, M3, or 6-32) and click Drill & Tap. The machine will:
- Drill pilot holes
- Probe Z again before thread-milling (tool length differs from the 1/16" endmill)
- Thread-mill all mounting holes
- Return to home
| Slide | Notes |
|---|---|
| Glock 17 / 19 / 26 | Standard and rear positions |
| Glock 43 / 48 | Narrow frame |
| Glock 20 | 10mm platform |
| 1911 MOS | Requires 1911 MOS platform bed |
| P320 | SIG Sauer P320 |
| M&P 2.0 | Smith & Wesson M&P 2.0 |
RMR · RMRCC · RMS · DPP · Docter · Razor · Viper (and compatible)
Real-time controls are available at all times in the Machine Controls panel:
| Control | Function |
|---|---|
| Feed slider | Adjust feed rate override (10–200%) |
| Spindle slider | Adjust spindle override (10–200%) |
| ↩ (reset) | Revert feed or spindle to 100% |
| Hold | Pause gcode streaming and motion immediately |
| Resume | Continue from where Hold was pressed |
| Soft Reset | Abort the current job and reset the machine |
GG Runner expects a library folder with this layout:
<library root>/
Code/
Slide_Positioning/ # per-slide clamping gcode
Slide_Probing/ # per-slide probe sequences
Slide_Configs/ # WCS configuration gcode
Footprint_Configs/ # per-optic footprint setup
Footprint_Milling/ # per-optic milling gcode
Depth_Setting/ # depth compensation gcode (088, 095, 125 …)
Hole_Cutting/ # drill + thread-mill sequences
Comps/ # per-optic compensation offsets
Image/ # instruction images referenced by YAML
manifest.yml # DDCut-compatible job manifest
1911_mos_platform.yml # 1911 MOS platform manifest
The default path is ../accurate-arms/accurate arms relative to the app directory. Change it at any time with the 📂 Library button; the selection persists between sessions.
Enable the Dev checkbox in the header to simulate a connected machine without a serial port. All gcode is processed but no bytes are sent. Useful for testing workflow changes.
| File | Role |
|---|---|
main.js |
Electron main process — window, IPC handlers, settings persistence |
preload.js |
Secure context bridge exposing window.gg to the renderer |
src/workflow.js |
Orchestrates the full slide → probe → configure → cut sequence |
src/serial-manager.js |
GRBL serial port abstraction (connect, send, realtime bytes, events) |
src/interpreter.js |
Evaluates M106 conditional expressions against memory values |
src/memory.js |
In-process WCS / named-variable store shared with the interpreter |
src/manifest-runner.js |
Walks DDCut-compatible YAML manifests and yields steps |
renderer/app.js |
All UI logic and event handling |
renderer/index.html |
Single-page Electron renderer |
renderer/style.css |
Dark-theme stylesheet |