diff --git a/doc/docs.md b/doc/docs.md
index 0a2b610081..b35669f58d 100644
--- a/doc/docs.md
+++ b/doc/docs.md
@@ -86,6 +86,7 @@ For more details and troubleshooting, please visit the [vab GitHub repository](h
+* [Unions](#unions)
* [Functions 2](#functions-2)
* [Pure functions by default](#pure-functions-by-default)
* [Mutable arguments](#mutable-arguments)
@@ -1587,6 +1588,45 @@ In this example, the `can_register` method has a receiver of type `User` named `
The convention is not to use receiver names like `self` or `this`,
but a short, preferably one letter long, name.
+## Unions
+
+Just like structs, unions support embedding.
+
+```v
+struct Rgba32_Component {
+ r byte
+ g byte
+ b byte
+ a byte
+}
+
+union Rgba32 {
+ Rgba32_Component
+ value u32
+}
+
+clr1 := Rgba32{
+ value: 0x008811FF
+}
+
+clr2 := Rgba32{
+ Rgba32_Component: {
+ a: 128
+ }
+}
+
+sz := sizeof(Rgba32)
+unsafe {
+ println('Size: ${sz}B,clr1.b: $clr1.b,clr2.b: $clr2.b')
+}
+```
+
+Output: `Size: 4B, clr1.b: 136, clr2.b: 0`
+
+Union member access must be performed in an `unsafe` block.
+
+Note that the embedded struct arguments are not necessarily stored in the order listed.
+
## Functions 2
### Pure functions by default
|