chore: update RDP modules display names, icon and docs (#175)

This commit is contained in:
Atif Ali
2025-07-06 16:42:33 +05:00
committed by GitHub
parent eb27843e4a
commit 6b9d0d4803
16 changed files with 77 additions and 72 deletions
+35
View File
@@ -0,0 +1,35 @@
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" fill="none" viewBox="0 0 512 512">
<g transform="translate(256 256)scale(8.96)">
<linearGradient id="a" x1="6.221" x2="37.408" y1="6.221" y2="37.408" gradientUnits="userSpaceOnUse">
<stop offset="0%" style="stop-color:#f0f0f0;stop-opacity:1"/>
<stop offset="100%" style="stop-color:#bbc1c4;stop-opacity:1"/>
</linearGradient>
<path d="M24 5C13.507 5 5 13.507 5 24s8.507 19 19 19 19-8.507 19-19S34.493 5 24 5" style="stroke:none;stroke-width:1;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:url(#a);fill-rule:nonzero;opacity:1" transform="translate(-24 -24)"/>
</g>
<g transform="translate(256 256)scale(8.96)">
<linearGradient id="b" x1="12.859" x2="35.224" y1="12.859" y2="35.224" gradientUnits="userSpaceOnUse">
<stop offset="0%" style="stop-color:#e04f12;stop-opacity:1"/>
<stop offset="61.5%" style="stop-color:#ce400d;stop-opacity:1"/>
<stop offset="100%" style="stop-color:#c03409;stop-opacity:1"/>
</linearGradient>
<path d="M24 40c8.837 0 16-7.163 16-16S32.837 8 24 8 8 15.163 8 24s7.163 16 16 16" style="stroke:none;stroke-width:1;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:url(#b);fill-rule:nonzero;opacity:1" transform="translate(-24 -24)"/>
</g>
<path d="m30.414 20 3.89-3.89c.708-.708.449-1.772 0-2.221l-2.195-2.195a1.573 1.573 0 0 0-2.218.001l-7.194 7.194c-.549.549-.752 1.469-.001 2.22l7.196 7.196c.76.76 1.592.625 2.218-.001l2.194-2.194c.707-.707.716-1.505.001-2.22z" style="stroke:none;stroke-width:1;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#000;fill-rule:nonzero;opacity:.05" transform="translate(40.96 40.96)scale(8.96)"/>
<path d="m33.951 14.244-2.195-2.195a1.07 1.07 0 0 0-1.511 0l-7.195 7.195c-.386.386-.487 1.025 0 1.512l7.196 7.196c.491.491 1.087.424 1.511 0l2.195-2.195c.464-.464.469-1.044 0-1.512L29.707 20l4.244-4.244c.465-.465.335-1.177 0-1.512" style="stroke:none;stroke-width:1;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#000;fill-rule:nonzero;opacity:.07" transform="translate(40.96 40.96)scale(8.96)"/>
<path d="m17.586 28-3.89 3.89c-.708.708-.449 1.772 0 2.221l2.195 2.195c.611.609 1.606.61 2.218-.001l7.194-7.194c.549-.549.752-1.469.001-2.22l-7.196-7.196c-.76-.76-1.592-.625-2.218.001l-2.194 2.194c-.707.707-.716 1.505-.001 2.22z" style="stroke:none;stroke-width:1;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#000;fill-rule:nonzero;opacity:.05" transform="translate(40.96 40.96)scale(8.96)"/>
<path d="m14.049 33.756 2.195 2.195a1.07 1.07 0 0 0 1.511 0l7.195-7.195c.386-.386.487-1.025 0-1.512l-7.196-7.196c-.491-.491-1.087-.424-1.511 0l-2.195 2.195c-.464.464-.469 1.044 0 1.512L18.293 28l-4.244 4.244c-.465.465-.335 1.177 0 1.512" style="stroke:none;stroke-width:1;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#000;fill-rule:nonzero;opacity:.07" transform="translate(40.96 40.96)scale(8.96)"/>
<g transform="translate(296.83 220.16)scale(8.96)">
<linearGradient id="c" x1="23.755" x2="38.564" y1="9.93" y2="33.557" gradientUnits="userSpaceOnUse">
<stop offset="0%" style="stop-color:#fcfcfc;stop-opacity:1"/>
<stop offset="100%" style="stop-color:#c3c9cd;stop-opacity:1"/>
</linearGradient>
<path d="m33.598 14.598-2.196-2.196a.57.57 0 0 0-.804 0l-7.196 7.196a.57.57 0 0 0 0 .804l7.196 7.196a.57.57 0 0 0 .804 0l2.196-2.196a.57.57 0 0 0 0-.804L29 20l4.598-4.598a.57.57 0 0 0 0-.804" style="stroke:none;stroke-width:1;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:url(#c);fill-rule:nonzero;opacity:1" transform="translate(-28.5 -20)"/>
</g>
<g transform="translate(215.17 291.84)scale(8.96)">
<linearGradient id="d" x1="11.438" x2="26.247" y1="17.637" y2="41.265" gradientUnits="userSpaceOnUse">
<stop offset="0%" style="stop-color:#fcfcfc;stop-opacity:1"/>
<stop offset="100%" style="stop-color:#c3c9cd;stop-opacity:1"/>
</linearGradient>
<path d="M14.402 23.402 19 28l-4.598 4.598a.57.57 0 0 0 0 .804l2.196 2.196a.57.57 0 0 0 .804 0l7.196-7.196a.57.57 0 0 0 0-.804l-7.196-7.196a.57.57 0 0 0-.804 0l-2.196 2.196a.57.57 0 0 0 0 .804" style="stroke:none;stroke-width:1;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:url(#d);fill-rule:nonzero;opacity:1" transform="translate(-19.5 -28)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

+3 -7
View File
@@ -14,9 +14,7 @@ brew install go
sudo apt install golang-go sudo apt install golang-go
``` ```
## Daily Tasks ## Reviewing a PR
### Review PRs
Check that PRs have: Check that PRs have:
@@ -26,7 +24,7 @@ Check that PRs have:
- [ ] Formatted code (`bun run fmt`) - [ ] Formatted code (`bun run fmt`)
- [ ] Avatar image for new namespaces (`avatar.png` or `avatar.svg` in `.images/`) - [ ] Avatar image for new namespaces (`avatar.png` or `avatar.svg` in `.images/`)
#### Version Guidelines ### Version Guidelines
When reviewing PRs, ensure the version change follows semantic versioning: When reviewing PRs, ensure the version change follows semantic versioning:
@@ -42,7 +40,7 @@ PRs should clearly indicate the version change (e.g., `v1.2.3 → v1.2.4`).
go build ./cmd/readmevalidation && ./readmevalidation go build ./cmd/readmevalidation && ./readmevalidation
``` ```
## Releases ## Making a Release
### Create Release Tags ### Create Release Tags
@@ -99,5 +97,3 @@ status: "community" # or "partner", "official"
- **Tests fail**: Ensure Docker with `--network=host`, check Terraform syntax - **Tests fail**: Ensure Docker with `--network=host`, check Terraform syntax
- **Wrong file structure**: Use `./scripts/new_module.sh` for new modules - **Wrong file structure**: Use `./scripts/new_module.sh` for new modules
- **Missing namespace avatar**: Must be `avatar.png` or `avatar.svg` in `.images/` directory - **Missing namespace avatar**: Must be `avatar.png` or `avatar.svg` in `.images/` directory
That's it. Keep it simple.
BIN
View File
Binary file not shown.
+7 -7
View File
@@ -8,16 +8,16 @@
"update-version": "./update-version.sh" "update-version": "./update-version.sh"
}, },
"devDependencies": { "devDependencies": {
"@types/bun": "^1.2.9", "@types/bun": "^1.2.18",
"bun-types": "^1.1.23", "bun-types": "^1.2.18",
"gray-matter": "^4.0.3", "gray-matter": "^4.0.3",
"marked": "^12.0.2", "marked": "^16.0.0",
"prettier": "^3.3.3", "prettier": "^3.6.2",
"prettier-plugin-sh": "^0.13.1", "prettier-plugin-sh": "^0.18.0",
"prettier-plugin-terraform-formatter": "^1.2.1" "prettier-plugin-terraform-formatter": "^1.2.1"
}, },
"peerDependencies": { "peerDependencies": {
"typescript": "^5.5.4" "typescript": "^5.8.3"
}, },
"prettier": { "prettier": {
"plugins": [ "plugins": [
@@ -25,4 +25,4 @@
"prettier-plugin-terraform-formatter" "prettier-plugin-terraform-formatter"
] ]
} }
} }
@@ -1,24 +1,25 @@
--- ---
display_name: Windows RDP Desktop display_name: RDP Desktop
description: Enable RDP on Windows and add a one-click Coder Desktop button for seamless access description: Enable RDP on Windows and add a one-click Coder Desktop button for seamless access
icon: ../../../../.icons/desktop.svg icon: ../../../../.icons/rdp.svg
maintainer_github: coder maintainer_github: coder
verified: true verified: true
supported_os: [windows] supported_os: [windows]
tags: [rdp, windows, desktop, remote] tags: [rdp, windows, desktop, local]
--- ---
# Windows RDP Desktop # Windows RDP Desktop
This module enables Remote Desktop Protocol (RDP) on Windows workspaces and adds a one-click button to launch RDP sessions directly through [Coder Desktop](https://coder.com/docs/user-guides/desktop). It provides a complete, standalone solution for RDP access, eliminating the need for manual configuration or port forwarding through the Coder CLI. This module enables Remote Desktop Protocol (RDP) on Windows workspaces and adds a one-click button to launch RDP sessions directly through [Coder Desktop](https://coder.com/docs/user-guides/desktop). It provides a complete, standalone solution for RDP access, eliminating the need for manual configuration or port forwarding through the Coder CLI.
> **Note**: [Coder Desktop](https://coder.com/docs/user-guides/desktop) is required on client devices to use the Local Windows RDP access feature. > [!NOTE]
> [Coder Desktop](https://coder.com/docs/user-guides/desktop) is required on client devices to use the Local Windows RDP access feature.
```tf ```tf
module "rdp_desktop" { module "rdp_desktop" {
count = data.coder_workspace.me.start_count count = data.coder_workspace.me.start_count
source = "registry.coder.com/coder/local-windows-rdp/coder" source = "registry.coder.com/coder/local-windows-rdp/coder"
version = "1.0.0" version = "1.0.1"
agent_id = coder_agent.main.id agent_id = coder_agent.main.id
agent_name = coder_agent.main.name agent_name = coder_agent.main.name
} }
@@ -51,7 +52,7 @@ Uses default credentials (Username: `Administrator`, Password: `coderRDP!`):
module "rdp_desktop" { module "rdp_desktop" {
count = data.coder_workspace.me.start_count count = data.coder_workspace.me.start_count
source = "registry.coder.com/coder/local-windows-rdp/coder" source = "registry.coder.com/coder/local-windows-rdp/coder"
version = "1.0.0" version = "1.0.1"
agent_id = coder_agent.main.id agent_id = coder_agent.main.id
agent_name = coder_agent.main.name agent_name = coder_agent.main.name
} }
@@ -65,7 +66,7 @@ Specify a custom display name for the `coder_app` button:
module "rdp_desktop" { module "rdp_desktop" {
count = data.coder_workspace.me.start_count count = data.coder_workspace.me.start_count
source = "registry.coder.com/coder/local-windows-rdp/coder" source = "registry.coder.com/coder/local-windows-rdp/coder"
version = "1.0.0" version = "1.0.1"
agent_id = coder_agent.windows.id agent_id = coder_agent.windows.id
agent_name = "windows" agent_name = "windows"
display_name = "Windows Desktop" display_name = "Windows Desktop"
@@ -73,7 +73,7 @@ describe("local-windows-rdp", async () => {
expect(app).not.toBeNull(); expect(app).not.toBeNull();
expect(app?.slug).toBe("rdp-desktop"); expect(app?.slug).toBe("rdp-desktop");
expect(app?.display_name).toBe("RDP Desktop"); expect(app?.display_name).toBe("RDP Desktop");
expect(app?.icon).toBe("/icon/desktop.svg"); expect(app?.icon).toBe("/icon/rdp.svg");
expect(app?.external).toBe(true); expect(app?.external).toBe(true);
// Verify the URI format // Verify the URI format
@@ -95,7 +95,7 @@ describe("local-windows-rdp", async () => {
// Verify the script was created // Verify the script was created
expect(script).not.toBeNull(); expect(script).not.toBeNull();
expect(script?.display_name).toBe("Configure RDP"); expect(script?.display_name).toBe("Configure RDP");
expect(script?.icon).toBe("/icon/desktop.svg"); expect(script?.icon).toBe("/icon/rdp.svg");
expect(script?.run_on_start).toBe(true); expect(script?.run_on_start).toBe(true);
expect(script?.run_on_stop).toBe(false); expect(script?.run_on_stop).toBe(false);
@@ -60,7 +60,7 @@ data "coder_workspace" "me" {}
resource "coder_script" "rdp_setup" { resource "coder_script" "rdp_setup" {
agent_id = var.agent_id agent_id = var.agent_id
display_name = "Configure RDP" display_name = "Configure RDP"
icon = "/icon/desktop.svg" icon = "/icon/rdp.svg"
script = templatefile("${path.module}/configure-rdp.ps1", { script = templatefile("${path.module}/configure-rdp.ps1", {
username = var.username username = var.username
password = var.password password = var.password
@@ -73,9 +73,8 @@ resource "coder_app" "rdp_desktop" {
slug = "rdp-desktop" slug = "rdp-desktop"
display_name = var.display_name display_name = var.display_name
url = "coder://${local.server_name}/v0/open/ws/${data.coder_workspace.me.name}/agent/${var.agent_name}/rdp?username=${var.username}&password=${var.password}" url = "coder://${local.server_name}/v0/open/ws/${data.coder_workspace.me.name}/agent/${var.agent_name}/rdp?username=${var.username}&password=${var.password}"
icon = "/icon/desktop.svg" icon = "/icon/rdp.svg"
external = true external = true
order = var.order order = var.order
group = var.group group = var.group
} }
+15 -23
View File
@@ -1,5 +1,5 @@
--- ---
display_name: Windows RDP display_name: RDP Web
description: RDP Server and Web Client, powered by Devolutions Gateway description: RDP Server and Web Client, powered by Devolutions Gateway
icon: ../../../../.icons/desktop.svg icon: ../../../../.icons/desktop.svg
maintainer_github: coder maintainer_github: coder
@@ -14,11 +14,10 @@ Enable Remote Desktop + a web based client on Windows workspaces, powered by [de
```tf ```tf
# AWS example. See below for examples of using this module with other providers # AWS example. See below for examples of using this module with other providers
module "windows_rdp" { module "windows_rdp" {
count = data.coder_workspace.me.start_count count = data.coder_workspace.me.start_count
source = "registry.coder.com/coder/windows-rdp/coder" source = "registry.coder.com/coder/windows-rdp/coder"
version = "1.2.1" version = "1.2.2"
agent_id = resource.coder_agent.main.id agent_id = resource.coder_agent.main.id
resource_id = resource.aws_instance.dev.id
} }
``` ```
@@ -32,11 +31,10 @@ module "windows_rdp" {
```tf ```tf
module "windows_rdp" { module "windows_rdp" {
count = data.coder_workspace.me.start_count count = data.coder_workspace.me.start_count
source = "registry.coder.com/coder/windows-rdp/coder" source = "registry.coder.com/coder/windows-rdp/coder"
version = "1.2.1" version = "1.2.2"
agent_id = resource.coder_agent.main.id agent_id = resource.coder_agent.main.id
resource_id = resource.aws_instance.dev.id
} }
``` ```
@@ -44,11 +42,10 @@ module "windows_rdp" {
```tf ```tf
module "windows_rdp" { module "windows_rdp" {
count = data.coder_workspace.me.start_count count = data.coder_workspace.me.start_count
source = "registry.coder.com/coder/windows-rdp/coder" source = "registry.coder.com/coder/windows-rdp/coder"
version = "1.2.1" version = "1.2.2"
agent_id = resource.coder_agent.main.id agent_id = resource.coder_agent.main.id
resource_id = resource.google_compute_instance.dev[0].id
} }
``` ```
@@ -58,13 +55,8 @@ module "windows_rdp" {
module "windows_rdp" { module "windows_rdp" {
count = data.coder_workspace.me.start_count count = data.coder_workspace.me.start_count
source = "registry.coder.com/coder/windows-rdp/coder" source = "registry.coder.com/coder/windows-rdp/coder"
version = "1.2.1" version = "1.2.2"
agent_id = resource.coder_agent.main.id agent_id = resource.coder_agent.main.id
resource_id = resource.aws_instance.dev.id devolutions_gateway_version = "2025.2.2" # Specify a specific version
devolutions_gateway_version = "2025.1.6" # Specify a specific version
} }
``` ```
## Roadmap
- [ ] Test on Microsoft Azure.
@@ -8,7 +8,6 @@ import {
type TestVariables = Readonly<{ type TestVariables = Readonly<{
agent_id: string; agent_id: string;
resource_id: string;
share?: string; share?: string;
admin_username?: string; admin_username?: string;
admin_password?: string; admin_password?: string;
@@ -45,13 +44,11 @@ describe("Web RDP", async () => {
await runTerraformInit(import.meta.dir); await runTerraformInit(import.meta.dir);
testRequiredVariables<TestVariables>(import.meta.dir, { testRequiredVariables<TestVariables>(import.meta.dir, {
agent_id: "foo", agent_id: "foo",
resource_id: "bar",
}); });
it("Has the PowerShell script install Devolutions Gateway", async () => { it("Has the PowerShell script install Devolutions Gateway", async () => {
const state = await runTerraformApply<TestVariables>(import.meta.dir, { const state = await runTerraformApply<TestVariables>(import.meta.dir, {
agent_id: "foo", agent_id: "foo",
resource_id: "bar",
}); });
const lines = findWindowsRdpScript(state) const lines = findWindowsRdpScript(state)
@@ -96,7 +93,6 @@ describe("Web RDP", async () => {
import.meta.dir, import.meta.dir,
{ {
agent_id: "foo", agent_id: "foo",
resource_id: "bar",
}, },
); );
@@ -116,7 +112,6 @@ describe("Web RDP", async () => {
import.meta.dir, import.meta.dir,
{ {
agent_id: "foo", agent_id: "foo",
resource_id: "bar",
admin_username: customAdminUsername, admin_username: customAdminUsername,
admin_password: customAdminPassword, admin_password: customAdminPassword,
}, },
+5 -10
View File
@@ -4,7 +4,7 @@ terraform {
required_providers { required_providers {
coder = { coder = {
source = "coder/coder" source = "coder/coder"
version = ">= 0.17" version = ">= 2.5"
} }
} }
} }
@@ -35,11 +35,6 @@ variable "agent_id" {
description = "The ID of a Coder agent." description = "The ID of a Coder agent."
} }
variable "resource_id" {
type = string
description = "The ID of the primary Coder resource (e.g. VM)."
}
variable "admin_username" { variable "admin_username" {
type = string type = string
default = "Administrator" default = "Administrator"
@@ -53,14 +48,14 @@ variable "admin_password" {
variable "devolutions_gateway_version" { variable "devolutions_gateway_version" {
type = string type = string
default = "2025.2.1" default = "2025.2.2"
description = "Version of Devolutions Gateway to install. Defaults to the latest available version." description = "Version of Devolutions Gateway to install. Defaults to the latest available version."
} }
resource "coder_script" "windows-rdp" { resource "coder_script" "windows-rdp" {
agent_id = var.agent_id agent_id = var.agent_id
display_name = "windows-rdp" display_name = "windows-rdp"
icon = "/icon/desktop.svg" icon = "/icon/rdp.svg"
script = templatefile("${path.module}/powershell-installation-script.tftpl", { script = templatefile("${path.module}/powershell-installation-script.tftpl", {
admin_username = var.admin_username admin_username = var.admin_username
@@ -101,7 +96,7 @@ resource "coder_app" "rdp-docs" {
agent_id = var.agent_id agent_id = var.agent_id
display_name = "Local RDP Docs" display_name = "Local RDP Docs"
slug = "rdp-docs" slug = "rdp-docs"
icon = "https://raw.githubusercontent.com/matifali/logos/main/windows.svg" icon = "/icon/windows.svg"
url = "https://coder.com/docs/ides/remote-desktops#rdp-desktop" url = "https://coder.com/docs/user-guides/workspace-access/remote-desktops#rdp"
external = true external = true
} }
@@ -20,16 +20,13 @@ To deploy workspaces as DigitalOcean Droplets, you'll need:
- DigitalOcean [personal access token (PAT)](https://docs.digitalocean.com/reference/api/create-personal-access-token) - DigitalOcean [personal access token (PAT)](https://docs.digitalocean.com/reference/api/create-personal-access-token)
- DigitalOcean project ID (you can get your project information via the `doctl` CLI by running `doctl projects list`) - DigitalOcean project ID (you can get your project information via the `doctl` CLI by running `doctl projects list`)
- Remove the following sections from the `main.tf` file if you don't want to - Remove the following sections from the `main.tf` file if you don't want to
associate your workspaces with a project: associate your workspaces with a project:
- `variable "project_uuid"` - `variable "project_uuid"`
- `resource "digitalocean_project_resources" "project"` - `resource "digitalocean_project_resources" "project"`
- **Optional:** DigitalOcean SSH key ID (obtain via the `doctl` CLI by running - **Optional:** DigitalOcean SSH key ID (obtain via the `doctl` CLI by running
`doctl compute ssh-key list`) `doctl compute ssh-key list`)
- Note that this is only required for Fedora images to work. - Note that this is only required for Fedora images to work.
### Authentication ### Authentication
@@ -34,7 +34,6 @@ a service account:
1. Click **Create and continue**, and choose the following IAM roles to grant to 1. Click **Create and continue**, and choose the following IAM roles to grant to
the service account: the service account:
- Compute Admin - Compute Admin
- Service Account User - Service Account User
@@ -32,7 +32,6 @@ a service account:
1. Click **Create and continue**, and choose the following IAM roles to grant to 1. Click **Create and continue**, and choose the following IAM roles to grant to
the service account: the service account:
- Compute Admin - Compute Admin
- Service Account User - Service Account User
@@ -32,7 +32,6 @@ a service account:
1. Click **Create and continue**, and choose the following IAM roles to grant to 1. Click **Create and continue**, and choose the following IAM roles to grant to
the service account: the service account:
- Compute Admin - Compute Admin
- Service Account User - Service Account User
@@ -32,7 +32,6 @@ a service account:
1. Click **Create and continue**, and choose the following IAM roles to grant to 1. Click **Create and continue**, and choose the following IAM roles to grant to
the service account: the service account:
- Compute Admin - Compute Admin
- Service Account User - Service Account User
-1
View File
@@ -15,7 +15,6 @@ Develop in an Incus System Container and run nested Docker containers using Incu
1. Install [Incus](https://linuxcontainers.org/incus/) on the same machine as Coder. 1. Install [Incus](https://linuxcontainers.org/incus/) on the same machine as Coder.
2. Allow Coder to access the Incus socket. 2. Allow Coder to access the Incus socket.
- If you're running Coder as system service, run `sudo usermod -aG incus-admin coder` and restart the Coder service. - If you're running Coder as system service, run `sudo usermod -aG incus-admin coder` and restart the Coder service.
- If you're running Coder as a Docker Compose service, get the group ID of the `incus-admin` group by running `getent group incus-admin` and add the following to your `compose.yaml` file: - If you're running Coder as a Docker Compose service, get the group ID of the `incus-admin` group by running `getent group incus-admin` and add the following to your `compose.yaml` file: