diff --git a/samples/eventhubs-eventgrid/python/README.md b/samples/eventhubs-eventgrid/python/README.md
index ed27aba..2e39b26 100644
--- a/samples/eventhubs-eventgrid/python/README.md
+++ b/samples/eventhubs-eventgrid/python/README.md
@@ -9,24 +9,41 @@ Blob Storage as Avro. The moment an archive lands, Event Hubs raises
notification **into a second event hub**, and a Function App triggered on that hub downloads the
archive, aggregates it per device, and writes summaries to a curated hub.
-```
- devices ──▶ telemetry hub ──── Capture (60s window) ────▶ Avro archive in Blob Storage
- │ │
- │ Microsoft.EventHub.CaptureFileCreated
- │ ▼
- │ Event Grid system topic
- │ │
- │ subscription, EventHub destination
- │ ▼
- │ capture-notifications hub
- │ │
- │ Event Hubs trigger
- │ ▼
- └───────────── archive read back ──────────── Function App
- │
- Event Hubs output binding
- ▼
- curated hub
+## Architecture
+
+The following diagram illustrates the architecture of the solution:
+
+```mermaid
+flowchart LR
+ devices["Devices
telemetry_producer.py"]
+
+ subgraph ehns["Event Hubs namespace"]
+ telemetry[["telemetry hub
4 partitions, Capture enabled"]]
+ notifications[["capture-notifications hub
2 partitions"]]
+ curated[["curated hub
2 partitions"]]
+ end
+
+ subgraph storage["Storage Account"]
+ archive[("telemetry-archive container
Avro archives")]
+ end
+
+ subgraph eventgrid["Event Grid"]
+ topic["System topic
(over the namespace)"]
+ subscription["capture-to-eventhub subscription
(Event Hub destination)"]
+ end
+
+ subgraph funcapp["Function App"]
+ processor["CaptureProcessor
(Event Hubs trigger)"]
+ end
+
+ devices -->|"1: AMQP, partition key = device_id"| telemetry
+ telemetry -->|"2: Capture (60 s window, Avro)"| archive
+ telemetry -->|"3: Microsoft.EventHub.CaptureFileCreated"| topic
+ topic --> subscription
+ subscription -->|"4: delivered as an event"| notifications
+ notifications -->|"5: trigger (capture-processor group)"| processor
+ processor -->|"6: read archive (data.fileUrl)"| archive
+ processor -->|"7: per-device summaries (output binding)"| curated
```
## Why this shape
diff --git a/samples/eventhubs/python/README.md b/samples/eventhubs/python/README.md
index 6d67beb..1eb3835 100644
--- a/samples/eventhubs/python/README.md
+++ b/samples/eventhubs/python/README.md
@@ -10,28 +10,50 @@ The sample is built around the properties that make Event Hubs different from a
## Architecture
-```
- Producers (outside Azure) LocalStack for Azure
- ┌───────────────────────┐ ┌──────────────────────────────────────────────┐
- │ POS terminals │ AMQP │ Event Hubs namespace (Standard, Kafka on) │
- │ producer_amqp.py ├───────►│ │
- │ │ │ payments hub ─ 4 partitions ─── Capture ───┼──► Blob Storage
- │ Legacy gateway │ Kafka │ consumer groups: │ Avro archives
- │ producer_kafka.py ├───────►│ fraud-detector ──┐ analytics audit │ (cold path)
- │ │ │ │ │
- │ ATM / IoT devices │ HTTPS │ ▼ │
- │ producer_http.py ├───────►│ Function App (Python) │
- └───────────────────────┘ │ Event Hubs trigger │
- │ fraud rules ──────┐ │
- │ ▼ │
- │ fraud-alerts hub ─ 2 partitions │
- │ ▲ │
- │ Key Vault: connection strings │ │
- │ Schema Registry: Avro contract│ │
- │ App Insights + Log Analytics │ │
- │ │ │
- │ Web App ── operations dashboard │
- └──────────────────────────────────────────────┘
+The following diagram illustrates the architecture of the solution:
+
+```mermaid
+flowchart LR
+ subgraph producers["External producers"]
+ pos["POS terminals
producer_amqp.py"]
+ gateway["Legacy gateway
producer_kafka.py"]
+ atm["ATM / IoT devices
producer_http.py"]
+ end
+
+ subgraph ehns["Event Hubs namespace (Standard, Kafka enabled)"]
+ payments[["payments hub
4 partitions
groups: fraud-detector, analytics, audit"]]
+ alerts[["fraud-alerts hub
2 partitions"]]
+ registry["Schema Registry
payments-schemas (Avro)"]
+ end
+
+ subgraph funcapp["Function App"]
+ detector["FraudDetector
(Event Hubs trigger, batched)"]
+ end
+
+ subgraph storage["Storage Account"]
+ archive[("payments-archive container
Avro archives, cold path")]
+ checkpoints[("checkpoint blobs")]
+ end
+
+ kv["Key Vault
connection-string secrets
(stored at deploy)"]
+ dashboard["Web App
operations dashboard"]
+ monitor["Application Insights +
Log Analytics"]
+
+ pos -->|"1: AMQP"| payments
+ gateway -->|"1: Kafka"| payments
+ atm -->|"1: HTTPS"| payments
+ producers -.->|"register Avro contract"| registry
+
+ payments -->|"2: trigger (fraud-detector group)"| detector
+ detector -->|"3: alerts (output binding)"| alerts
+ detector -.->|"checkpoints"| checkpoints
+ payments -->|"Capture (60 s / 10 MB, Avro)"| archive
+
+ dashboard -.->|"partition state, alerts, schemas"| ehns
+ dashboard -.->|"checkpoints, archives"| storage
+ ehns -.-> kv
+ funcapp -.->|"telemetry"| monitor
+ dashboard -.->|"telemetry"| monitor
```
**Deployment flow.** The deploy script creates Log Analytics and Application Insights, a
diff --git a/samples/servicebus/java/README.md b/samples/servicebus/java/README.md
index a4b3fed..d465c98 100644
--- a/samples/servicebus/java/README.md
+++ b/samples/servicebus/java/README.md
@@ -7,6 +7,23 @@ This sample demonstrates a Java Spring Boot application that sends and receives
## Architecture
+The following diagram illustrates the architecture of the solution:
+
+```mermaid
+flowchart LR
+ subgraph host["Host machine"]
+ app["Spring Boot app
ServiceBusSenderClient + @ServiceBusListener"]
+ end
+
+ subgraph sbns["Service Bus namespace (Standard)"]
+ queue[["myqueue"]]
+ end
+
+ app -->|"1: send 'Hello, World!'"| queue
+ queue -->|"2: deliver to @ServiceBusListener"| app
+ app -.->|"authenticates with AZURE_SERVICEBUS_CONNECTION_STRING"| sbns
+```
+
The solution is composed of the following Azure resources:
1. [Azure Resource Group](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-cli): A logical container scoping all resources in this sample.