diff --git a/.github/workflows/deploy-site.yml b/.github/workflows/deploy-site.yml
new file mode 100644
index 000000000..bab6c5147
--- /dev/null
+++ b/.github/workflows/deploy-site.yml
@@ -0,0 +1,32 @@
+name: Roq Site Deploy
+
+on:
+ push:
+ branches: [ main ] # Switch to the branch which should be deployed to GitHub Pages
+ paths:
+ - docs/**
+ workflow_dispatch:
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v7
+ - name: Generate Roq Site
+ uses: quarkiverse/quarkus-roq@v1.1
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }} # Used to automatically get the GitHub Pages url
+ site-directory: ./docs/
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ permissions:
+ pages: write # to deploy to Pages
+ id-token: write # to verify the deployment originates from an appropriate source
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v5
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 000000000..ab02d8bdf
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,48 @@
+#Maven
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+release.properties
+.flattened-pom.xml
+
+# Eclipse
+.project
+.classpath
+.settings/
+bin/
+
+# IntelliJ
+.idea
+*.ipr
+*.iml
+*.iws
+
+# NetBeans
+nb-configuration.xml
+
+# Visual Studio Code
+.vscode
+.factorypath
+
+# OSX
+.DS_Store
+
+# Vim
+*.swp
+*.swo
+
+# patch
+*.orig
+*.rej
+
+# Local environment
+.env
+
+# Plugin directory
+/.quarkus/cli/plugins/
+# TLS Certificates
+.certs/
+
+# Web Bundler
+node_modules/
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 000000000..1d6879d82
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,66 @@
+
+# A2A Java SDK Documentation
+
+A static site built with [Roq](https://iamroq.dev), a static site generator powered by Quarkus.
+
+## Getting Started
+
+Install the [Roq CLI](https://iamroq.dev/docs/getting-started/) (installs [JBang](https://www.jbang.dev/download) if needed):
+```bash
+curl -Ls https://sh.jbang.dev | bash -s - app install --fresh --force roq@quarkiverse/quarkus-roq
+```
+
+Then:
+```bash
+# Start dev mode with live-reload
+roq start
+
+# Build the static site
+roq generate
+
+# Preview the generated site
+roq serve
+```
+
+Dev mode runs on http://localhost:8080 (use `-p` to change the port).
+
+## Project Structure
+
+```
+content/ Pages and collections (posts/, etc.)
+templates/
+ layouts/ Page layouts
+ partials/ Reusable template fragments
+data/ Structured data files (YAML/JSON)
+public/ Static assets served as-is (images, etc.)
+web/ JS/CSS sources (bundled by Quarkus Web Bundler)
+config/
+ application.properties
+```
+
+## Useful Commands
+
+```bash
+roq add plugin:tagging # Add a plugin
+roq add theme:default # Add a theme
+roq update # Update to latest Roq version
+```
+
+## AI Coding Assistants
+
+Give your AI assistant full context about Roq by pointing it to https://iamroq.dev/llms.txt.
+
+For detailed skill files, run:
+```bash
+mvn dependency:list -DincludeGroupIds=io.quarkiverse.roq -DoutputAbsoluteArtifactFilename=true
+```
+Then extract skills from the `*-deployment` JARs listed in the output:
+```bash
+unzip -p PATH_TO_JAR META-INF/quarkus-skill.md > .claude/skills/SKILL_NAME.md
+```
+
+## Learn More
+
+- [Roq Documentation](https://iamroq.dev/docs/)
+- [Qute Template Reference](https://quarkus.io/guides/qute-reference)
+- [Quarkus](https://quarkus.io/)
diff --git a/docs/content/404.html b/docs/content/404.html
new file mode 100644
index 000000000..a62d0f108
--- /dev/null
+++ b/docs/content/404.html
@@ -0,0 +1,4 @@
+---
+layout: 404
+image: logo.svg
+---
diff --git a/docs/content/about.md b/docs/content/about.md
new file mode 100644
index 000000000..b7ffc9c1a
--- /dev/null
+++ b/docs/content/about.md
@@ -0,0 +1,19 @@
+---
+title: About
+description: A static site generator built with Java and Quarkus. Zero config to get started, full power of the JVM when you need it.
+layout: page
+---
+
+# About this site
+
+This site is built with [Roq](https://iamroq.dev), a static site generator powered by [Quarkus](https://quarkus.io). It combines the best of tools like Jekyll and Hugo with the Java ecosystem: zero configuration to get started, blazing fast live-reload in dev mode, and full access to Java when you need it.
+
+## Authors
+
+
+ {#for id in cdi:authors.fields}
+ {#let author=cdi:authors.get(id)}
+ {#roq/authorCard name=author.name avatar=author.avatar?? nickname=author.nickname profile=author.profile /}
+ {/for}
+
+
diff --git a/docs/content/announces.html b/docs/content/announces.html
new file mode 100644
index 000000000..1f80efa4c
--- /dev/null
+++ b/docs/content/announces.html
@@ -0,0 +1,8 @@
+---
+title: Announcements
+description: Release announcements and news from the A2A Java SDK project.
+layout: blog
+paginate:
+ collection: posts
+ size: 10
+---
diff --git a/docs/content/client.md b/docs/content/client.md
new file mode 100644
index 000000000..7083ac2a4
--- /dev/null
+++ b/docs/content/client.md
@@ -0,0 +1,210 @@
+---
+title: A2A Client Guide
+description: Communicate with A2A-compliant agents using the A2A Java SDK client.
+layout: page
+---
+
+# A2A Client
+
+The A2A Java SDK provides a Java client for communicating with any A2A-compliant agent. Supports JSON-RPC 2.0, gRPC, and HTTP+JSON/REST transports.
+
+## 1. Add the Client Dependency
+
+```xml
+
+ org.a2aproject.sdk
+ a2a-java-sdk-client
+
+ $\{org.a2aproject.sdk.version}
+
+```
+
+The client artifact includes the JSON-RPC transport by default. For gRPC or REST, add the corresponding transport:
+
+```xml
+
+
+ org.a2aproject.sdk
+ a2a-java-sdk-client-transport-grpc
+ $\{org.a2aproject.sdk.version}
+
+
+
+
+ org.a2aproject.sdk
+ a2a-java-sdk-client-transport-rest
+ $\{org.a2aproject.sdk.version}
+
+```
+
+## 2. Create a Client
+
+```java
+// Resolve the agent card from the server
+AgentCard agentCard = A2ACardResolver.builder()
+ .baseUrl("http://localhost:1234")
+ .build()
+ .getAgentCard();
+
+// Configure accepted output modes
+ClientConfig clientConfig = new ClientConfig.Builder()
+ .setAcceptedOutputModes(List.of("text"))
+ .build();
+
+// Define event consumers
+List> consumers = List.of(
+ (event, card) -> {
+ if (event instanceof MessageEvent messageEvent) {
+ // handle message
+ } else if (event instanceof TaskEvent taskEvent) {
+ // handle task
+ } else if (event instanceof TaskUpdateEvent updateEvent) {
+ // handle task update
+ }
+ }
+);
+
+// Build the client
+Client client = Client
+ .builder(agentCard)
+ .clientConfig(clientConfig)
+ .withTransport(JSONRPCTransport.class, new JSONRPCTransportConfig())
+ .addConsumers(consumers)
+ .streamingErrorHandler(error -> { /* handle errors */ })
+ .build();
+```
+
+## 3. Send Messages
+
+```java
+// Send a text message (streaming used automatically if supported)
+Message message = A2A.toUserMessage("tell me a joke");
+client.sendMessage(message);
+
+// Send with per-call custom consumers
+client.sendMessage(message, customConsumers, customErrorHandler);
+
+// Send with a call context
+client.sendMessage(message, clientCallContext);
+```
+
+## Task Management
+
+```java
+// Get task state
+Task task = client.getTask(new TaskQueryParams("task-1234"));
+Task task = client.getTask(new TaskQueryParams("task-1234", 10)); // with history limit
+
+// Cancel a task
+Task cancelled = client.cancelTask(new TaskIdParams("task-1234"));
+
+// Subscribe to an ongoing task
+client.subscribeToTask(new TaskIdParams("task-1234"));
+client.subscribeToTask(taskIdParams, customConsumers, customErrorHandler);
+
+// Retrieve the server agent card
+AgentCard serverCard = client.getAgentCard();
+```
+
+## Push Notifications
+
+```java
+// Set a push notification configuration
+PushNotificationConfig pushConfig = PushNotificationConfig.builder()
+ .url("https://example.com/callback")
+ .authenticationInfo(new AuthenticationInfo(List.of("jwt"), null))
+ .build();
+
+TaskPushNotificationConfig taskConfig = TaskPushNotificationConfig.builder()
+ .taskId("task-1234")
+ .pushNotificationConfig(pushConfig)
+ .build();
+
+client.createTaskPushNotificationConfiguration(taskConfig);
+
+// List configurations
+List configs =
+ client.listTaskPushNotificationConfigurations(
+ new ListTaskPushNotificationConfigParams("task-1234"));
+
+// Delete a configuration
+client.deleteTaskPushNotificationConfigurations(
+ new DeleteTaskPushNotificationConfigParams("task-1234", "config-4567"));
+```
+
+## Transport Configuration
+
+### JSON-RPC with a Custom HTTP Client
+
+```java
+// Use a custom JDK HTTP client
+HttpClient jdkHttpClient = HttpClient.newBuilder()
+ .connectTimeout(Duration.ofSeconds(5))
+ .followRedirects(HttpClient.Redirect.NORMAL)
+ .build();
+
+Client client = Client
+ .builder(agentCard)
+ .withTransport(JSONRPCTransport.class,
+ new JSONRPCTransportConfig(new JdkA2AHttpClient(jdkHttpClient)))
+ .build();
+```
+
+### gRPC
+
+```java
+Function channelFactory = agentUrl ->
+ ManagedChannelBuilder.forTarget(agentUrl).build();
+
+Client client = Client
+ .builder(agentCard)
+ .withTransport(GrpcTransport.class, new GrpcTransportConfig(channelFactory))
+ .build();
+```
+
+### Multiple Transports
+
+```java
+Client client = Client
+ .builder(agentCard)
+ .withTransport(GrpcTransport.class, new GrpcTransportConfig(channelFactory))
+ .withTransport(JSONRPCTransport.class, new JSONRPCTransportConfig())
+ .withTransport(RestTransport.class, new RestTransportConfig())
+ .build();
+```
+
+## Communicating with v0.3 Agents
+
+Use `Client_v0_3` to communicate with agents that only support protocol v0.3:
+
+```xml
+
+ org.a2aproject.sdk
+ a2a-java-sdk-compat-0.3-client
+ $\{org.a2aproject.sdk.version}
+
+
+ org.a2aproject.sdk
+ a2a-java-sdk-compat-0.3-client-transport-jsonrpc
+ $\{org.a2aproject.sdk.version}
+
+```
+
+```java
+AgentCard card = A2ACardResolver.builder().baseUrl("http://localhost:1234")
+ .build().getAgentCard();
+
+AgentInterface v03Interface = card.supportedInterfaces().stream()
+ .filter(i -> A2AProtocol_v0_3.PROTOCOL_VERSION.equals(i.protocolVersion()))
+ .findFirst().orElseThrow();
+
+Client_v0_3 client = ClientBuilder_v0_3.forUrl(v03Interface.url())
+ .withTransport(JSONRPCTransport_v0_3.class, new JSONRPCTransportConfigBuilder_v0_3())
+ .build();
+```
+
+## Examples
+
+- [Hello World Client](https://github.com/a2aproject/a2a-java/blob/main/examples/helloworld/client/README.md) — Java client talking to a Python A2A server
+- [Hello World Server](https://github.com/a2aproject/a2a-java/blob/main/examples/helloworld/server/README.md) — Python client talking to a Java A2A server
+- [a2a-samples repository](https://github.com/a2aproject/a2a-samples/tree/main/samples/java/agents) — More agent examples
diff --git a/docs/content/community.md b/docs/content/community.md
new file mode 100644
index 000000000..48eea5110
--- /dev/null
+++ b/docs/content/community.md
@@ -0,0 +1,50 @@
+---
+title: Community Articles
+description: Articles, blog posts, and videos from the A2A Java SDK community.
+layout: page
+---
+
+# Community Articles
+
+## General Agent and A2A Introduction
+
+- [Agents are not tools](https://www.googlecloudcommunity.com/gc/Community-Blogs/Agents-are-not-tools/ba-p/922716) — A nice explanation of what agents are from one of the main contributors of the A2A spec.
+- [Introducing A2A](https://goo.gle/a2a-video) — A good video introducing A2A.
+
+## A2A Java SDK
+
+- [Quarkus and WildFly teams from Red Hat collaborating with Google on launch of Agent2Agent Java SDK](https://quarkus.io/blog/a2a-project-launches-java-sdk/) — Announcing the new availability of the A2A Java SDK and giving a quick introduction to it. Also on [Medium](https://medium.com/google-cloud/quarkus-and-wildfly-teams-from-red-hat-collaborating-with-google-on-launch-of-agent2agent-java-sdk-5f8cc64921cb).
+
+- [A2A Java SDK Introduction Video](https://www.youtube.com/watch?v=5CZzW-wvEQs) — A great video introducing the A2A Java SDK and giving a walkthrough of a multi-language interoperability example.
+
+- [Getting Started with Quarkus and A2A Java SDK](https://quarkus.io/blog/quarkus-and-a2a-java-sdk/) — An introduction on how to easily get started with Quarkus and the A2A Java SDK. Also on [Medium](https://medium.com/google-cloud/getting-started-with-quarkus-and-the-a2a-java-sdk-c8b1529c8445).
+
+- [Getting Started with Quarkus and A2A Java SDK 0.3.0](https://quarkus.io/blog/quarkus-a2a-java-0-3-0-alpha-release/) — Learn about what's new in the 0.3.0 version of the A2A Java SDK. Also on [Medium](https://medium.com/google-cloud/getting-started-with-quarkus-and-a2a-java-sdk-0-3-0-c4e70620a805).
+
+- [A2A Java SDK: Support for the REST Transport is Now Here](https://quarkus.io/blog/quarkus-a2a-java-0-3-0-beta-release/) — Learn about the new support for the REST transport introduced in A2A Java SDK 0.3.0.Beta1. Also on [Medium](https://medium.com/google-cloud/a2a-java-sdk-support-for-the-rest-transport-is-now-here-56c666060b32).
+
+- [Multi-Language Agent Collaboration and Interoperability with A2A](https://medium.com/google-cloud/multi-language-agent-collaboration-and-interoperability-with-a2a-e5fe80b4962d) — A deep dive into a multi-language, multi-agent sample where agents written in Java, Python, and TypeScript work together.
+
+- [Getting Started with A2A Java SDK and gRPC](https://quarkus.io/blog/quarkus-a2a-java-grpc/) — Learn how to create an A2A server agent and client communicating over gRPC. Also on [Medium](https://medium.com/google-cloud/getting-started-with-the-a2a-java-sdk-and-grpc-11c987df73c1).
+
+- [How to Secure Your A2A Server Agent with Keycloak OAuth2](https://quarkus.io/blog/quarkus-a2a-java-security/) — Secure an A2A server agent using OAuth2 bearer tokens via Keycloak.
+
+- [How to Use Your A2A Server Agent in a Distributed or Cloud Native Environment](https://quarkus.io/blog/quarkus-a2a-cloud-enhancements/) — Running A2A server agents reliably in load-balanced Kubernetes deployments.
+
+- [A2A Java SDK 1.0.0.Alpha1 — Embracing the 1.0 Specification](https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha1/) — Aligning the SDK with the 1.0 version of the A2A Protocol specification.
+
+- [A2A Java SDK 1.0.0.Alpha2 Released](https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha2-released/) — Telemetry support and push notifications.
+
+- [A2A Java SDK 1.0.0.Beta1 Released](https://quarkus.io/blog/a2a-java-sdk-1-0-0-beta1-released/) — First beta, fully aligned with A2A Specification 1.0.0.
+
+- [A2A Java SDK 1.0.0.CR1 Released](https://quarkus.io/blog/a2a-java-sdk-1-0-0-cr1-released/) — v0.3 compatibility layer, Android HTTP client, unified HTTP clients.
+
+## A2A Java SDK for Jakarta Servers
+
+- [Building your First A2A Agent](https://www.wildfly.org/news/2025/08/07/Building-your-First-A2A-Agent/) — Introduction to the A2A Java SDK for Jakarta Servers with WildFly.
+
+- [A2A Java SDK for Jakarta 0.3.0.Beta1 is released!](https://www.wildfly.org/news/2025/09/19/A2A-Java-SDK-for-Jakarta-0-3-0-Beta1-is-released/) — gRPC and HTTP+JSON transport support for WildFly.
+
+- [A2A Java SDK for Jakarta 0.3.0.Final is released!](https://www.wildfly.org/news/2025/11/06/A2A-Java-SDK-for-Jakarta-0-3-0-Final-is-released/) — Supporting version 0.3.0 of the A2A Protocol Specification.
+
+- [A2A Java SDK for Jakarta 1.0.0.Alpha1 is released!](https://www.wildfly.org/news/2026/01/20/A2A-Java-SDK-for-Jakarta-1-0-0-Alpha1-is-released/) — Supporting version 1.0 of the A2A Protocol Specification.
diff --git a/docs/content/contributing.md b/docs/content/contributing.md
new file mode 100644
index 000000000..fa027884a
--- /dev/null
+++ b/docs/content/contributing.md
@@ -0,0 +1,87 @@
+---
+title: Contributing
+description: Developer guide for contributing to the A2A Java SDK.
+layout: page
+---
+
+# Contributing
+
+See [CONTRIBUTING.md](https://github.com/a2aproject/a2a-java/blob/main/CONTRIBUTING.md) for full contribution guidelines. Fork the repo, create a branch per issue, and submit PRs against `main`.
+
+## Build
+
+Requires Java 17+. Tests output is redirected to files by default.
+
+```bash
+mvn clean install
+```
+
+## Project Structure
+
+| Module | Purpose |
+|--------|---------|
+| `spec/` | A2A specification types (Java records for the protocol) |
+| `spec-grpc/` | gRPC protobuf definitions and generated classes |
+| `common/` | Shared utilities |
+| `client/base/` | Core client API |
+| `client/transport/spi/` | Transport SPI |
+| `client/transport/jsonrpc/`, `grpc/`, `rest/` | Transport implementations |
+| `server-common/` | Server-side core (AgentExecutor, TaskStore, QueueManager) |
+| `transport/` | Server transport layer |
+| `reference/` | Reference server implementations (Quarkus) |
+| `tck/` | Technology Compatibility Kit |
+| `extras/` | Optional add-ons (OpenTelemetry, JPA stores, Kafka queue, Vert.x, Android) |
+| `compat-0.3/` | Backward compatibility layer for A2A protocol v0.3 |
+| `boms/` | Bill of Materials POMs |
+| `examples/` | Sample applications |
+
+## Code Conventions
+
+- Package root: `org.a2aproject.sdk`
+- Serialization: Gson
+- Null safety: NullAway + JSpecify annotations via Error Prone
+- Reference server runtime: Quarkus
+- Testing: JUnit 5, Mockito, REST Assured, Testcontainers
+
+### Style
+
+- Sort import statements
+- No star imports (e.g. `import java.util.*`)
+- Use Java `record` for immutable data types
+- Use `@Nullable` (from `org.jspecify.annotations`) for optional fields
+- Use `org.a2aproject.sdk.util.Assert.checkNotNullParam()` in compact constructors
+- Use `List.copyOf()` and `Map.copyOf()` for defensive copying
+- Apply the Builder pattern for records with many fields (see `AgentCard.java`)
+
+### gRPC Regeneration
+
+Copy `a2a.proto` from upstream and adjust the `java_package` option:
+
+```
+option java_package = "org.a2aproject.sdk.grpc";
+```
+
+Then regenerate:
+
+```bash
+mvn clean install -Dskip.protobuf.generate=false -pl spec-grpc
+```
+
+## Commit Messages
+
+Follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/):
+
+```
+feat: add streaming support for REST transport
+fix: handle null task in cancelTask flow
+chore: bump quarkus to 3.x
+```
+
+If the commit relates to a GitHub issue, add `This fixes #` at the end of the commit body.
+
+## Architecture Deep Dives
+
+Detailed architecture documentation lives in `.claude/architecture/`:
+
+- **EventQueue & Event Processing** — Queue lifecycle, request flows, usage scenarios
+- **0.3 Compatibility Layer** — How v0.3 requests are converted to v1.0 internally
diff --git a/docs/content/index.html b/docs/content/index.html
new file mode 100644
index 000000000..40bfdaaa1
--- /dev/null
+++ b/docs/content/index.html
@@ -0,0 +1,49 @@
+---
+title: A2A Java SDK Documentation
+description: A Java library that helps run agentic applications as A2A servers following the Agent2Agent (A2A) Protocol.
+name: A2A Java SDK Documentation
+simple-name: A2A Java SDK
+image: a2a-java-sdk.png
+social-github: a2aproject/a2a-java
+layout: home
+---
+
+
+{#roq/hero logo="/images/a2a-java-sdk.png"}
+ {#title}A2A Java SDK{/title}
+ {#tagline}Implement the Agent2Agent Protocol in Java{/tagline}
+ {#subtitle}A multi-module Maven library providing client and server support for A2A agent communication over JSON-RPC, gRPC, and REST transports.{/subtitle}
+ Server Guide
+ Client Guide
+{/}
+
+
+ {#roq/featureCard icon="fa-server" title="A2A Server"}
+ Run your agentic Java application as an A2A server. Implement AgentExecutor and let the SDK handle protocol, routing, and streaming.
+ {/}
+ {#roq/featureCard icon="fa-plug" title="A2A Client"}
+ Communicate with any A2A-compliant agent. Supports streaming, push notifications, and task lifecycle management out of the box.
+ {/}
+ {#roq/featureCard icon="fa-network-wired" title="Multiple Transports"}
+ JSON-RPC 2.0, gRPC, and HTTP+JSON/REST transports — pick what fits your stack, or support them all simultaneously.
+ {/}
+ {#roq/featureCard icon="fa-code-branch" title="Protocol Compatibility"}
+ Serve v1.0 and v0.3 clients side-by-side with zero changes to your AgentExecutor. The compat layer handles conversion automatically.
+ {/}
+
+
+
+
Quick Install
+
Add the A2A Java SDK reference server for JSON-RPC to your Maven project:
+
+
diff --git a/docs/content/posts/2026-06-10-a2a-java-sdk-1-0-0-final-released/annouce.png b/docs/content/posts/2026-06-10-a2a-java-sdk-1-0-0-final-released/annouce.png
new file mode 100644
index 000000000..b62caa5f9
Binary files /dev/null and b/docs/content/posts/2026-06-10-a2a-java-sdk-1-0-0-final-released/annouce.png differ
diff --git a/docs/content/posts/2026-06-10-a2a-java-sdk-1-0-0-final-released/index.md b/docs/content/posts/2026-06-10-a2a-java-sdk-1-0-0-final-released/index.md
new file mode 100644
index 000000000..2a877f6fd
--- /dev/null
+++ b/docs/content/posts/2026-06-10-a2a-java-sdk-1-0-0-final-released/index.md
@@ -0,0 +1,134 @@
+---
+layout: post
+title: 'A2A Java SDK 1.0.0.Final Released'
+date: 2026-06-10
+tags: ai a2a
+synopsis: 'A2A Java SDK 1.0.0.Final is now available -- the first GA release of the official Java SDK for the A2A Protocol.'
+author: kkhan
+---
+
+
+
+I am pleased to announce the release of [A2A Java SDK 1.0.0.Final](https://github.com/a2aproject/a2a-java/releases/tag/v1.0.0.Final) -- our first GA release. The A2A Java SDK is the official Java implementation of the [Agent2Agent (A2A) Protocol](https://a2a-protocol.org/v1.0.0/specification/), an open standard that enables AI agents to communicate and collaborate regardless of underlying framework, language, or vendor.
+
+This release is the result of six months and seven pre-releases (four Alphas, a Beta, and a Candidate Release), with contributions from 17 people. If you've been tracking the pre-releases, you can upgrade from CR1 with no breaking changes.
+
+## What's A2A?
+
+The Agent2Agent (A2A) Protocol is an open standard, governed by the Linux Foundation, that lets AI agents discover each other's capabilities, delegate tasks, and collaborate -- even if they're written in different languages or built on different frameworks. For example, an orchestrator agent written in Python can delegate to a specialist agent written in Java.
+
+The A2A Java SDK provides everything you need to build A2A server agents and clients in Java, with reference implementations based on [Quarkus](https://quarkus.io) and community integration with [WildFly/Jakarta EE](https://github.com/wildfly-extras/a2a-jakarta).
+
+## Installation
+
+Import the BOM and add the dependencies for your chosen transport:
+
+```xml
+
+
+
+ org.a2aproject.sdk
+ a2a-java-sdk-bom
+ 1.0.0.Final
+ pom
+ import
+
+
+
+
+
+
+ org.a2aproject.sdk
+ a2a-java-sdk-reference-jsonrpc
+
+
+ org.a2aproject.sdk
+ a2a-java-sdk-reference-grpc
+
+
+ org.a2aproject.sdk
+ a2a-java-sdk-reference-rest
+
+```
+
+All three transports -- JSON-RPC, gRPC, and HTTP+JSON/REST -- are fully supported and considered equal. Just pick the artifact(s) for the transport(s) you need.
+
+## What's New Since 1.0.0.CR1
+
+[1.0.0.CR1](https://github.com/a2aproject/a2a-java/releases/tag/v1.0.0.CR1) was our feature-complete candidate release. Since then, we focused on cross-SDK interoperability validation and bug fixes.
+
+### Integration Test Kit (ITK)
+
+The biggest addition is the Integration Test Kit (ITK) -- a configurable Quarkus-based A2A agent that runs predefined scenarios from the ITK test harness to validate protocol compliance across different SDK implementations (Java, Python, TypeScript, etc.). This gives us confidence that the Java SDK interoperates correctly with agents built using other A2A SDKs.
+
+### Protocol Compliance and Stability Fixes
+
+Driven by ITK testing, we addressed several protocol compliance issues:
+
+* Fixed SSE event listener, gRPC blocking offload handling, and JSON-RPC route consistency across all transports
+* Prevented dropped SSE events under back-to-back emission
+* Propagated CDI request context correctly to `AgentExecutor` threads and streaming requests
+* Improved `A2ACardResolver` to support complete agent card URLs
+* Completed the records migration for v0.3 compatibility spec classes
+
+## The Journey from 0.3 to 1.0
+
+The 0.3.x series was our first production-quality SDK, supporting JSON-RPC, gRPC, REST transports, security with OAuth2/Keycloak, and cloud-native deployment with persistent stores and replicated queues. The 1.0 series modernized the SDK to align with the final A2A Specification 1.0.0.
+
+Here is a summary of the major changes. Each of our previous blog posts covers its respective release in detail:
+
+### Specification and API
+
+* **A2A Protocol 1.0 alignment** -- the SDK implements the final [A2A Specification 1.0.0](https://a2a-protocol.org/v1.0.0/specification/), including the new `supportedInterfaces` model for `AgentCard`, removal of `kind` discriminators, and refined error handling ([Alpha1](https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha1/))
+* **Java records throughout** -- all spec domain classes are now Java records, providing immutability, consistent accessor naming (`card.name()` instead of `card.getName()`), and less boilerplate ([Alpha1](https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha1/))
+* **AgentEmitter API** -- replaced the `EventQueue` + `TaskUpdater` combination with a streamlined `AgentEmitter` interface for agent interactions ([Alpha2](https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha2-released/))
+* **Structured error codes** -- A2A error types now carry structured codes and details for precise error handling ([Beta1](https://quarkus.io/blog/a2a-java-sdk-1-0-0-beta1-released/))
+
+### Server Architecture
+
+* **MainEventBus architecture** -- the server internals were rearchitected around a central event bus. Previously, event processing was driven directly by client requests. Now all events flow through a single-threaded `MainEventBusProcessor` that persists events to the `TaskStore` _before_ distributing them to clients. This guarantees clients never see unpersisted events, eliminates race conditions in concurrent task updates, and enables patterns like fire-and-forget tasks and late client reconnections ([Alpha2](https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha2-released/))
+
+### Infrastructure
+
+* **New coordinates** -- Maven `groupId` changed to `org.a2aproject.sdk` and Java packages renamed to `org.a2aproject.sdk.*`, reflecting the project's home under the [A2A Project organization](https://github.com/a2aproject) ([Beta1](https://quarkus.io/blog/a2a-java-sdk-1-0-0-beta1-released/))
+* **Protobuf as source of truth** -- replaced Jackson with Gson and established `a2a.proto` as the authoritative definition, with MapStruct mappers giving compile errors if spec and proto diverge ([Alpha1](https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha1/))
+* **Maven BOMs** -- three BOMs (`a2a-java-sdk-bom`, `a2a-java-extras-bom`, `a2a-java-reference-bom`) for dependency management ([Alpha1](https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha1/))
+
+### Capabilities
+
+* **OpenTelemetry telemetry** -- built-in tracing and monitoring for both client and server ([1.0.0.Alpha2](https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha2-released/))
+* **Push notifications** -- full server and client support per the A2A 1.0 spec ([1.0.0.Alpha2](https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha2-released/))
+* **v0.3 backward compatibility** -- a compatibility layer that lets v1.0 agents interoperate with v0.3 agents and clients across all three transports, with multi-version convenience modules for serving both protocol versions simultaneously ([1.0.0.CR1](https://quarkus.io/blog/a2a-java-sdk-1-0-0-cr1-released/))
+* **Android HTTP client** -- `AndroidA2AHttpClient` using `HttpURLConnection` makes the SDK usable on Android ([1.0.0.CR1](https://quarkus.io/blog/a2a-java-sdk-1-0-0-cr1-released/))
+* **Spec-compliant SSE parser** -- a robust `ServerSentEvent` record with full SSE spec compliance ([1.0.0.CR1](https://quarkus.io/blog/a2a-java-sdk-1-0-0-cr1-released/))
+
+### Quality
+
+* **JSpecify null-safety annotations** throughout the spec module
+* **Comprehensive Javadoc** on all public API classes
+* **TCK conformance** across all three transports for both v1.0 and v0.3 protocols
+* **ITK cross-SDK interoperability testing** (Final)
+
+## Contributors
+
+The 1.0.0 series had 17 contributors across all pre-releases. Thank you all for your code, reviews, and feedback!
+
+[@brucearctor](https://github.com/brucearctor), [@CharlieZhang1999](https://github.com/CharlieZhang1999), [@dwieliczko](https://github.com/dwieliczko), [@ehsavoie](https://github.com/ehsavoie), [@HarshaRamesh11](https://github.com/HarshaRamesh11), [@jmesnil](https://github.com/jmesnil), [@kabir](https://github.com/kabir), [@Lirons01](https://github.com/Lirons01), [@LiZongbo](https://github.com/LiZongbo), [@luke-j-smith](https://github.com/luke-j-smith), [@maff](https://github.com/maff), [@neo1027144-creator](https://github.com/neo1027144-creator), [@pratik3558](https://github.com/pratik3558), [@RainYuY](https://github.com/RainYuY), [@sherryfox](https://github.com/sherryfox), [@tsabau](https://github.com/tsabau), [@yyy9942](https://github.com/yyy9942)
+
+## Resources
+
+* [Release Notes on GitHub](https://github.com/a2aproject/a2a-java/releases/tag/v1.0.0.Final)
+* [Maven Central](https://central.sonatype.com/artifact/org.a2aproject.sdk/a2a-java-sdk-parent/1.0.0.Final)
+* [JavaDoc](https://javadoc.io/doc/org.a2aproject.sdk/)
+* [A2A Specification](https://a2a-protocol.org/v1.0.0/specification/)
+* [Examples](https://github.com/a2aproject/a2a-java/tree/main/examples)
+
+## Come Join Us
+
+We value your feedback a lot so please report bugs, ask for improvements etc. Let's build something great together!
+
+If you are an A2A Java SDK user or just curious, don't be shy and join our welcoming community:
+
+* provide feedback on [GitHub](https://github.com/a2aproject/a2a-java/issues);
+* craft some code and [push a PR](https://github.com/a2aproject/a2a-java/pulls);
+* discuss with us in the `#a2a-java` channel on [Discord](https://discord.gg/jTtSkJB74Q);
diff --git a/docs/content/server.md b/docs/content/server.md
new file mode 100644
index 000000000..f74708820
--- /dev/null
+++ b/docs/content/server.md
@@ -0,0 +1,254 @@
+---
+title: A2A Server Guide
+description: Run your agentic Java application as an A2A server following the Agent2Agent Protocol.
+layout: page
+---
+
+# A2A Server
+
+The A2A Java SDK provides a Java server implementation of the [Agent2Agent (A2A) Protocol](https://a2a-protocol.org/). To run your agentic Java application as an A2A server, follow the steps below.
+
+## Supported Transports
+
+- JSON-RPC 2.0
+- gRPC
+- HTTP+JSON/REST
+
+## 1. Add a Server Dependency
+
+### JSON-RPC
+
+```xml
+
+ org.a2aproject.sdk
+ a2a-java-sdk-reference-jsonrpc
+
+ $\{org.a2aproject.sdk.version}
+
+```
+
+### gRPC
+
+```xml
+
+ org.a2aproject.sdk
+ a2a-java-sdk-reference-grpc
+ $\{org.a2aproject.sdk.version}
+
+```
+
+### HTTP+JSON/REST
+
+```xml
+
+ org.a2aproject.sdk
+ a2a-java-sdk-reference-rest
+ $\{org.a2aproject.sdk.version}
+
+```
+
+You can add more than one transport dependency to support multiple protocols simultaneously.
+
+## 2. Define an Agent Card
+
+```java
+@ApplicationScoped
+public class WeatherAgentCardProducer {
+
+ private static final String AGENT_URL = "http://localhost:10001";
+
+ @Produces
+ @PublicAgentCard
+ public AgentCard agentCard() {
+ return AgentCard.builder()
+ .name("Weather Agent")
+ .description("Helps with weather")
+ .supportedInterfaces(List.of(
+ new AgentInterface(TransportProtocol.JSONRPC.asString(), AGENT_URL)))
+ .version("1.0.0")
+ .capabilities(AgentCapabilities.builder()
+ .streaming(true)
+ .pushNotifications(false)
+ .build())
+ .defaultInputModes(Collections.singletonList("text"))
+ .defaultOutputModes(Collections.singletonList("text"))
+ .skills(Collections.singletonList(AgentSkill.builder()
+ .id("weather_search")
+ .name("Search weather")
+ .description("Helps with weather in cities or states")
+ .tags(Collections.singletonList("weather"))
+ .examples(List.of("weather in LA, CA"))
+ .build()))
+ .build();
+ }
+}
+```
+
+## 3. Implement an Agent Executor
+
+```java
+@ApplicationScoped
+public class WeatherAgentExecutorProducer {
+
+ @Inject
+ WeatherAgent weatherAgent;
+
+ @Produces
+ public AgentExecutor agentExecutor() {
+ return new WeatherAgentExecutor(weatherAgent);
+ }
+
+ private static class WeatherAgentExecutor implements AgentExecutor {
+
+ private final WeatherAgent weatherAgent;
+
+ public WeatherAgentExecutor(WeatherAgent weatherAgent) {
+ this.weatherAgent = weatherAgent;
+ }
+
+ @Override
+ public void execute(RequestContext context, AgentEmitter agentEmitter) throws JSONRPCError {
+ if (context.getTask() == null) {
+ agentEmitter.submit();
+ }
+ agentEmitter.startWork();
+
+ String userMessage = extractTextFromMessage(context.getMessage());
+ String response = weatherAgent.chat(userMessage);
+
+ agentEmitter.addArtifact(List.of(new TextPart(response)));
+ agentEmitter.complete();
+ }
+
+ @Override
+ public void cancel(RequestContext context, AgentEmitter agentEmitter) throws JSONRPCError {
+ Task task = context.getTask();
+ if (task == null) {
+ agentEmitter.cancel();
+ return;
+ }
+ if (task.getStatus().state() == TaskState.CANCELED ||
+ task.getStatus().state() == TaskState.COMPLETED) {
+ throw new TaskNotCancelableError();
+ }
+ agentEmitter.cancel();
+ }
+
+ private String extractTextFromMessage(Message message) {
+ if (message == null) {
+ return "";
+ }
+ StringBuilder textBuilder = new StringBuilder();
+ for (Part> part : message.parts()) {
+ if (part instanceof TextPart textPart) {
+ textBuilder.append(textPart.text());
+ }
+ }
+ return textBuilder.toString();
+ }
+ }
+}
+```
+
+## 4. Configuration
+
+The SDK uses `META-INF/a2a-defaults.properties` for defaults. Override via `application.properties` when using Quarkus/MicroProfile Config:
+
+```properties
+# Thread pool for async/streaming operations
+a2a.executor.core-pool-size=5
+a2a.executor.max-pool-size=50
+a2a.executor.keep-alive-seconds=60
+
+# Timeouts for blocking calls
+a2a.blocking.agent.timeout.seconds=30
+a2a.blocking.consumption.timeout.seconds=5
+```
+
+For LLM-based agents, increase `a2a.blocking.agent.timeout.seconds` to 60–120 seconds.
+
+## 5. Task Authorization (Optional)
+
+Implement `TaskAuthorizationProvider` to control per-user access:
+
+```java
+@ApplicationScoped
+public class MyTaskAuthorizationProvider implements TaskAuthorizationProvider {
+
+ @Override
+ public boolean checkRead(ServerCallContext context, String taskId, TaskOperation op) {
+ return isOwner(context.getUser(), taskId);
+ }
+
+ @Override
+ public boolean checkWrite(ServerCallContext context, String taskId, TaskOperation op) {
+ return isOwner(context.getUser(), taskId);
+ }
+
+ @Override
+ public boolean checkCreate(ServerCallContext context, TaskOperation op) {
+ return context.getUser().isAuthenticated();
+ }
+
+ @Override
+ public boolean isTaskRecorded(String taskId) {
+ return ownershipStore.contains(taskId);
+ }
+
+ @Override
+ public void recordOwnership(ServerCallContext context, String taskId, TaskOperation op) {
+ ownershipStore.put(taskId, context.getUser().getUsername());
+ }
+}
+```
+
+The SDK discovers the bean via CDI automatically — no additional wiring needed.
+
+| Operation | Authorization check |
+|-----------|---------------------|
+| `getTask`, `subscribeToTask`, `getTaskPushNotificationConfig`, `listTaskPushNotificationConfigs` | `checkRead` |
+| `cancelTask`, `createTaskPushNotificationConfig`, `deleteTaskPushNotificationConfig` | `checkWrite` |
+| `messageSend` / `messageSendStream` (existing task) | `checkWrite` |
+| `messageSend` / `messageSendStream` (new task) | `checkCreate`, then `recordOwnership` |
+| `listTasks` | `checkRead` per task |
+
+## Backward Compatibility with v0.3
+
+Add compat modules alongside v1.0 modules to serve both protocol versions simultaneously. No changes to your `AgentExecutor` are needed.
+
+### Multi-Version Module (recommended)
+
+```xml
+
+
+ org.a2aproject.sdk
+ a2a-java-sdk-reference-multiversion-jsonrpc
+ $\{org.a2aproject.sdk.version}
+
+
+
+
+ org.a2aproject.sdk
+ a2a-java-sdk-reference-multiversion-rest
+ $\{org.a2aproject.sdk.version}
+
+```
+
+### Individual Compat Modules
+
+```xml
+
+ org.a2aproject.sdk
+ a2a-java-sdk-compat-0.3-reference-jsonrpc
+ $\{org.a2aproject.sdk.version}
+
+```
+
+Version routing uses the `A2A-Version` HTTP header for JSON-RPC and REST; for gRPC it is implicit via protobuf package name.
+
+## Server Integrations
+
+- **Quarkus** — Reference implementations are Quarkus-based (JSON-RPC, gRPC, REST)
+- **Jakarta EE** — [a2a-jakarta](https://github.com/wildfly-extras/a2a-jakarta) works with any Jakarta EE Web Profile runtime
+
+See [CONTRIBUTING_INTEGRATIONS.md](https://github.com/a2aproject/a2a-java/blob/main/CONTRIBUTING_INTEGRATIONS.md) to submit your own integration.
diff --git a/docs/data/authors.yml b/docs/data/authors.yml
new file mode 100644
index 000000000..1d6796acd
--- /dev/null
+++ b/docs/data/authors.yml
@@ -0,0 +1,23 @@
+ehsavoie:
+ name: "Emmanuel Hugonnet"
+ nickname: "ehsavoie"
+ job: "Software Engineer"
+ bio: "Emmanuel works at Red Hat on WildFly Messaging integration. He currently works on the WildFly AI feature pack and support for Eclipse Che."
+ avatar: ehsavoie.png
+ twitter: "ehsavoie"
+ profile: "https://github.com/ehsavoie"
+jmesnil:
+ name: "Jeff Mesnil"
+ nickname: "jmesnil"
+ job: "Software Engineer"
+ avatar: jmesnil.jpg
+ twitter: "jmesnil"
+ profile: "https://github.com/jmesnil"
+kkhan:
+ name: "Kabir Khan"
+ nickname: "kkhan"
+ job: "Software Engineer"
+ bio: "Kabir started using JBoss back in 2000, and joined the team in 2004. Since then he has worked on JBoss AS/WildFly as a core developer."
+ avatar: kkhan.jpg
+ profile: "https://github.com/kabir"
+
diff --git a/docs/data/menu.yml b/docs/data/menu.yml
new file mode 100644
index 000000000..f33b87e00
--- /dev/null
+++ b/docs/data/menu.yml
@@ -0,0 +1,37 @@
+items:
+ - title: "Home"
+ path: "/"
+ icon: "fa-solid fa-house"
+ - title: "Announcements"
+ path: "/announces"
+ icon: "fa-regular fa-newspaper"
+ - title: "Documentation"
+ type: "group"
+ icon: "fa-solid fa-book"
+ - title: "Server"
+ path: "/server"
+ icon: "fa-solid fa-server"
+ group: "documentation"
+ - title: "Client"
+ path: "/client"
+ icon: "fa-solid fa-plug"
+ group: "documentation"
+ - title: "Javadoc"
+ path: "https://javadoc.io/doc/org.a2aproject.sdk"
+ icon: "fa-solid fa-file-code"
+ group: "documentation"
+ target: "_blank"
+ - title: "Community"
+ path: "/community"
+ icon: "fa-solid fa-users"
+ - title: "Contributing"
+ path: "/contributing"
+ icon: "fa-solid fa-code-pull-request"
+ - title: "A2A Protocol"
+ path: "https://a2a-protocol.org/latest/"
+ icon: "fa-solid fa-arrow-up-right-from-square"
+ target: "_blank"
+ - title: "GitHub"
+ path: "https://github.com/a2aproject/a2a-java"
+ icon: "fa-brands fa-github"
+ target: "_blank"
\ No newline at end of file
diff --git a/docs/pom.xml b/docs/pom.xml
new file mode 100644
index 000000000..9d500b8e5
--- /dev/null
+++ b/docs/pom.xml
@@ -0,0 +1,132 @@
+
+
+ 4.0.0
+
+
+ org.a2aproject.sdk
+ a2a-java-sdk-parent
+ 1.0.1.Final-SNAPSHOT
+ ../pom.xml
+
+
+ a2a-java-sdk-jsonrpc-common
+ quarkus
+
+
+ UTF-8
+ true
+
+
+
+
+
+ io.quarkus.platform
+ quarkus-bom
+ ${quarkus.platform.version}
+ pom
+ import
+
+
+
+
+
+
+ io.quarkiverse.roq
+ quarkus-roq
+ 2.1.4
+
+
+ io.quarkiverse.roq
+ quarkus-roq-plugin-tagging
+ 2.1.4
+
+
+ io.quarkiverse.roq
+ quarkus-roq-theme-default
+ 2.1.4
+
+
+ io.quarkiverse.roq
+ quarkus-roq-plugin-markdown
+ 2.1.4
+
+
+ io.quarkus
+ quarkus-arc
+
+
+ org.mvnpm
+ highlight.js
+ 11.11.1
+ provided
+
+
+ org.mvnpm
+ highlightjs-copy
+ 1.0.6
+ provided
+
+
+ io.quarkus
+ quarkus-junit
+ test
+
+
+
+
+
+
+ io.quarkus.platform
+ quarkus-maven-plugin
+ ${quarkus.platform.version}
+ true
+
+
+ maven-surefire-plugin
+
+ @{argLine}
+
+ org.jboss.logmanager.LogManager
+ ${maven.home}
+
+
+
+
+ maven-failsafe-plugin
+ ${maven-surefire-plugin.version}
+
+
+
+ integration-test
+ verify
+
+
+
+
+ @{argLine}
+
+ ${project.build.directory}/${project.build.finalName}-runner
+ org.jboss.logmanager.LogManager
+ ${maven.home}
+
+
+
+
+
+
+
+
+ native
+
+
+ native
+
+
+
+ false
+ false
+ true
+
+
+
+
diff --git a/docs/public/images/a2a-java-sdk.png b/docs/public/images/a2a-java-sdk.png
new file mode 100644
index 000000000..5975f1c25
Binary files /dev/null and b/docs/public/images/a2a-java-sdk.png differ
diff --git a/docs/public/images/apple-touch-icon.png b/docs/public/images/apple-touch-icon.png
new file mode 100644
index 000000000..f00ce6a25
Binary files /dev/null and b/docs/public/images/apple-touch-icon.png differ
diff --git a/docs/public/images/ehsavoie.png b/docs/public/images/ehsavoie.png
new file mode 100755
index 000000000..f2a0bb64e
Binary files /dev/null and b/docs/public/images/ehsavoie.png differ
diff --git a/docs/public/images/favicon.ico b/docs/public/images/favicon.ico
new file mode 100644
index 000000000..a6f2cddca
Binary files /dev/null and b/docs/public/images/favicon.ico differ
diff --git a/docs/public/images/favicon.svg b/docs/public/images/favicon.svg
new file mode 100644
index 000000000..2e3295962
--- /dev/null
+++ b/docs/public/images/favicon.svg
@@ -0,0 +1,601 @@
+
+
\ No newline at end of file
diff --git a/docs/public/images/jmesnil.jpg b/docs/public/images/jmesnil.jpg
new file mode 100755
index 000000000..9a8c114a2
Binary files /dev/null and b/docs/public/images/jmesnil.jpg differ
diff --git a/docs/public/images/kkhan.jpg b/docs/public/images/kkhan.jpg
new file mode 100644
index 000000000..9033a0b53
Binary files /dev/null and b/docs/public/images/kkhan.jpg differ
diff --git a/docs/public/images/logo.svg b/docs/public/images/logo.svg
new file mode 100644
index 000000000..193e6302c
--- /dev/null
+++ b/docs/public/images/logo.svg
@@ -0,0 +1,601 @@
+
+
\ No newline at end of file
diff --git a/docs/public/images/mascot.svg b/docs/public/images/mascot.svg
new file mode 100644
index 000000000..456fec120
--- /dev/null
+++ b/docs/public/images/mascot.svg
@@ -0,0 +1,616 @@
+
+
\ No newline at end of file
diff --git a/docs/src/main/resources/application.properties b/docs/src/main/resources/application.properties
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/src/main/resources/templates/partials/roq-default/head-scripts.html b/docs/src/main/resources/templates/partials/roq-default/head-scripts.html
new file mode 100644
index 000000000..50555f4f8
--- /dev/null
+++ b/docs/src/main/resources/templates/partials/roq-default/head-scripts.html
@@ -0,0 +1,51 @@
+{@java.lang.String tag}
+
+{#bundle /}
+
+{#if site.data.containsKey("analytics")}
+{#ga4 tag=site.data.getJsonObject('analytics').getString("ga4", "") /}
+{/if}
+
+
diff --git a/docs/src/main/resources/templates/partials/roq-default/sidebar-menu.html b/docs/src/main/resources/templates/partials/roq-default/sidebar-menu.html
new file mode 100644
index 000000000..0ca55d6de
--- /dev/null
+++ b/docs/src/main/resources/templates/partials/roq-default/sidebar-menu.html
@@ -0,0 +1,16 @@
+{@io.quarkiverse.roq.frontmatter.runtime.model.Site site}
+{@java.util.List menu}
+{@java.lang.String menuTitle}
+
+
+
{menuTitle ?: 'MENU'}
+
+ {#for item in menu}
+ {#if item.getString("type")??}
+