A GRBL laser controller that runs entirely in the browser over the Web Serial API.
I couldn't get Lightburn to run on my MacBook (M1 - I suspect the problem might be Apple Silicon support) so I just... made my entire own laser engraving software.
Any of these work:
Live: https://laser.brennan.computer
# 1. Just open the file. Web Serial works from file:// in Chrome, so just open index.html locally
# 2. Or serve it, if you prefer a localhost origin
python3 -m http.server 8000 # then http://localhost:8000Requires Chrome, Edge, or another Chromium browser. Safari and Firefox do not implement Web Serial and never load the serial picker.
Everything is client-side. Nothing is uploaded, there's no server; no data or images you trace ever leave your machine.
- Top right: hit CONNECT, then choose the USB port your laser is connected to (usually it's named something obvious)
- On connect it sends
$$and learns$30(max S) and$130/$131(work area, drawn as the dashed envelope in the preview). - Drop a
.gcode/.ncfile or an image onto the preview.- Images open the vector tracer (see below).
- ▢ OUTLINE walks the job's bounding box with the laser off, looping until you click it again — use it to position material before burning.
- ▶ RUN streams the job. The browser and computer MUST stay on for this, it's streaming commands to the machine in realtime so disconnects mean the laser stops running.
| Control | Notes |
|---|---|
| Jog pad | $J= jog commands. Arrow keys work too; PgUp/PgDn for Z; Esc = jog cancel |
| HOME / UNLOCK | $H / $X |
| ZERO XY / ZERO Z | G10 L20 P1 — sets work origin at current position |
| HOLD / RESUME | Realtime ! / ~ |
| STOP | Feed hold, then soft reset 400 ms later — decelerates instead of losing steps |
| Overrides | Realtime bytes 0x90–0x9D, live feed/power trim while running |
| Console | Full history (↑/↓). Error and alarm codes are decoded to plain English |
Drop an image → threshold it → trace contours → generate G-code.
- Threshold — auto-set per image via Otsu's method, then adjustable live.
- Invert — trace light areas instead of dark.
- Despeckle — drop contours below N mm² (potrace's
turdsize). - Simplify — Douglas-Peucker tolerance in mm.
- Smoothing — Chaikin corner rounding, capped in mm so straight edges stay straight.
- Width / power / feed / passes live in the left sidebar and stay adjustable after the tracer closes — changing them regenerates the job in place.
Output uses M4 dynamic power, orders paths greedy-nearest, and rotates each closed
loop to start nearest the previous path's end to cut travel time.
This is outline tracing — good for logos, text, line art, cutting. It is not photo engraving, which needs raster scanning with per-pixel power modulation.
If the serial port doesn't appear in Chrome's picker, the Mac isn't enumerating the laser's USB-serial chip — which would break LightBurn too, not just this app.
ls /dev/cu.* # laser plugged in and powered on
system_profiler SPUSBDataType # find the vendor ID- A
cu.usbserial-*/cu.wchusbserial*node appears → drivers are fine. - Nothing appears → try a different USB cable first. Engravers ship notoriously bad ones, and a charge-only cable looks exactly like a software problem.
- Still nothing → check the vendor ID.
0x1a86= WCH (CH340/CH9102):brew install --cask wch-ch34x-usb-serial-driver, approve it in System Settings → Privacy & Security, replug.0x10c4= Silicon Labs CP210x.