tldr: Ensure all your curves have two handles if exporting .svg from Illustrator for use in Cricut Design space; Or, if your design is too complex to fix by hand, open your .ai file in Inkscape and re-export to .svg

I recently started a post about recreating Loki’s TVA Variant jacket. In the process of doing so I found a bug in Cricut Design Space’s .svg rendering which may be of interest to others, and has apparently been an issue since 2016:

In Illustrator you can create a shape that only has either one single handle or two handles at each anchor point.

Handle lines are faint blue here but hopefully you can see them:

This image, when exported to .svg, renders correctly in the system’s image preview, and in Chrome.

However when this image is uploaded to Cricut Design Space, you’ll notice that the single-handled football shape on the right is warped. What gives?!

For those of you who are encountering the same problem with your Cricut and just want to know how to fix it, the answer is: ensure every single curve has two handles - one on each end.

…but if you’re still here, let’s talk a little more about what is happening!

A Bezier curve can have 2, 3, or 4 control points:

Illustrator’s pen tool constructs Bezier curves. These control points are your anchor points and handle ends.

A quadratic Bezier is defined by two end points and one control handle.

A cubic Bezier is defined by two end points and two control handles.

I haven’t been able to confirm this with anyone at Adobe, but this means that a curve drawn with the pen tool which has only one control handle is either:

Note that a) can be a special case of b), since all quadratic Bezier curves can be represented as cubic ones.

This then leads to the interesting question: why does Cricut Design Space render the output .svg differently from Illustrator, Chrome, or the system preview?

Let’s look at a simpler .svg for a clue:

Here’s how it looks in most systems on the left (Illustrator, Chrome, Mac system preview), vs Cricut Design Space on the right:

Notice that the double-handled eye (the right-most one) is the only one that matches.

And here is the .svg code of the file. I’ve formatted it to make it a bit easier to read:

<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 441.284 92.518"><defs><style>.cls-1{fill:#fff;stroke:#231f20;stroke-miterlimit:10;}</style></defs>

<path class="cls-1" d="
M 40.36,36.033
S 97.8-5.075,150.169,33.78
C 150.169,33.78,102.867,79.956,40.36,36.033
Z "/>

<path class="cls-1" d="
M 179.614,32.212
s 61.945-37.251,109.66,1.256
C 241.559,71.137,179.614,32.212,179.614,32.212
Z "/>

<path class="cls-1" d="
M 309.022,38.909
c 25.873-22.6,61.945-37.251,109.659,1.255
C 370.967,77.833,332.384,64.021,309.022,38.909
Z"/>

</svg>


If we consult the W3 documentation, we can see that S and s are shorthand formats for cubic Bezier curves which require only one control point to be explicitly stated, and then make assumptions about the other control based on what came previously:

It seems logical to conclude that Cricut Design Space must be handling the assumptions for S and s curves differently when only one handle is specified in the export, resulting in line curvatures which can be dramatically different from what was intended.

Someone on Reddit found a nice way to solve this: if you don’t want to fix your design by hand (which can be very time consuming), you can load your .ai file into Inkscape (freeware), and export to .svg again. Inkscape’s export uses only M and C commands, bypassing the issue with S commands being rendered incorrectly in Design Space:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
version="1.1"
id="svg578"
xml:space="preserve"
width="816"
height="176.87868"
viewBox="0 0 816 176.87868"
sodipodi:docname="example_eyes-inkscape-inkscape.svg"
inkscape:version="1.1 (c4e8f9e, 2021-05-24)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs582"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath592"><path
d="M 0,132.659 H 612 V 0 H 0 Z"
id="path590" /></clipPath></defs><sodipodi:namedview
id="namedview580"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1.4007353"
inkscape:cx="408"
inkscape:cy="88.167979"
inkscape:window-width="1312"
inkscape:window-height="847"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="g584" /><g
id="g584"
inkscape:groupmode="layer"
inkscape:label="example_eyes"
transform="matrix(1.3333333,0,0,-1.3333333,0,176.87867)"><g
id="g586"><g
id="g588"
clip-path="url(#clipPath592)"><g
id="g594"
transform="translate(38.7471,72.1427)"><path
d="M 0,0 C 0,0 94.506,61.539 162.638,-1.099 162.638,-1.099 89.011,-58.242 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path596" /></g><g
id="g598"
transform="translate(38.7471,72.1427)"><path
d="M 0,0 C 0,0 94.506,61.539 162.638,-1.099 162.638,-1.099 89.011,-58.242 0,0 Z"
style="fill:none;stroke:#231f20;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path600" /></g><g
id="g602"
transform="translate(229.9561,74.3405)"><path
d="M 0,0 C 0,0 94.506,54.945 148.352,-4.396 116.483,-42.857 25.275,-31.868 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path604" /></g><g
id="g606"
transform="translate(229.9561,74.3405)"><path
d="M 0,0 C 0,0 94.506,54.945 148.352,-4.396 116.483,-42.857 25.275,-31.868 0,0 Z"
style="fill:none;stroke:#231f20;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path608" /></g><g
id="g610"
transform="translate(396.9893,66.6481)"><path
d="M 0,0 C 35.165,39.561 114.285,50.55 163.736,-2.198 129.67,-32.967 42.856,-46.154 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path612" /></g><g
id="g614"
transform="translate(396.9893,66.6481)"><path
d="M 0,0 C 35.165,39.561 114.285,50.55 163.736,-2.198 129.67,-32.967 42.856,-46.154 0,0 Z"
style="fill:none;stroke:#231f20;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path616" /></g></g></g></g></svg>


If you want to explore all this yourself, I’ve uploaded example files here.

I’ve reached out to the Cricut support team for comment. In the meantime, I hope you’ve found this informative - or at least helpful. :)