From 3694785fa664d7c3faaeba6c13b8d80fd342d16f Mon Sep 17 00:00:00 2001 From: Arya Gupta Date: Sat, 16 Mar 2024 05:37:35 +0530 Subject: [PATCH 1/3] docs: tutorial for managing schemas with Schema Registry (#2331) Co-authored-by: Quetzalli %0ACo-authored-by: Quetzalli --- .../managing-schemas-using-schema-registry.md | 143 ++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 pages/docs/tutorials/kafka/managing-schemas-using-schema-registry.md diff --git a/pages/docs/tutorials/kafka/managing-schemas-using-schema-registry.md b/pages/docs/tutorials/kafka/managing-schemas-using-schema-registry.md new file mode 100644 index 00000000000..9339e424e7b --- /dev/null +++ b/pages/docs/tutorials/kafka/managing-schemas-using-schema-registry.md @@ -0,0 +1,143 @@ +--- +title: Managing schemas using Schema Registry +description: A tutorial teaching how to manage schemas using Schema Registry. +weight: 250 +--- + +## Introduction +In the [previous Kafka and Avro configuration tutorial](/docs/tutorials/kafka/configure-kafka-avro), you learned how to add Apache Avro schemas to your AsyncAPI document. Now, you will learn how to save your schema in a central Schema Registry and reuse it. + +## Background context +The need for schema management has become increasingly prevalent to handle the evolving complexity of modern Event-Driven Architecture. A Schema Registry is a centralized service that stores and maintains schemas for data exchanged between various components of a modern distributed system. Validating exchanged data maintains data consistency and compatibility. + +While several Schema Registry implementations exist, you will use the [Apicurio Registry](https://www.apicur.io/registry/) for this tutorial. Apicurio Registry is a popular open-source Schema Registry implementation that supports multiple serialization formats and facilitates schema management for diverse data in distributed systems. You will use Apicurio Registry combined with Avro, a language-neutral data serialization system. + +## Prerequisites +[Install Docker](https://docs.docker.com/engine/install/) from the official website. + +## AsyncAPI document with Avro Schema +The previous tutorial taught you how to write an AsyncAPI document for Kafka messages using the Avro schema. Here's an example of what an AsyncAPI document fully equipped with Avro schema looks like: +``` +asyncapi: 3.0.0 +info: + title: User Signup API + version: 1.0.0 + description: The API notifies you whenever a new user signs up in the application. +servers: + kafkaServer: + host: test.mykafkacluster.org:8092 + description: Kafka Server + protocol: kafka +operations: + onUserSignedUp: + action: receive + channel: + $ref: '#/channels/userSignedUp' +channels: + userSignedUp: + description: This channel contains a message per each user who signs up in our application. + address: user_signedup + messages: + userSignedUp: + $ref: '#/components/messages/userSignedUp' +components: + messages: + userSignedUp: + payload: + schemaFormat: 'application/vnd.apache.avro;version=1.9.0' + schema: + type: record + name: UserSignedUp + namespace: com.company + doc: User sign-up information + fields: + - name: userId + type: int + - name: userEmail + type: string +``` + +### Start Apicurio Registry +Start the Apicurio Registry locally with the following docker command: + +``` +docker run --env CORS_ALLOWED_ORIGINS='*' -it -p 8080:8080 apicurio/apicurio-registry-mem:2.5.8.Final +``` + +### Upload Avro schema +Once your local instance of Apicurio Registry is running, upload your Avro schema. Open a new terminal window and create an Avro schema artifact with the following command: + +``` +curl \ +http://localhost:8080/apis/registry/v2/groups/my-group/artifacts \ +-X POST \ +-H "Content-Type: application/json; artifactType=AVRO" \ +-H "X-Registry-ArtifactId: UserSignedUp" \ +--data @- << EOF +{ + "type": "record", + "name": "UserSignedUp", + "namespace": "com.company", + "doc": "User sign-up information", + "fields": [ + { + "name": "userId", + "type": "int" + }, + { + "name": "userEmail", + "type": "string" + } + ] +} +EOF +``` + + +Download your Avro schema by visiting the following URL: +http://localhost:8080/apis/registry/v2/groups/my-group/artifacts/UserSignedUp. + + +### Update schema reference +One alternative is to keep your schema in a separate file, as you learned in the previous tutorial, [describe Kafka message payload using Avro schema](/docs/tutorials/kafka/configure-kafka-avro). After uploading your Avro schema, remove the schema from your AsyncAPI document and add a `$ref` pointing to the previous step's URL. +``` +$ref: http://localhost:8080/apis/registry/v2/groups/my-group/artifacts/UserSignedUp +``` + +``` +asyncapi: 3.0.0 +info: + title: User Signup API + version: 1.0.0 + description: The API notifies you whenever a new user signs up in the application. +servers: + kafkaServer: + host: test.mykafkacluster.org:8092 + description: Kafka Server + protocol: kafka +operations: + onUserSignedUp: + action: receive + channel: + $ref: '#/channels/userSignedUp' +channels: + userSignedUp: + description: This channel contains a message per each user who signs up in our application. + address: user_signedup + messages: + userSignedUp: + $ref: '#/components/messages/userSignedUp' +components: + messages: + userSignedUp: + payload: + schemaFormat: 'application/vnd.apache.avro+json;version=1.9.0' + schema: + $ref: http://localhost:8080/apis/registry/v2/groups/my-group/artifacts/UserSignedUp +``` + +## Summary +In this tutorial, you managed Avro schemas using a centralized schema registry that enables you to share schemas across multiple applications. The good news is that this approach is valid for various other schema types! + +## Next steps +Now that you have learned how to manage schemas, check out the [bindings with Kafka tutorial](/docs/tutorials/kafka/bindings-with-kafka) to start sending messages between your services. From 173a0dbd53c0cf52c89f1733a584c619e8a4e710 Mon Sep 17 00:00:00 2001 From: Cynthia Peter Date: Sat, 16 Mar 2024 01:11:14 +0100 Subject: [PATCH 2/3] docs: tutorial for bindings with Kafka (#2318) Co-authored-by: Alejandra Quetzalli %0ACo-authored-by: Quetzalli %0ACo-authored-by: Alejandra Quetzalli %0ACo-authored-by: Quetzalli %0ACo-authored-by: Lukasz Gornicki --- .../tutorials/kafka/bindings-with-kafka.md | 236 ++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 pages/docs/tutorials/kafka/bindings-with-kafka.md diff --git a/pages/docs/tutorials/kafka/bindings-with-kafka.md b/pages/docs/tutorials/kafka/bindings-with-kafka.md new file mode 100644 index 00000000000..bace0ce13a7 --- /dev/null +++ b/pages/docs/tutorials/kafka/bindings-with-kafka.md @@ -0,0 +1,236 @@ +--- +title: Kafka bindings +description: Learn how to configure Kafka bindings in your AsyncAPI document. +weight: 300 +--- + +## Introduction + +[You learned how to manage schemas with a schema registry in the previous tutorial](/docs/tutorials/kafka/managing-schemas-using-schema-registry). This tutorial teaches you how Kafka bindings function by defining Kafka messages and expanding your AsyncAPI document with protocol-specific details. + +## Background context + +Bindings are essential for event-driven applications because they provide protocol-specific details, abstracting the complexities of message handling from your application's core logic. They enhance the API's clarity and usability by offering setup options and context for different protocols. Bindings include the topics your application reads from or writes to, message formatting, and rules for interacting with multiple data or messages. + +In an AsyncAPI document, bindings can be added to various sections like servers, channels, or messages. They contain protocol-specific details unique to each protocol. Binding definitions let you specify functionalities specific to the protocol, which are not covered by AsyncAPI's core features. + +You can configure several objects using [Kafka bindings](https://github.com/asyncapi/bindings/tree/master/kafka#readme). However, for the scope of this tutorial, you will focus on four levels of bindings: server bindings, operations binding, channel bindings, and message bindings. + +Using the code snippets from the previous tutorial, where you learned [how to manage Avro schemas using a centralized schema registry that enables you to share schemas across multiple applications](/docs/tutorials/kafka/managing-schemas-using-schema-registry), you will add configurations for server, operations, channel, and message bindings. + +Below, you can find the updated schema reference file you'll use for this tutorial. + +```yaml +asyncapi: 3.0.0 +info: + title: User Signup API + version: 1.0.0 + description: The API notifies you whenever a new user signs up in the application. +servers: + kafkaServer: + host: test.mykafkacluster.org:8092 + description: Kafka Server + protocol: kafka +operations: + onUserSignedUp: + action: receive + channel: + $ref: '#/channels/userSignedUp' +channels: + userSignedUp: + description: This channel contains a message per each user who signs up in our application. + address: user_signedup + messages: + userSignedUp: + $ref: '#/components/messages/userSignedUp' +components: + messages: + userSignedUp: + payload: + schemaFormat: 'application/vnd.apache.avro+json;version=1.9.0' + schema: + $ref: http://localhost:8080/apis/registry/v2/groups/my-group/artifacts/UserSignedUp +``` + +## Add server bindings + +Server bindings provide protocol-specific configuration details for connecting and interacting with a server. + +Server bindings allow you to specify a `schemaRegistryUrl`, which provides an API URL for a given server where a schema registry was used. A schema registry is a repository for managing and validating messages' schemas. To learn more about schema registry, read the [message validation guide for schema registry](https://www.asyncapi.com/docs/guides/message-validation#schema-registry-validation). + +`schemaRegistryVendor` is used optionally to refer to vendors or platforms that provide the schema registry service, in this case, Apicurio Registry. Learn about other fields you can configure under [server bindings](https://github.com/asyncapi/bindings/tree/master/kafka#server-binding-object). + +```yaml +servers: + kafkaServer: + host: test.mykafkacluster.org:8092 + description: Kafka Server + protocol: kafka + bindings: + kafka: + schemaRegistryUrl: 'http://localhost:8080/apis/registry/' + schemaRegistryVendor: 'apicurio' + bindingVersion: '0.5.0' +``` + +> Important: `bindingVersion` is the field version of a binding. It specifies the version of the binding specification that is used to describe how an API interacts with Kafka. The `bindingVersion` field is an optional field that is available for all bindings. + +## Add operation bindings + +Operation bindings object contains information about the operation representation in Kafka (eg. the way to consume messages). + +The operation binding object provides a structured way to describe how a particular operation (publish, subscribe) should behave on a Kafka topic. The `groupid`, for example, is the Id of the consumer group, while the `cliendID` is the Id of the consumer within a consumer group. + +These configurations are vital for distributed message consumption and load balancing among consumers. Learn more about other fields you can configure under [operations binding](https://github.com/asyncapi/bindings/tree/master/kafka#operation-binding-object). + +```yaml +operations: + onUserSignedUp: + action: receive + channel: + $ref: '#/channels/userSignedUp' + bindings: + kafka: + bindingVersion: '0.5.0' + groupId: + type: string + enum: ['myGroupId'] + clientId: + type: string + enum: ['myClientId'] +``` + +## Add channel bindings + +Channel bindings provide protocol-specific information for a particular channel. + +These configurations may include information how the Kafka topic has been configured. The Channel Binding Object is part of AsyncAPI's wider bindings architecture, which specifies how the API interacts with the messaging system — in this case, Kafka. + +In Kafka, you can specify a given topic's number of partitions or replicas therefore, enabling parallel processing of data or consumers. Learn more about other fields that you can configure under [channel bindings](https://github.com/asyncapi/bindings/tree/master/kafka#channel-binding-object). + + +```yaml +channels: + userSignedUp: + description: This channel contains a message per each user who signs up in our application. + address: user_signedup + messages: + userSignedUp: + $ref: '#/components/messages/userSignedUp' + bindings: + kafka: + bindingVersion: '0.5.0' + partitions: 10 + replicas: 2 + topicConfiguration: + cleanup.policy: ["delete", "compact"] + retention.ms: 604800000 + retention.bytes: 1000000000 + delete.retention.ms: 86400000 + max.message.bytes: 1048588 +``` + + +## Add message bindings + +Message bindings provide protocol-specific information for a specific message. For Kafka topics, this can include how message keys are used, and details about how serialized message data has been encoded. + +For example, the `schemaIdLocation` field, if specified is used to indicate where the schema identifier (ID) for the message payload's schema is located. It is useful for message serialization and deserialization, enabling consumers to understand how to interpret the message payload. + +Learn more about other fields that you can configure under [message bindings](https://github.com/asyncapi/bindings/tree/master/kafka#message-binding-object) + +```yaml +components: + messages: + userSignedUp: + bindings: + kafka: + key: + type: string + enum: ['myKey'] + schemaIdLocation: 'payload' + schemaIdPayloadEncoding: 'apicurio-new' + schemaLookupStrategy: 'TopicIdStrategy' + bindingVersion: '0.5.0' + payload: + schemaFormat: 'application/vnd.apache.avro+json;version=1.9.0' + schema: + $ref: http://localhost:8080/apis/registry/v2/groups/my-group/artifacts/UserSignedUp +``` + +Congratulations, you've completed the tutorial! Putting these blocks together gives you an AsyncAPI document all ready to go. + +```yaml +asyncapi: 3.0.0 +info: + title: User Signup API + version: 1.0.0 + description: The API notifies you whenever a new user signs up in the application. +servers: + kafkaServer: + host: test.mykafkacluster.org:8092 + description: Kafka Server + protocol: kafka + bindings: + kafka: + schemaRegistryUrl: 'http://localhost:8080/apis/registry/' + schemaRegistryVendor: 'apicurio' + bindingVersion: '0.5.0' +operations: + onUserSignedUp: + action: receive + channel: + $ref: '#/channels/userSignedUp' + bindings: + kafka: + bindingVersion: '0.5.0' + groupId: + type: string + enum: ['myGroupId'] + clientId: + type: string + enum: ['myClientId'] +channels: + userSignedUp: + description: This channel contains a message per each user who signs up in our application. + address: user_signedup + messages: + userSignedUp: + $ref: '#/components/messages/userSignedUp' + bindings: + kafka: + bindingVersion: '0.5.0' + partitions: 10 + replicas: 2 + topicConfiguration: + cleanup.policy: ["delete", "compact"] + retention.ms: 604800000 + retention.bytes: 1000000000 + delete.retention.ms: 86400000 + max.message.bytes: 1048588 +components: + messages: + userSignedUp: + bindings: + kafka: + bindingVersion: '0.5.0' + key: + type: string + enum: ['myKey'] + schemaIdLocation: 'payload' + schemaIdPayloadEncoding: 'apicurio-new' + schemaLookupStrategy: 'TopicIdStrategy' + payload: + schemaFormat: 'application/vnd.apache.avro+json;version=1.9.0' + schema: + $ref: http://localhost:8080/apis/registry/v2/groups/my-group/artifacts/UserSignedUp +``` + +## Summary + +In this tutorial, you learned how to configure server, operation, message, and channel bindings. You also learned that bindings are essential when integrating Kafka with different systems, platforms, or protocols — especially in API specifications like AsyncAPI. + + +## Next steps + +Now that you have completed this tutorial, you can [learn more about other Kakfa bindings](https://github.com/asyncapi/bindings/tree/master/kafka) or [protocol-specific bindings](https://github.com/asyncapi/bindings). From c0fefd59873ed4aec6d09e96a4bd912747658add Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Sat, 16 Mar 2024 01:28:25 +0100 Subject: [PATCH 3/3] chore: update meetings.json and newsrooom_videos.json (#2782) --- config/meetings.json | 5 -- dashboard.json | 202 ++++++++++++++++++++++++++----------------- 2 files changed, 123 insertions(+), 84 deletions(-) diff --git a/config/meetings.json b/config/meetings.json index d5a82c099ac..03473fff031 100644 --- a/config/meetings.json +++ b/config/meetings.json @@ -13,11 +13,6 @@ "banner": "https://user-images.githubusercontent.com/40604284/285945520-e06ff77c-0e37-432e-964d-b4d47167cc18.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTEiLCJleHAiOjE3MDE3ODI1NzUsIm5iZiI6MTcwMTc4MjI3NSwicGF0aCI6Ii80MDYwNDI4NC8yODU5NDU1MjAtZTA2ZmY3N2MtMGUzNy00MzJlLTk2NGQtYjRkNDcxNjdjYzE4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFJV05KWUFYNENTVkVINTNBJTJGMjAyMzEyMDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjMxMjA1VDEzMTc1NVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY5MjBhNTEwMjIwNDQxNzczY2EyMDI1YjQzOWIwYzRhY2MxNTU3ZDYyMGY2NzMxYjVkYzYyNmViZTM5Yjg4ZTEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Dm-WJy2AQO2xUMAJ1nO6ADZuBFYXKj0NEFgdcDd44Fg", "date": "2023-12-19T13:00:00.000Z" }, - { - "title": "AsyncAPI v3 announcement", - "calLink": "https://www.google.com/calendar/event?eid=NmhzMGZnNTRnZHNnZTFtbnRjbmhpZnJzbjAgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", - "date": "2023-12-06T15:00:00.000Z" - }, { "title": "3 Request/Reply Use Cases", "calLink": "https://www.google.com/calendar/event?eid=b3NvM2c0dW9tcTk1djRiMDJmbWU4dG9odGcgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", diff --git a/dashboard.json b/dashboard.json index ded731dff1a..5cdc1b804cc 100644 --- a/dashboard.json +++ b/dashboard.json @@ -1,26 +1,44 @@ { "hotDiscussions": [ { - "id": "PR_kwDOBW5R_c5f0CJh", - "isPR": true, + "id": "I_kwDOFLhIt84-OUI3", + "isPR": false, "isAssigned": false, - "title": "docs: tutorial for managing schemas with Schema Registry", - "author": "Arya-Gupta", - "resourcePath": "/asyncapi/website/pull/2331", - "repo": "asyncapi/website", - "labels": [], - "score": 27.56876051992884 + "title": "Create educational & technical video explaining AsyncAPI's main features", + "author": "alequetzalli", + "resourcePath": "/asyncapi/community/issues/155", + "repo": "asyncapi/community", + "labels": [ + { + "name": "enhancement", + "color": "a2eeef" + }, + { + "name": "stale", + "color": "ededed" + } + ], + "score": 33.59942688366328 }, { - "id": "PR_kwDOBW5R_c5fbyLb", - "isPR": true, + "id": "I_kwDODou01c5BZZv-", + "isPR": false, "isAssigned": false, - "title": "docs: tutorial for bindings with Kafka", - "author": "CynthiaPeter", - "resourcePath": "/asyncapi/website/pull/2318", - "repo": "asyncapi/website", - "labels": [], - "score": 22.9739670999407 + "title": "Open Graph link preview image according to the document to open", + "author": "smoya", + "resourcePath": "/asyncapi/studio/issues/224", + "repo": "asyncapi/studio", + "labels": [ + { + "name": "enhancement", + "color": "a2eeef" + }, + { + "name": "keep-open", + "color": "f9dd4b" + } + ], + "score": 25.55853839868403 }, { "id": "I_kwDOBW5R_c5Pi3rO", @@ -54,24 +72,20 @@ "score": 22.112443333692923 }, { - "id": "I_kwDOBW5R_c5J6qNe", + "id": "I_kwDOBW5R_c5BIl5P", "isPR": false, - "isAssigned": false, - "title": "Measuring AsyncAPI spec adoption", - "author": "derberg", - "resourcePath": "/asyncapi/website/issues/780", + "isAssigned": true, + "title": "Add new page for collecting user testing participants", + "author": "mcturco", + "resourcePath": "/asyncapi/website/issues/529", "repo": "asyncapi/website", "labels": [ { "name": "enhancement", "color": "84b6eb" - }, - { - "name": "stale", - "color": "ededed" } ], - "score": 20.102221212448114 + "score": 19.815046623698855 }, { "id": "I_kwDODou01c5AqLB8", @@ -93,26 +107,6 @@ ], "score": 19.527872034949596 }, - { - "id": "I_kwDODou01c5BZZv-", - "isPR": false, - "isAssigned": false, - "title": "Open Graph link preview image according to the document to open", - "author": "smoya", - "resourcePath": "/asyncapi/studio/issues/224", - "repo": "asyncapi/studio", - "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - }, - { - "name": "keep-open", - "color": "f9dd4b" - } - ], - "score": 19.240697446200336 - }, { "id": "I_kwDOFDnrNc51TZDT", "isPR": false, @@ -146,39 +140,39 @@ "resourcePath": "/asyncapi/community/pull/1013", "repo": "asyncapi/community", "labels": [], - "score": 18.091999091203302 + "score": 18.953522857451077 }, { - "id": "I_kwDOBW5R_c580Z0o", + "id": "I_kwDODou01c5E_LV0", "isPR": false, "isAssigned": false, - "title": "New Contributor Guide and Maintenance Setup", - "author": "derberg", - "resourcePath": "/asyncapi/website/issues/2586", - "repo": "asyncapi/website", + "title": "Create onboarding for features of Studio", + "author": "mcturco", + "resourcePath": "/asyncapi/studio/issues/284", + "repo": "asyncapi/studio", "labels": [ { "name": "enhancement", - "color": "84b6eb" + "color": "a2eeef" } ], - "score": 16.65612614745701 + "score": 17.517649913704783 }, { - "id": "I_kwDODou01c5E_LV0", - "isPR": false, + "id": "PR_kwDOBW5R_c5ol2IR", + "isPR": true, "isAssigned": false, - "title": "Create onboarding for features of Studio", - "author": "mcturco", - "resourcePath": "/asyncapi/studio/issues/284", - "repo": "asyncapi/studio", + "title": "feat: migrate docs, data, and editor components to typescript", + "author": "devilkiller-ag", + "resourcePath": "/asyncapi/website/pull/2735", + "repo": "asyncapi/website", "labels": [ { - "name": "enhancement", - "color": "a2eeef" + "name": "autoupdate", + "color": "ededed" } ], - "score": 16.36895155870775 + "score": 17.230475324955524 }, { "id": "PR_kwDOFDnrNc5dgyM7", @@ -189,41 +183,91 @@ "resourcePath": "/asyncapi/cli/pull/859", "repo": "asyncapi/cli", "labels": [], - "score": 15.794602381209232 + "score": 16.943300736206268 + }, + { + "id": "I_kwDOBW5R_c580Z0o", + "isPR": false, + "isAssigned": false, + "title": "New Contributor Guide and Maintenance Setup", + "author": "derberg", + "resourcePath": "/asyncapi/website/issues/2586", + "repo": "asyncapi/website", + "labels": [ + { + "name": "enhancement", + "color": "84b6eb" + } + ], + "score": 16.65612614745701 } ], "goodFirstIssues": [ { - "id": "I_kwDOCxglSM6Bxg4I", - "title": "Convert OpenAPI 3.0 to AsyncAPI 3.0", + "id": "I_kwDOE8Qh386CSg4-", + "title": "Java generator does not include import for dictionary models", "isAssigned": false, - "resourcePath": "/asyncapi/converter-js/issues/233", - "repo": "asyncapi/converter-js", + "resourcePath": "/asyncapi/modelina/issues/1892", + "repo": "asyncapi/modelina", "author": "jonaslagoni", "area": "typescript", "labels": [ { - "name": "enhancement", - "color": "a2eeef" + "name": "bug", + "color": "d73a4a" }, { - "name": "keep-open", - "color": "f4d473" + "name": "Java generator", + "color": "d4c5f9" } ] }, { - "id": "I_kwDOBW5R_c6BEfZr", - "title": "[BUG] CaseStudy page horizontal spacing", + "id": "I_kwDODwv8N86CATWV", + "title": "Unaligned hero section", "isAssigned": false, - "resourcePath": "/asyncapi/website/issues/2727", - "repo": "asyncapi/website", - "author": "RamGoel", + "resourcePath": "/asyncapi/conference-website/issues/267", + "repo": "asyncapi/conference-website", + "author": "AceTheCreator", "area": "Unknown", "labels": [ { - "name": "bug", - "color": "ee0701" + "name": "enhancement", + "color": "a2eeef" + } + ] + }, + { + "id": "I_kwDODwv8N86CASyz", + "title": "Card text is unreadable ", + "isAssigned": false, + "resourcePath": "/asyncapi/conference-website/issues/266", + "repo": "asyncapi/conference-website", + "author": "AceTheCreator", + "area": "Unknown", + "labels": [ + { + "name": "enhancement", + "color": "a2eeef" + } + ] + }, + { + "id": "I_kwDOCxglSM6Bxg4I", + "title": "Convert OpenAPI 3.0 to AsyncAPI 3.0", + "isAssigned": false, + "resourcePath": "/asyncapi/converter-js/issues/233", + "repo": "asyncapi/converter-js", + "author": "jonaslagoni", + "area": "typescript", + "labels": [ + { + "name": "enhancement", + "color": "a2eeef" + }, + { + "name": "keep-open", + "color": "f4d473" } ] },