From ed677815a3eb5873b7966d9e553491e5a5897da7 Mon Sep 17 00:00:00 2001 From: Eduardo Fraga Date: Tue, 4 Aug 2026 07:41:52 -0300 Subject: [PATCH] feat(content): add Gateway API v1.6 blog post (EN/PT-BR) --- content/en/blog/gateway-api-v1-6/cover.png | Bin 0 -> 34896 bytes content/en/blog/gateway-api-v1-6/index.md | 106 ++++++++++ content/pt-br/blog/gateway-api-v1-6/cover.png | Bin 0 -> 34896 bytes content/pt-br/blog/gateway-api-v1-6/index.md | 106 ++++++++++ static/img/blog/gateway-api-v1-6/cover.png | Bin 0 -> 34896 bytes .../blog/gateway-api-v1-6/generate_cover.py | 181 ++++++++++++++++++ 6 files changed, 393 insertions(+) create mode 100644 content/en/blog/gateway-api-v1-6/cover.png create mode 100644 content/en/blog/gateway-api-v1-6/index.md create mode 100644 content/pt-br/blog/gateway-api-v1-6/cover.png create mode 100644 content/pt-br/blog/gateway-api-v1-6/index.md create mode 100644 static/img/blog/gateway-api-v1-6/cover.png create mode 100644 static/img/blog/gateway-api-v1-6/generate_cover.py diff --git a/content/en/blog/gateway-api-v1-6/cover.png b/content/en/blog/gateway-api-v1-6/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..1a5d913bedf36ad907b96d2d66ca2a5b1494f57c GIT binary patch literal 34896 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 G`hNhLn{z<` literal 0 HcmV?d00001 diff --git a/content/en/blog/gateway-api-v1-6/index.md b/content/en/blog/gateway-api-v1-6/index.md new file mode 100644 index 0000000..db18fb0 --- /dev/null +++ b/content/en/blog/gateway-api-v1-6/index.md @@ -0,0 +1,106 @@ +--- +title: "Gateway API v1.6 — TCPRoute and UDPRoute Graduate to Standard" +description: "Kubernetes Gateway API v1.6.0 brings TCPRoute and UDPRoute to Standard (GA) for portable raw L4 TCP/UDP routing, introduces the experimental XBackend resource, and moves experimental APIs to their own group, gateway.networking.x-k8s.io." +summary: "Gateway API v1.6.0 is out. TCPRoute and UDPRoute graduate from Experimental to Standard in v1, giving workloads like databases, DNS, VoIP, gaming and IoT a portable way to route raw L4 traffic. The release also adds the new experimental XBackend resource and splits experimental APIs into the gateway.networking.x-k8s.io group." +date: 2026-08-03 +draft: false +tags: ["kubernetes", "gateway-api", "networking", "service-mesh", "cncf"] +categories: ["infrastructure"] +featureimage: "cover.png" +featureimagecaption: "Gateway API v1.6 cover — TCPRoute and UDPRoute graduate to Standard" +--- + +The Kubernetes SIG Network community released **Gateway API v1.6.0** on June 30, 2026, and it is a milestone release: **TCPRoute and UDPRoute graduate from Experimental to Standard (GA)** in the `v1` API version. For the first time, you can route raw TCP and UDP traffic through Gateway API with a portable, vendor-neutral API — no more falling back to a plain `Service` or to implementation-specific CRDs. + +![Gateway API v1.6](cover.png) + +## What's New in Gateway API v1.6 + +- **TCPRoute and UDPRoute are now Standard** (`v1`), enabling portable raw L4 traffic routing. +- **A new experimental resource, XBackend**, arrives in the `gateway.networking.x-k8s.io/v1alpha1` group as a general-purpose decorator for backends. +- **Experimental APIs get their own group**: new experimental resources live under `gateway.networking.x-k8s.io` with an `X` prefix, instead of the old version-string scheme. +- **Six implementations are conformant with v1.6** on the day of the announcement. + +## TCPRoute and UDPRoute Graduate to Standard + +Raw Layer 4 routing has been the most requested feature in Gateway API's history. Before v1.6, workloads that need protocol-level TCP or UDP traffic — databases, DNS, VoIP, gaming, IoT telemetry — had to rely on plain Kubernetes `Service` objects or on CRDs tied to a specific implementation. + +With `TCPRoute` and `UDPRoute` in the `v1` API version, that changes. A `Gateway` declares a listener with `protocol: TCP` (or `UDP`) and an `allowedRoutes.kinds` list that includes the route type. The route attaches to the listener through `parentRefs` — with an optional `sectionName` and `port` — and forwards to a backend via `rules[].backendRefs`. + +Here is what a TCP setup looks like: + +```yaml +apiVersion: gateway.networking.k8s.io/v1 +kind: Gateway +metadata: + name: tcp-gateway +spec: + gatewayClassName: example + listeners: + - name: tcp + protocol: TCP + port: 3306 + allowedRoutes: + kinds: + - group: gateway.networking.k8s.io + kind: TCPRoute +--- +apiVersion: gateway.networking.k8s.io/v1 +kind: TCPRoute +metadata: + name: database +spec: + parentRefs: + - name: tcp-gateway + sectionName: tcp + port: 3306 + rules: + - backendRefs: + - name: database + port: 3306 +``` + +`UDPRoute` follows exactly the same pattern — just swap `protocol: TCP` for `protocol: UDP` on the listener and use `kind: UDPRoute` (with a matching `allowedRoutes.kinds` entry) on the route. + +**Deprecation note:** the `v1alpha2` versions of `TCPRoute` and `UDPRoute` are deprecated as of v1.6 and will be removed in a future release. Existing `v1alpha2` users should plan to migrate to `v1`. + +## XBackend: A New Experimental Resource (GEP-4894) + +Alongside the GA graduation, v1.6 introduces a new experimental API called **XBackend**, a general-purpose decorator for `Service` and other backend types. It lives in the new API group `gateway.networking.x-k8s.io/v1alpha1`. + +The first version of `XBackend` supports `ExternalHostname` destinations — an Extended/Optional feature that is useful for egress scenarios and agentic AI workloads. Because an `ExternalHostname` resolves to an address outside the cluster, keep the *confused deputy* security consideration in mind: any controller that proxies to external hostnames should be explicit about which hostnames it is allowed to reach. + +The community is also working on moving Session Persistence configuration from `XBackendTrafficPolicy` into `XBackend`, as well as adding support for retries and TLS origination. + +## Experimental APIs Move to Their Own Group + +v1.6 also changes *how* experimental APIs are versioned. New experimental resources now live in a separate API group, `gateway.networking.x-k8s.io`, and their type names carry an `X` prefix — for example `XBackend` and `XMesh`. When a resource graduates to Standard, it is renamed into `gateway.networking.k8s.io` and the `X` prefix is dropped (for example, `XMesh` becomes `Mesh`). + +`TCPRoute` and `UDPRoute` were the last resources to graduate under the old version-string scheme (`v1alpha2` → `v1`). Going forward, the `X`-prefixed group makes it clear at a glance which resources are still experimental. + +## Conformance: Six Implementations + +Gateway API conformance is enforced through a formal test suite, and the following six implementations were conformant with v1.6 on publication day: + +- Agentgateway +- Airlock Microgateway +- GKE Gateway +- kgateway +- NGINX Gateway Fabric +- Traefik Proxy + +## Try It Yourself + +If you want to try TCP or UDP routing today, any of the conformant implementations above is a good starting point. The project maintains user guides for [TCP](https://gateway-api.sigs.k8s.io/guides/user-guides/tcp/) and [UDP](https://gateway-api.sigs.k8s.io/guides/user-guides/udp/) routing, plus full [documentation](https://gateway-api.sigs.k8s.io/) and the [v1.6.0 release notes](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.6.0). + +## Get Involved + +Gateway API is the role-oriented, expressive service networking standard for Kubernetes, built under SIG Network. To get involved: + +- Join **#sig-network-gateway-api** on the [Kubernetes Slack](https://slack.k8s.io/) +- Check the SIG Network calendar for community meetings +- Browse and contribute to the [gateway-api repository](https://github.com/kubernetes-sigs/gateway-api) + +--- + +At **EF-TECH**, we specialize in Kubernetes, cloud computing, and infrastructure automation. We help teams design and operate modern service networking — Gateway API included. [Contact us](/en/contato/) to learn how we can help your team. For more articles like this, visit our [blog](/en/blog/). diff --git a/content/pt-br/blog/gateway-api-v1-6/cover.png b/content/pt-br/blog/gateway-api-v1-6/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..1a5d913bedf36ad907b96d2d66ca2a5b1494f57c GIT binary patch literal 34896 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 G`hNhLn{z<` literal 0 HcmV?d00001 diff --git a/content/pt-br/blog/gateway-api-v1-6/index.md b/content/pt-br/blog/gateway-api-v1-6/index.md new file mode 100644 index 0000000..127e505 --- /dev/null +++ b/content/pt-br/blog/gateway-api-v1-6/index.md @@ -0,0 +1,106 @@ +--- +title: "Gateway API v1.6 — TCPRoute e UDPRoute tornam-se Standard" +description: "O Gateway API v1.6.0 do Kubernetes traz TCPRoute e UDPRoute para Standard (GA) com roteamento L4 TCP/UDP portável, apresenta o novo recurso experimental XBackend e separa as APIs experimentais no grupo gateway.networking.x-k8s.io." +summary: "O Gateway API v1.6.0 chegou. TCPRoute e UDPRoute deixam o estágio Experimental e passam a Standard na versão v1, oferecendo a workloads como bancos de dados, DNS, VoIP, jogos e IoT uma forma portátil de rotear tráfego L4 puro. A release também adiciona o novo recurso experimental XBackend e separa as APIs experimentais no grupo gateway.networking.x-k8s.io." +date: 2026-08-03 +draft: false +tags: ["kubernetes", "gateway-api", "redes", "service-mesh", "cncf"] +categories: ["infraestrutura"] +featureimage: "cover.png" +featureimagecaption: "Capa do Gateway API v1.6 — TCPRoute e UDPRoute promovidos a Standard" +--- + +A comunidade Kubernetes SIG Network lançou o **Gateway API v1.6.0** em 30 de junho de 2026, e esta é uma release marcante: **TCPRoute e UDPRoute deixam o estágio Experimental e passam a Standard (GA)** na versão de API `v1`. Pela primeira vez, você consegue rotear tráfego TCP e UDP puro com o Gateway API usando uma API portátil e neutra de fornecedor — sem precisar recorrer a um `Service` comum ou a CRDs específicos de cada implementação. + +![Gateway API v1.6](cover.png) + +## O Que Há de Novo no Gateway API v1.6 + +- **TCPRoute e UDPRoute agora são Standard** (`v1`), habilitando roteamento portátil de tráfego L4 puro. +- **Um novo recurso experimental, XBackend**, chega no grupo `gateway.networking.x-k8s.io/v1alpha1` como um decorator de uso geral para backends. +- **APIs experimentais ganham grupo próprio**: novos recursos experimentais passam a viver em `gateway.networking.x-k8s.io` com o prefixo `X`, em vez do antigo esquema de versões. +- **Seis implementações são conformes com o v1.6** no dia do anúncio. + +## TCPRoute e UDPRoute tornam-se Standard + +O roteamento puro na camada 4 (L4) é um dos recursos mais pedidos na história do Gateway API. Antes do v1.6, workloads que precisam de tráfego TCP ou UDP em nível de protocolo — bancos de dados, DNS, VoIP, jogos, telemetria de IoT — dependiam do `Service` comum do Kubernetes ou de CRDs atrelados a uma implementação específica. + +Com `TCPRoute` e `UDPRoute` na versão de API `v1`, isso muda. Um `Gateway` declara um listener com `protocol: TCP` (ou `UDP`) e uma lista `allowedRoutes.kinds` que inclui o tipo de rota. A rota se conecta ao listener por meio de `parentRefs` — com `sectionName` e `port` opcionais — e encaminha o tráfego para um backend via `rules[].backendRefs`. + +Veja como fica uma configuração TCP: + +```yaml +apiVersion: gateway.networking.k8s.io/v1 +kind: Gateway +metadata: + name: tcp-gateway +spec: + gatewayClassName: example + listeners: + - name: tcp + protocol: TCP + port: 3306 + allowedRoutes: + kinds: + - group: gateway.networking.k8s.io + kind: TCPRoute +--- +apiVersion: gateway.networking.k8s.io/v1 +kind: TCPRoute +metadata: + name: database +spec: + parentRefs: + - name: tcp-gateway + sectionName: tcp + port: 3306 + rules: + - backendRefs: + - name: database + port: 3306 +``` + +A `UDPRoute` segue exatamente o mesmo padrão — basta trocar `protocol: TCP` por `protocol: UDP` no listener e usar `kind: UDPRoute` (com a entrada correspondente em `allowedRoutes.kinds`) na rota. + +**Nota sobre depreciação:** as versões `v1alpha2` de `TCPRoute` e `UDPRoute` estão deprecadas a partir do v1.6 e serão removidas em uma release futura. Quem ainda usa `v1alpha2` deve planejar a migração para `v1`. + +## XBackend: um novo recurso experimental (GEP-4894) + +Junto com a promoção a GA, o v1.6 introduz uma nova API experimental chamada **XBackend**, um decorator de uso geral para `Service` e outros tipos de backend. Ela vive no novo grupo de API `gateway.networking.x-k8s.io/v1alpha1`. + +A primeira versão do `XBackend` suporta destinos `ExternalHostname` — um recurso Extended/Opcional útil para cenários de egress e workloads de IA agêntica. Como um `ExternalHostname` resolve para um endereço fora do cluster, vale lembrar da consideração de segurança conhecida como *confused deputy*: qualquer controlador que faça proxy para hostnames externos deve ser explícito sobre quais hostnames ele pode acessar. + +A comunidade também está trabalhando para mover a configuração de Session Persistence do `XBackendTrafficPolicy` para dentro do `XBackend`, além de adicionar suporte a retries e TLS origination. + +## APIs experimentais ganham grupo próprio + +O v1.6 também muda *como* as APIs experimentais são versionadas. Novos recursos experimentais agora vivem em um grupo de API separado, `gateway.networking.x-k8s.io`, e os nomes de seus tipos recebem o prefixo `X` — por exemplo, `XBackend` e `XMesh`. Quando um recurso passa a Standard, ele é renomeado para `gateway.networking.k8s.io` e o prefixo `X` é removido (por exemplo, `XMesh` vira `Mesh`). + +`TCPRoute` e `UDPRoute` foram os últimos recursos a serem promovidos sob o antigo esquema de versões (`v1alpha2` → `v1`). Daqui para frente, o grupo com prefixo `X` deixa claro de imediato quais recursos ainda são experimentais. + +## Conformidade: seis implementações + +A conformidade do Gateway API é garantida por uma suíte de testes formal, e as seis implementações a seguir eram conformes com o v1.6 no dia da publicação: + +- Agentgateway +- Airlock Microgateway +- GKE Gateway +- kgateway +- NGINX Gateway Fabric +- Traefik Proxy + +## Experimente Você Mesmo + +Se quiser testar roteamento TCP ou UDP hoje, qualquer uma das implementações conformes acima é um bom ponto de partida. O projeto mantém guias de usuário para roteamento [TCP](https://gateway-api.sigs.k8s.io/guides/user-guides/tcp/) e [UDP](https://gateway-api.sigs.k8s.io/guides/user-guides/udp/), além da [documentação completa](https://gateway-api.sigs.k8s.io/) e das [notas da release v1.6.0](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.6.0). + +## Participe + +O Gateway API é o padrão de service networking do Kubernetes: orientado a papéis, expressivo e construído sob o SIG Network. Para participar: + +- Entre no canal **#sig-network-gateway-api** no [Slack do Kubernetes](https://slack.k8s.io/) +- Acompanhe o calendário do SIG Network para as reuniões da comunidade +- Explore e contribua com o [repositório do gateway-api](https://github.com/kubernetes-sigs/gateway-api) + +--- + +Na **EF-TECH**, somos especialistas em Kubernetes, cloud computing e automação de infraestrutura. Ajudamos equipes a projetar e operar service networking moderno — incluindo o Gateway API. [Entre em contato](/pt-br/contato/) para saber como podemos ajudar sua equipe. Para mais artigos como este, visite nosso [blog](/pt-br/blog/). diff --git a/static/img/blog/gateway-api-v1-6/cover.png b/static/img/blog/gateway-api-v1-6/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..1a5d913bedf36ad907b96d2d66ca2a5b1494f57c GIT binary patch literal 34896 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 G`hNhLn{z<` literal 0 HcmV?d00001 diff --git a/static/img/blog/gateway-api-v1-6/generate_cover.py b/static/img/blog/gateway-api-v1-6/generate_cover.py new file mode 100644 index 0000000..fdc137e --- /dev/null +++ b/static/img/blog/gateway-api-v1-6/generate_cover.py @@ -0,0 +1,181 @@ +#!/usr/bin/env python3 +""" +Generate the featured image (1200x630px PNG) for the Gateway API v1.6 blog post. + +Design (same dark-terminal style as the Ansible CLI GitHub Action cover): + - Dark navy gradient background (#0e1120 -> #1e2a4a) with a grid of dots + - A terminal window showing `kubectl apply -f gateway.yaml` plus a + Gateway / TCPRoute YAML snippet + - Big title "Gateway API v1.6", subtitle "TCPRoute & UDPRoute Graduate + to Standard", and EF-TECH branding at the bottom right + +Requires: pip install pillow +""" + +import os +import sys + +try: + from PIL import Image, ImageDraw, ImageFont +except ImportError: + print("Pillow is required. Install it with: pip install pillow") + sys.exit(1) + +WIDTH, HEIGHT = 1200, 630 + + +def find_font(size: int, bold: bool = False) -> ImageFont.FreeTypeFont | ImageFont.ImageFont: + """Try to find a suitable monospace font on the system.""" + candidates = [] + if bold: + candidates = [ + "/System/Library/Fonts/Supplemental/SFNSMono-Bold.otf", + "/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf", + "/usr/share/fonts/truetype/ubuntu/UbuntuMono-B.ttf", + "/usr/share/fonts/truetype/liberation/LiberationMono-Bold.ttf", + ] + candidates += [ + "/System/Library/Fonts/Supplemental/SFNSMono-Regular.otf", + "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", + "/usr/share/fonts/truetype/ubuntu/UbuntuMono-R.ttf", + "/usr/share/fonts/truetype/liberation/LiberationMono.ttf", + ] + for path in candidates: + if os.path.exists(path): + return ImageFont.truetype(path, size) + return ImageFont.load_default() + + +def draw_terminal_window(draw: ImageDraw, x: int, y: int, w: int, h: int) -> None: + """Draw a terminal window with a title bar.""" + # Window shadow + shadow_offset = 4 + draw.rounded_rectangle( + [x + shadow_offset, y + shadow_offset, x + w + shadow_offset, y + h + shadow_offset], + radius=12, fill=(0, 0, 0, 60) + ) + # Window body (dark terminal bg) + draw.rounded_rectangle( + [x, y, x + w, y + h], radius=10, fill=(22, 26, 46) + ) + # Title bar area + draw.rounded_rectangle( + [x, y, x + w, y + 42], radius=10, fill=(32, 38, 64) + ) + # Flatten bottom corners of title bar + draw.rectangle([x, y + 32, x + w, y + 42], fill=(32, 38, 64)) + # Traffic light buttons + for cx, color in [(x + 20, (255, 95, 87)), (x + 46, (255, 189, 46)), (x + 72, (39, 201, 63))]: + draw.ellipse([cx, y + 14, cx + 14, y + 28], fill=color) + # Title text in title bar + font_title = find_font(15) + draw.text((x + w // 2, y + 21), "gateway-api-v1-6 — bash", fill=(170, 180, 210), + font=font_title, anchor="mm") + + +def create_featured_image(output_path: str) -> None: + """Create the 1200x630 OG image for the Gateway API v1.6 post.""" + img = Image.new("RGBA", (WIDTH, HEIGHT), (14, 17, 32, 255)) + draw = ImageDraw.Draw(img) + + # Background: subtle gradient #0e1120 (top) -> #1e2a4a (bottom) + top = (14, 17, 32) + bottom = (30, 42, 74) + for i in range(HEIGHT): + t = i / HEIGHT + r = int(top[0] + (bottom[0] - top[0]) * t) + g = int(top[1] + (bottom[1] - top[1]) * t) + b = int(top[2] + (bottom[2] - top[2]) * t) + draw.line([(0, i), (WIDTH, i)], fill=(r, g, b, 255)) + + # Decorative grid dots + for x in range(0, WIDTH, 30): + for y in range(0, HEIGHT, 30): + draw.point((x, y), fill=(70, 84, 130, 60)) + + # Terminal window (central element) + tw, th = 960, 360 + tx, ty = (WIDTH - tw) // 2, 30 + draw_terminal_window(draw, tx, ty, tw, th) + + # Terminal content + font_cmd = find_font(15, bold=True) + font_out = find_font(14) + font_yaml = find_font(14) + + prompt_x = tx + 30 + line_y = ty + 56 + + # Command + output lines + draw.text((prompt_x, line_y), "$", fill=(82, 188, 74), font=font_cmd) + draw.text((prompt_x + 20, line_y), " kubectl apply -f gateway.yaml", fill=(240, 242, 250), font=font_cmd) + line_y += 22 + + for out_line in [ + "gateway.gateway.networking.k8s.io/tcp-gateway created", + "tcproute.gateway.networking.k8s.io/database created", + ]: + draw.text((prompt_x, line_y), out_line, fill=(120, 170, 255), font=font_out) + line_y += 22 + + # Blank spacer + line_y += 6 + + # YAML snippet — Gateway listener (TCP) + yaml_lines = [ + ("", "apiVersion: gateway.networking.k8s.io/v1", (225, 230, 245)), + ("", "kind: Gateway", (225, 230, 245)), + ("", "spec:", (225, 230, 245)), + ("", " listeners:", (225, 230, 245)), + ("", " - name: tcp", (225, 230, 245)), + ("key", " protocol: TCP", (82, 188, 74)), + ("", " port: 3306", (225, 230, 245)), + ("", " allowedRoutes:", (225, 230, 245)), + ("", " kinds: [TCPRoute]", (225, 230, 245)), + ("sep", "---", (120, 130, 170)), + ("", "kind: TCPRoute # attaches via parentRefs", (225, 230, 245)), + ("", "spec:", (225, 230, 245)), + ("", " parentRefs:", (225, 230, 245)), + ("", " - name: tcp-gateway", (225, 230, 245)), + ("", " rules:", (225, 230, 245)), + ("", " - backendRefs:", (225, 230, 245)), + ("", " - name: database, port: 3306", (225, 230, 245)), + ] + + for kind, text, color in yaml_lines: + if kind == "sep": + draw.text((prompt_x, line_y), text, fill=color, font=font_yaml) + elif kind == "key": + # Highlight the protocol keyword + draw.text((prompt_x, line_y), text, fill=color, font=font_yaml, stroke_width=0) + else: + draw.text((prompt_x, line_y), text, fill=color, font=font_yaml) + line_y += 19 + + # Title overlay below the terminal + title_font = find_font(46, bold=True) + draw.text((WIDTH // 2, ty + th + 66), "Gateway API v1.6", + fill=(255, 255, 255), font=title_font, anchor="mm") + + subtitle_font = find_font(24, bold=True) + draw.text((WIDTH // 2, ty + th + 118), "TCPRoute & UDPRoute Graduate to Standard", + fill=(94, 170, 255), font=subtitle_font, anchor="mm") + + info_font = find_font(15) + draw.text((WIDTH // 2, ty + th + 156), "v1.6.0 · Released June 30, 2026 · Kubernetes SIG Network", + fill=(140, 150, 185), font=info_font, anchor="mm") + + # EF-TECH branding + brand_font = find_font(14, bold=True) + draw.text((WIDTH - 30, HEIGHT - 20), "EF-TECH", fill=(100, 110, 145), font=brand_font, anchor="rs") + + # Convert to RGB and save as PNG + final = Image.new("RGB", (WIDTH, HEIGHT), (14, 17, 32)) + final.paste(img, mask=img.split()[3]) + final.save(output_path, "PNG") + print(f"Image saved to {output_path} ({WIDTH}x{HEIGHT})") + + +if __name__ == "__main__": + output = os.path.join(os.path.dirname(os.path.abspath(__file__)), "cover.png") + create_featured_image(output)