diff --git a/pages/docs/tutorials/getting-started/hello-world-receive-message.md b/pages/docs/tutorials/getting-started/hello-world-receive-message.md
new file mode 100644
index 000000000000..c91398315291
--- /dev/null
+++ b/pages/docs/tutorials/getting-started/hello-world-receive-message.md
@@ -0,0 +1,120 @@
+---
+title: "Receive 'Hello world' message"
+weight: 35
+---
+
+Let's define an application that's capable of receiving a `"hello {name}"` message:
+
+
+{`asyncapi: 3.0.0
+info:
+ title: Hello world application
+ version: '0.1.0'
+channels:
+ hello:
+ address: 'hello'
+ messages:
+ sayHelloMessage:
+ payload:
+ type: string
+ pattern: '^hello .+$'
+operations:
+ receiveHello:
+ action: 'receive'
+ channel:
+ $ref: '#/channels/hello'`}
+
+
+Let's get into the details of this sample AsyncAPI document:
+
+
+{`asyncapi: 3.0.0
+info:
+ title: Hello world application
+ version: '0.1.0'
+channels:
+ hello:
+ address: 'hello'
+ messages:
+ sayHelloMessage:
+ payload:
+ type: string
+ pattern: '^hello .+$'
+operations:
+ receiveHello:
+ action: 'receive'
+ channel:
+ $ref: '#/channels/hello'`}
+
+
+The first line of the specification starts with the document type `asyncapi` and the version (3.0.0). That line doesn't have to be the first one, but it's a best practice.
+
+
+{`asyncapi: 3.0.0
+info:
+ title: Hello world application
+ version: '0.1.0'
+channels:
+ hello:
+ address: 'hello'
+ messages:
+ sayHelloMessage:
+ payload:
+ type: string
+ pattern: '^hello .+$'
+operations:
+ receiveHello:
+ action: 'receive'
+ channel:
+ $ref: '#/channels/hello'`}
+
+
+The `info` object contains the minimum required information about the application. It contains the `title`, which is a memorable name for the API, and the `version`. While it's not mandatory, it's strongly recommended to change the version whenever you make changes to the API.
+
+
+{`asyncapi: 3.0.0
+info:
+ title: Hello world application
+ version: '0.1.0'
+channels:
+ hello:
+ address: 'hello'
+ messages:
+ sayHelloMessage:
+ payload:
+ type: string
+ pattern: '^hello .+$'
+operations:
+ receiveHello:
+ action: 'receive'
+ channel:
+ $ref: '#/channels/hello'`}
+
+
+The `channels` section of the specification houses all of the mediums where messages flow through. For example, some systems use `topic`, `event name` or `routing key`. Different kinds of information flow through each channel similar to the analogy of TV channels.
+
+You only have one channel called `hello`, and you see what message is available in this channel and how it must be structured. The `payload` object defines that the message must be a string and match the given regular expression in a string format such as `hello {name}`.
+
+
+{`asyncapi: 3.0.0
+info:
+ title: Hello world application
+ version: '0.1.0'
+channels:
+ hello:
+ address: 'hello'
+ messages:
+ sayHelloMessage:
+ payload:
+ type: string
+ pattern: '^hello .+$'
+operations:
+ receiveHello:
+ action: 'receive'
+ channel:
+ $ref: '#/channels/hello'`}
+
+
+The `operations` section is where you describe what the application is doing. Each operation has a unique identifier for example, `receiveHello`.
+
+In the above example, you see that the `Hello world application` is a consumer listening to the `sayHelloMessage` message from the `hello` channel. In other words, you can say that the `Hello world application` subscribes to the `hello` topic to `receive` the `sayHelloMessage` message. That AsyncAPI document describes what the `Hello world application` is doing, not what others can do with it.
diff --git a/pages/docs/tutorials/getting-started/hello-world-send-message.md b/pages/docs/tutorials/getting-started/hello-world-send-message.md
new file mode 100644
index 000000000000..0a1d7878e594
--- /dev/null
+++ b/pages/docs/tutorials/getting-started/hello-world-send-message.md
@@ -0,0 +1,120 @@
+---
+title: "Send 'Hello world' message"
+weight: 30
+---
+
+Let's define an application that's capable of sending a `"hello {name}"` message:
+
+
+{`asyncapi: 3.0.0
+info:
+ title: Hello world application
+ version: '0.1.0'
+channels:
+ hello:
+ address: 'hello'
+ messages:
+ sayHelloMessage:
+ payload:
+ type: string
+ pattern: '^hello .+$'
+operations:
+ sendHello:
+ action: 'send'
+ channel:
+ $ref: '#/channels/hello'`}
+
+
+Let's get into the details of this sample AsyncAPI document:
+
+
+{`asyncapi: 3.0.0
+info:
+ title: Hello world application
+ version: '0.1.0'
+channels:
+ hello:
+ address: 'hello'
+ messages:
+ sayHelloMessage:
+ payload:
+ type: string
+ pattern: '^hello .+$'
+operations:
+ sendHello:
+ action: 'send'
+ channel:
+ $ref: '#/channels/hello'`}
+
+
+The first line of the specification starts with the document type `asyncapi` and the version (3.0.0). That line doesn't have to be the first one, but it's a best practice.
+
+
+{`asyncapi: 3.0.0
+info:
+ title: Hello world application
+ version: '0.1.0'
+channels:
+ hello:
+ address: 'hello'
+ messages:
+ sayHelloMessage:
+ payload:
+ type: string
+ pattern: '^hello .+$'
+operations:
+ sendHello:
+ action: 'send'
+ channel:
+ $ref: '#/channels/hello'`}
+
+
+The `info` object contains the minimum required information about the application. It contains the `title`, which is a memorable name for the API, and the `version`. While it's not mandatory, it's strongly recommended to change the version whenever you make changes to the API.
+
+
+{`asyncapi: 3.0.0
+info:
+ title: Hello world application
+ version: '0.1.0'
+channels:
+ hello:
+ address: 'hello'
+ messages:
+ sayHelloMessage:
+ payload:
+ type: string
+ pattern: '^hello .+$'
+operations:
+ sendHello:
+ action: 'send'
+ channel:
+ $ref: '#/channels/hello'`}
+
+
+The `channels` section of the specification houses all of the mediums where messages flow through. For example, some systems use `topic`, `event name` or `routing key`. Different kinds of information flow through each channel similar to the analogy of TV channels.
+
+You only have one channel called `hello`, and you see what message is available in this channel and how it must be structured. The `payload` object defines that the message must be a string and match the given regular expression in a string format such as `hello {name}`.
+
+
+{`asyncapi: 3.0.0
+info:
+ title: Hello world application
+ version: '0.1.0'
+channels:
+ hello:
+ address: 'hello'
+ messages:
+ sayHelloMessage:
+ payload:
+ type: string
+ pattern: '^hello .+$'
+operations:
+ sendHello:
+ action: 'receive'
+ channel:
+ $ref: '#/channels/hello'`}
+
+
+The `operations` section is where you describe what the application is doing. Each operation has a unique identifier for example, `sendHello`.
+
+In the above example, you see that the `Hello world application` is a producer sending the `sayHelloMessage` message from the `hello` channel. In other words, you can say that the `Hello world application` publishes the `hello` topic to `send` the `sayHelloMessage` message. That AsyncAPI document describes what the `Hello world application` is doing, not what others can do with it.