diff --git a/test/real_world/README.md b/test/real_world/README.md
new file mode 100644
index 000000000..ba79e808d
--- /dev/null
+++ b/test/real_world/README.md
@@ -0,0 +1,119 @@
+### Variables
+| Name | Type |
+|------|------|
+| AppVersion | `string` |
+| CleanMarker | `string` |
+| CountryCode | `string` |
+| CurrencyCode | `string` |
+| DestinationCountry | `string` |
+| Features | [UserAgentFeatures](#UserAgentFeatures) |
+| GateID | `int` |
+| InitializedAt | `int` |
+| IsAffiliate | `bool` |
+| IsDesktop | `bool` |
+| IsMobile | `bool` |
+| IsOpenJaw | `bool` |
+| KnowEnglish | `bool` |
+| Locale | `string` |
+| Marker | `string` |
+| Market | `string` |
+| OriginCountry | `string` |
+| Os | `string` |
+| OsVersion | `string` |
+| Passengers | [Passengers](#Passengers) |
+| Random | `float` |
+| ReferrerHost | `string` |
+| SearchDepth | `int` |
+| SearchParamsEnv | [SearchParamsEnv](#SearchParamsEnv) |
+| Segments | array([RouteSegment](#RouteSegment)) |
+| TravelPayoutsAPI | `bool` |
+| TripClass | `string` |
+| UserAgentDevice | `string` |
+| UserAgentType | `string` |
+| UserIP | `string` |
+| false | `bool` |
+| true | `bool` |
+
+### Functions
+| Name | Return type |
+|------|-------------|
+| all(array(`any`), `func`) | `bool` |
+| any(array(`any`), `func`) | `bool` |
+| count(array(`any`), `func`) | `int` |
+| filter(array(`any`), `func`) | array(`any`) |
+| len(array(`any`)) | `int` |
+| map(array(`any`), `func`) | array(`any`) |
+| none(array(`any`), `func`) | `bool` |
+| one(array(`any`), `func`) | `bool` |
+
+### Types
+#### DirectFlightsDays
+| Field | Type |
+|---|---|
+| Days | `string` |
+| Start | `string` |
+
+#### Passengers
+| Field | Type |
+|---|---|
+| Adults | `int` |
+| Children | `int` |
+| Infants | `int` |
+
+#### RouteSegment
+| Field | Type |
+|---|---|
+| Date | `string` |
+| Destination | `string` |
+| DestinationCountry | `string` |
+| DestinationName | `string` |
+| DirectFlightsDays | [DirectFlightsDays](#DirectFlightsDays) |
+| Origin | `string` |
+| OriginCountry | `string` |
+| OriginName | `string` |
+| TranslatedDestination | `string` |
+| TranslatedOrigin | `string` |
+| UserDestination | `string` |
+| UserOrigin | `string` |
+
+#### SearchParamsEnv
+| Field | Type |
+|---|---|
+| AppVersion | `string` |
+| CleanMarker | `string` |
+| CountryCode | `string` |
+| CurrencyCode | `string` |
+| DestinationCountry | `string` |
+| Features | [UserAgentFeatures](#UserAgentFeatures) |
+| GateID | `int` |
+| InitializedAt | `int` |
+| IsAffiliate | `bool` |
+| IsDesktop | `bool` |
+| IsMobile | `bool` |
+| IsOpenJaw | `bool` |
+| KnowEnglish | `bool` |
+| Locale | `string` |
+| Marker | `string` |
+| Market | `string` |
+| OriginCountry | `string` |
+| Os | `string` |
+| OsVersion | `string` |
+| Passengers | [Passengers](#Passengers) |
+| Random | `float` |
+| ReferrerHost | `string` |
+| SearchDepth | `int` |
+| Segments | array([RouteSegment](#RouteSegment)) |
+| TravelPayoutsAPI | `bool` |
+| TripClass | `string` |
+| UserAgentDevice | `string` |
+| UserAgentType | `string` |
+| UserIP | `string` |
+
+#### UserAgentFeatures
+| Field | Type |
+|---|---|
+| Assisted | `bool` |
+| TopPlacement | `bool` |
+| TourTickets | `bool` |
+
+
diff --git a/test/real_world/real_docs/generate.go b/test/real_world/real_docs/generate.go
new file mode 100644
index 000000000..88a14099f
--- /dev/null
+++ b/test/real_world/real_docs/generate.go
@@ -0,0 +1,14 @@
+package main
+
+import (
+	"fmt"
+
+	"github.com/antonmedv/expr/docgen"
+	"github.com/antonmedv/expr/test/real_world"
+)
+
+func main() {
+	doc := docgen.CreateDoc(real_world.NewEnv())
+
+	fmt.Println(doc.Markdown())
+}
diff --git a/test/real_world/real_world.go b/test/real_world/real_world.go
index 1fc61b539..445e0a4ce 100644
--- a/test/real_world/real_world.go
+++ b/test/real_world/real_world.go
@@ -1,5 +1,7 @@
 package real_world
 
+//go:generate sh -c "go run ./real_docs/generate.go > README.md"
+
 type DirectFlightsDays struct {
 	Start string
 	Days  string