diff --git a/docs/reference/gsk/gsk4.toml.in b/docs/reference/gsk/gsk4.toml.in
index 0418481f85..e451183ba8 100644
--- a/docs/reference/gsk/gsk4.toml.in
+++ b/docs/reference/gsk/gsk4.toml.in
@@ -34,5 +34,11 @@ base_url = "https://gitlab.gnome.org/GNOME/gtk/-/blob/main/"
[extra]
content_images = [
"gtk-logo.svg",
+ "images/caps-dark.png",
+ "images/caps-light.png",
+ "images/join-dark.png",
+ "images/join-light.png",
+ "images/path-dark.png",
+ "images/path-light.png",
]
urlmap_file = "urlmap.js"
diff --git a/docs/reference/gsk/images/caps-dark.png b/docs/reference/gsk/images/caps-dark.png
new file mode 100644
index 0000000000..2280df2b58
Binary files /dev/null and b/docs/reference/gsk/images/caps-dark.png differ
diff --git a/docs/reference/gsk/images/caps-light.png b/docs/reference/gsk/images/caps-light.png
new file mode 100644
index 0000000000..1dded2ea42
Binary files /dev/null and b/docs/reference/gsk/images/caps-light.png differ
diff --git a/docs/reference/gsk/images/caps.svg b/docs/reference/gsk/images/caps.svg
new file mode 100644
index 0000000000..0fd0a1aa44
--- /dev/null
+++ b/docs/reference/gsk/images/caps.svg
@@ -0,0 +1,81 @@
+
+
+
+
diff --git a/docs/reference/gsk/images/join-dark.png b/docs/reference/gsk/images/join-dark.png
new file mode 100644
index 0000000000..dae0e77030
Binary files /dev/null and b/docs/reference/gsk/images/join-dark.png differ
diff --git a/docs/reference/gsk/images/join-light.png b/docs/reference/gsk/images/join-light.png
new file mode 100644
index 0000000000..0332ad315b
Binary files /dev/null and b/docs/reference/gsk/images/join-light.png differ
diff --git a/docs/reference/gsk/images/join.svg b/docs/reference/gsk/images/join.svg
new file mode 100644
index 0000000000..6801d13db3
--- /dev/null
+++ b/docs/reference/gsk/images/join.svg
@@ -0,0 +1,72 @@
+
+
+
+
diff --git a/docs/reference/gsk/images/path-dark.png b/docs/reference/gsk/images/path-dark.png
new file mode 100644
index 0000000000..b8295d5f18
Binary files /dev/null and b/docs/reference/gsk/images/path-dark.png differ
diff --git a/docs/reference/gsk/images/path-light.png b/docs/reference/gsk/images/path-light.png
new file mode 100644
index 0000000000..a8a53ce39d
Binary files /dev/null and b/docs/reference/gsk/images/path-light.png differ
diff --git a/docs/reference/gsk/images/path.svg b/docs/reference/gsk/images/path.svg
new file mode 100644
index 0000000000..d07c116d5f
--- /dev/null
+++ b/docs/reference/gsk/images/path.svg
@@ -0,0 +1,108 @@
+
+
+
+
diff --git a/gsk/gskenums.h b/gsk/gskenums.h
index f2336fe40e..9ed0ee077e 100644
--- a/gsk/gskenums.h
+++ b/gsk/gskenums.h
@@ -220,6 +220,11 @@ typedef enum {
*
* The default line cap style is `GSK_LINE_CAP_BUTT`.
*
+ *
+ *
+ *
+ *
+ *
* New entries may be added in future versions.
*
* Since: 4.14
@@ -242,6 +247,11 @@ typedef enum {
*
* The default line join style is `GSK_LINE_JOIN_MITER`.
*
+ *
+ *
+ *
+ *
+ *
* New entries may be added in future versions.
*
* Since: 4.14
diff --git a/gsk/gskpath.c b/gsk/gskpath.c
index 2a1cbfd530..a59516caa3 100644
--- a/gsk/gskpath.c
+++ b/gsk/gskpath.c
@@ -30,19 +30,25 @@
* GskPath:
*
* A `GskPath` describes lines and curves that are more complex
- * than simple rectangles. Paths can used for rendering (filling or
- * stroking) and for animations (e.g. as trajectories).
+ * than simple rectangles.
+ *
+ * Paths can used for rendering (filling or stroking) and for animations
+ * (e.g. as trajectories).
*
* `GskPath` is an immutable, opaque, reference-counted struct.
- * After creation, you cannot change the types it represents.
- * Instead, new `GskPath` objects have to be created.
- *
- * The [struct@Gsk.PathBuilder] structure is meant to help in this endeavor.
+ * After creation, you cannot change the types it represents. Instead,
+ * new `GskPath` objects have to be created. The [struct@Gsk.PathBuilder]
+ * structure is meant to help in this endeavor.
*
* Conceptually, a path consists of zero or more contours (continous, connected
* curves), each of which may or may not be closed. Contours are typically
* constructed from Bézier segments.
*
+ *
+ *
+ *
+ *
+ *
* Since: 4.14
*/
@@ -1007,6 +1013,22 @@ parse_circle (const char **p,
* [SVG path syntax](https://www.w3.org/TR/SVG11/paths.html#PathData),
* as e.g. produced by [method@Gsk.Path.to_string].
*
+ * A high-level summary of the syntax:
+ *
+ * - `M x y` Move to `(x, y)`
+ * - `L x y` Add a line from the current point to `(x, y)`
+ * - `Q x1 y1 x2 y2` Add a quadratic Bézier from the current point to `(x2, y2)`, with control point `(x1, y1)`
+ * - `C x1 y1 x2 y2 x3 y3` Add a cubic Bézier from the current point to `(x3, y3)`, with control points `(x1, y1)` and `(x2, y2)`
+ * - `Z` Close the contour by drawing a line back to the start point
+ * - `H x` Add a horizontal line from the current point to the given x value
+ * - `V y` Add a vertical line from the current point to the given y value
+ * - `T x2 y2` Add a quadratic Bézier, using the reflection of the previous segments' control point as control point
+ * - `S x2 y2 x3 y3` Add a cubic Bézier, using the reflection of the previous segments' second control point as first control point
+ * - `A rx ry r l s x y` Add an elliptical arc from the current point to `(x, y)` with radii rx and ry. See the SVG documentation for how the other parameters influence the arc.
+ *
+ * All the commands have lowercase variants that interpret coordinates
+ * relative to the current point.
+ *
* Returns: (nullable): a new `GskPath`, or `NULL`
* if @string could not be parsed
*
diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c
index d33b796275..394801ce0b 100644
--- a/gsk/gskrendernodeimpl.c
+++ b/gsk/gskrendernodeimpl.c
@@ -4375,8 +4375,8 @@ gsk_rounded_clip_node_get_clip (const GskRenderNode *node)
/**
* GskFillNode:
*
- * A render node filling the child node in the area given by [struct@Gsk.Path]
- * and [enum@Gsk.FillRule].
+ * A render node filling the area given by [struct@Gsk.Path]
+ * and [enum@Gsk.FillRule] with the child node.
*
* Since: 4.14
*/
@@ -4584,8 +4584,8 @@ gsk_fill_node_get_fill_rule (const GskRenderNode *node)
/**
* GskStrokeNode:
*
- * A render node that will stroke the child node along the given [struct@Gsk.Path]
- * using the [struct@Gsk.Stroke] attributes.
+ * A render node that will fill the area determined by stroking the the given
+ * [struct@Gsk.Path] using the [struct@Gsk.Stroke] attributes.
*
* Since: 4.14
*/
@@ -4688,8 +4688,10 @@ gsk_stroke_node_class_init (gpointer g_class,
* @path: (transfer none): The path describing the area to stroke
* @stroke: (transfer none): The stroke attributes to use
*
- * Creates a #GskRenderNode that will stroke the @child along the given
- * @path using the attributes defined in @stroke.
+ * Creates a #GskRenderNode that will fill the outline generated by stroking
+ * the given @path using the attributes defined in @stroke.
+ *
+ * The area is filled with @child.
*
* Returns: (transfer none) (type GskStrokeNode): A new #GskRenderNode
*