There's a relatively straightforward trick that you can do here. If you've got a transform that turns a circle into an ellipse with the relative radii and orientation that you want, then:
1. Apply the inverse of that transform to your path.
2. Stroke the path.
3. Apply the transform to the result.
This way, the path stays in place but the stroke is transformed to give it a calligraphic look.
With a JavaScript Canvas, you can just set the transform after defining the path, but before stroking. JSFiddle example: [0].
(This was something that I tested in my tiny, single-header <canvas>-like 2D rasterizer library for C++ and my Javascript port of its test suite [1].)
For Inkscape, I think you can convert an object to a path, apply the inverse transform, do a minimal simplification to bake the transform into the path, stroke it, and then apply the forward transform. It's a bit clumsy, but I bet someone could easily create an extension script to do it.
To elaborate on the earlier point about Illustrator from amelius.
Illustrator's stroke control is a touch more advanced than most people are aware in that there is full control over the width of the stroke at any point on the line and that includes the ability to independently adjust the width on either side of the path.
That's especially useful for emulating handwork or script without forcing the object into a less editable format such as a filled shape.
The black thin line is a basic stroke to visualise the path. The light blue area is the stroke with edits to the stroke width showing how each side of the path can be controlled independently. I have kept the tool selection active such that a wireframe overlay is visible to help demonstrate how the stroke width is different on either side of the line.
The last area in the graphic is the pink area. The pink is another stroke applied to the same path. In fact all 3 strokes you see are all attached to one path. Illustrator allows a path to carry multiple strokes, and those stroke profiles be independent from one another.
Side note: This stroke-width information can then be applied to other strokes, and also saved for later use. (Handy if you want a custom swash pack.)
1. Apply the inverse of that transform to your path.
2. Stroke the path.
3. Apply the transform to the result.
This way, the path stays in place but the stroke is transformed to give it a calligraphic look.
With a JavaScript Canvas, you can just set the transform after defining the path, but before stroking. JSFiddle example: [0].
(This was something that I tested in my tiny, single-header <canvas>-like 2D rasterizer library for C++ and my Javascript port of its test suite [1].)
For Inkscape, I think you can convert an object to a path, apply the inverse transform, do a minimal simplification to bake the transform into the path, stroke it, and then apply the forward transform. It's a bit clumsy, but I bet someone could easily create an extension script to do it.
[0] https://jsfiddle.net/y7m16wa0/
[1] https://github.com/a-e-k/canvas_ity/blob/main/test/test.cpp#..., https://github.com/a-e-k/canvas_ity/blob/main/test/test.html...