All notable changes to this project are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.0.7 - 2026-08-13
-
Reject cross-origin WebSocket handshakes. Browsers do not apply the same-origin policy to WebSocket connections — they send an
Originheader and leave the decision to the server, and this one accepted every caller. Because the daemon has no authentication, any web page opened by anyone on the same network could connect from their browser and take control:jog,plot,setSetting(writes GRBL EEPROM) andupdate(installs a.deband restarts) were all reachable, with no network access of the attacker's own.Same-origin handshakes pass, including through a reverse proxy that forwards the original host. Requests without an
Originheader (curl, the smoke test, native clients) still pass — those already require network access to the daemon. Extra origins can be allowed withGATEWAY_ALLOWED_ORIGINS.This is not authentication: anything that can reach the port can still drive the machine. Keep it on a trusted network, or bind to loopback.
1.0.6 - 2026-08-13
- Behind a reverse proxy on the default HTTPS port, the WebSocket URL appended
:8717to the proxied host, so the GUI loaded but every control was dead — the socket pointed at a port the proxy does not listen on.location.hostalready carries the port when the URL has one, so it is now used as-is. Direct access on:8717is unaffected.
- Dev-tooling maintenance: TypeScript 7, Vite 8.1, Vitest 4.1.10, Prettier 3.9,
@vitejs/plugin-react6.0.4, and Tailwind 4.3.3. Addedsrc/vite-env.d.ts(vite/clienttypes) so TypeScript 7 resolves the side-effect CSS import.
1.0.5 - 2026-07-27
- Upgraded the frontend to React 19 (
react/react-dom19.2,react-konva19.2, and the matching@types). - Relicensed the project under Apache License 2.0 (previously MIT).
- Derive the WebSocket URL from the page's scheme/host so the app works behind an
HTTPS reverse proxy (
wss://). - Dependency maintenance:
ws8.21.1,tsx4.23.1, and the CI actions (actions/checkout7,actions/setup-node7,docker/setup-qemu-action4.2).
- Project docs and automation:
CHANGELOG.md, README status badges, and a Dependabot configuration for weekly dependency and GitHub Actions updates.
- Bumped
postcssto resolve GHSA-r28c-9q8g-f849 (dev-only transitive dependency).
1.0.4 - 2026-06-25
- The in-app "update available" banner now clears after a successful self-update.
1.0.3 - 2026-06-24
- Importing a large SVG no longer freezes the UI.
1.0.2 - 2026-06-24
- The Debian package installs self-updates non-interactively.
1.0.1 - 2026-06-24
- The gateway daemon binds to
0.0.0.0by default in the.debso the app is reachable on the LAN with no tunnel. Note: the daemon has no built-in authentication — see the Access section of the README before exposing it.
1.0.0 - 2026-06-23
First feature-complete release.
- Plotter control core — GRBL streaming engine, machine status/alarms, and manual control (jog, pen up/down, set/go-to work zero, motors off).
- Machine origin handling — work-coordinate origin at the paper's top-left corner with position restore across power cycles (no homing / no limit switches).
- SVG & PNG plotting — SVG flattening to polylines, raster iso-contour tracing, page layout (place/scale/rotate), and G-code generation.
- Gateway daemon — a long-running Node daemon that owns the serial port, streams plots autonomously (survives client disconnects), and serves the GUI over a WebSocket.
- Plot-time estimate — estimated plot duration costed from calibrated feed rates and pen dwell.
- Live drawing controls — progress, pause/resume, stop-and-return-home, feed override, and a live pen-position marker.
- Mobile remote control — connect and monitor from any device on the network.
- Shared calibration & session persistence — layout/session stored on the daemon; calibration stored per browser.
- Raspberry Pi deployment — an arm64
.debpackage with a bundled Node runtime, systemd service, udev rule, and dedicated system user. - In-app self-update — install newer releases from the latest GitHub Release directly from the browser.