juicy-gcode: SVG to G-Code converter

[ bsd3, graphics, program ] [ Propose Tags ]

SVG to G-code converter that aims to support most SVG features. It provides flexible options for curve approximation and allows configurable GCode generation based on color information.

[Skip to Readme]


Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Versions [RSS],,,,,,,,,,,,,,,,,
Change log ChangeLog.md
Dependencies aeson (>=1.5 && <2.2), base (>=4.8 && <5), gitrev (>=1.3.0 && <1.4), JuicyPixels (>=3.3.7 && <3.4), lens (>=4.15.4 && <5.3), linear (>=1.20 && <1.23), matrix (>=0.3.5 && <0.4), optparse-applicative (>=0.13 && <0.20), svg-tree (>=0.6 && <0.7), text (>=1.2.2 && <1.3 || >=2.0 && <2.1), unordered-containers (>=0.2.16 && <0.3), yaml (>=0.11.8 && <0.12) [details]
License BSD-3-Clause
Author dlacko
Maintainer dlacko@gmail.com
Category Graphics
Home page https://github.com/domoszlai/juicy-gcode
Bug tracker https://github.com/domoszlai/juicy-gcode/issues
Source repo head: git clone https://github.com/domoszlai/juicy-gcode
Uploaded by dlacko at 2023-05-29T09:36:35Z
Distributions NixOS:
Reverse Dependencies 1 direct, 0 indirect [details]
Executables juicy-gcode
Downloads 6850 total (78 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs not available [build log]
Last success reported on 2023-05-29 [all 1 reports]

Readme for juicy-gcode-

[back to package description]

Juicy-gcode: A lightweight 2.5D SVG to GCode converter for maximal curve fitting

Hackage Appveyor


Juicy-GCode is a command-line application that converts SVG files to GCode. It provides flexible options for curve approximation and allows configurable GCode generation based on color information.


  • Configurable Curve Approximation: Juicy-GCode offers three approximation methods to suit your needs
    • with biarcs for maximal curve fitting: bezier curves are approximated with arcs (G2, G3 commands), the resulting path is G1 continuous
    • with linear approximation when arcs are not supported by your firmware: bezier curves are approximated with line segments (G0, G1 commands), the resulting path is not smooth, and the generated GCode is usually significantly larger
    • with cubic bezier curves if your firmware supports it: some firmwares (e.g. Marlin) can handle bezier curves directly (G5 command), the result is G2 continuous
  • Configurable 2.5D GCode generation: Juicy-GCode allows you to configure the GCode generation by color information (this feature enables e.g. carving of 3D objects based on a single SVG file)
    • extra GCode can be added to the beginning of a continous colored path
    • GCode parameters e.g. E, F or S can be set per color
    • the number of passes can be set for a given color (upcoming feature)


The easiest way is to download one of the prebuilt binaries from the releases page. Alternatively, you can build from source code as follows:

  • Install Stack if you do not have it yet
  • $ git clone https://github.com/domoszlai/juicy-gcode.git
  • $ stack build
  • $ stack install
  • $ juicy-gcode --help


⚠️ Breaking change: Since version, the flavor file format changed to YAML. If you use a pre 1.0 version, please refer to this historical README file

⚠️ Breaking change: Since version, --generate-bezier has been removed in favor of the more generic --curve-fitting parameter and --resolution has been renamed to --tolerance

⚠️ Breaking change: Since version, default DPI is changed to 96 and the option to mirror the Y axis is removed (it is always mirrored now for correct result)

The easier way to use juicy-gcode is to simply provide an SVG file name. The generated GCode will be written to standard output. The default approximation method is the biarcs based.

$ juicy-gcode SVGFILE

Alternativly, you can provide an output file name as well.

$ juicy-gcode SVGFILE -o OUTPUT

Sometimes you want to overwrite some default settings. These are the

  • --dpi (default 96 DPI) the resolution of the SVG file that is used to determine the size of the SVG when it does not contain explicit units
  • --tolerance (default is 0.1 mm) maximum allowed deviation of the approximation curve
$ juicy-gcode SVGFILE --dpi 72 --tolerance 0.01 

Curve fitting options (default is biarc):

$ juicy-gcode SVGFILE --curve-fitting=biarc
$ juicy-gcode SVGFILE --curve-fitting=linear
$ juicy-gcode SVGFILE --curve-fitting=cubic-bezier


The generated GCode is highly dependent on the actual device it will be executed by and one might also want to generate different GCode for different colors. In juicy-gcode these settings are called GCode flavor and consist of the following:

  • Begin GCode routine (commands that are executed before the actual print job)
  • End GCode routine (commands that are executed after the actual print job)
  • Tool on (commands to switch the tool on, e.g. lower the pen)
  • Tool off (commands to switch the tool off e.g. lift the pen)
  • Color dependent settings

These settings can be provided by a YAML configuration file. The default settings are made for being able to test the generated GCode in an emulator e.g. with LaserWeb or my hanging plotter simulator.

begin: |
  G0 Z1
  G0 X0 Y0
end: |
  G0 Z1
toolon: |
  G01 Z0 F10.00
tooloff: |
  G00 Z1

By providing your own configuration file, you can also specify color dependent settings. As an example, the following configuration adds extra GCode configuration for the color codes #000000 and #FF0000.

      before: |
        ; black
      passes: 1
        F: 1.0 
        S: 80
      before: |
        ; red
      passes: 1
        F: 2.0 
        S: 25

In this example, GCode comments will be generated before any continous red or black path, the F and S GCode parameters are set different for red and black paths (and not set for any other colors) and the number of passes are set to 1 for both colors (passes is an upcoming feature, currently this option is ignored)

Use the -f option to pass the GCode flavor to juicy-gcode:

$ juicy-gcode SVGFILE -f FLAVORFILE


SVG features that are not supported:

  • texts
  • filling
  • clipping
  • images