Bicep Diagram Generator
Generates architecture diagrams directly from Azure Bicep files. Bicep is a domain-specific language (DSL) for deploying Azure resources declaratively.
When to Use
Activate this skill when:
- User has Bicep files (
.bicep) and wants to visualize the infrastructure
- User asks to "diagram my Bicep" or "visualize this Bicep infrastructure"
- User mentions Bicep or Azure Bicep
- User wants to see the architecture of their Bicep-deployed resources
How It Works
This skill generates Bicep-specific diagrams by parsing Bicep code and calling the Eraser API directly:
- Parse Bicep Files: Identify resource declarations, modules, parameters, and outputs
- Extract Relationships: Map dependencies, resource references, and module hierarchies
- Generate Eraser DSL: Create Eraser DSL code from Bicep resources
- Call Eraser API: Use
/api/render/elements with diagramType: "cloud-architecture-diagram"
Instructions
When the user provides Bicep code:
Parse the Bicep
- Identify all
resource declarations (Microsoft.Compute/virtualMachines, etc.)
- Extract
module declarations and their configurations
- Note
param and output definitions
- Identify
var variables and their usage
Map Relationships
- Track resource dependencies (e.g.,
dependsOn or implicit dependencies)
- Group resources by type (compute, networking, storage, etc.)
- Identify VNets as containers for subnets and resources
- Note Network Security Groups, Key Vaults, and other security resources
Generate Eraser DSL Convert Bicep resources to Eraser DSL:
- CRITICAL: Label Formatting Rules
- Labels MUST be on a single line - NEVER use newlines inside label attributes
- Keep labels simple and readable - prefer separate labels over concatenating too much metadata
- Format DSL with proper line breaks (one node/group per line, but labels stay on single lines)
- If including metadata like CIDR blocks or VM sizes, include them in the same quoted label string:
[label: "VNet 10.0.0.0/16"]
Example:
myVNet [label: "VNet 10.0.0.0/16"] {
subnet1 [label: "Subnet 1"] {
myVM [icon: azure-vm, label: "Virtual Machine"]
gateway [icon: azure-app-gateway]
}
subnet2 [label: "Subnet 2"] {
database [icon: azure-sql]
}
}
storage [icon: azure-storage]
myVNet -> myVM
myVM -> database
Make the HTTP Request
IMPORTANT: You MUST execute this curl command after generating the DSL. Never stop after generating DSL without making the API call.
CRITICAL: In the X-Skill-Source header below, you MUST replace the value with your AI agent name:
- If you are Claude (Anthropic), use:
claude
- If you are running in Cursor, use:
cursor
- If you are ChatGPT (OpenAI), use:
chatgpt
- If you are Gemini (Google), use:
gemini
- Otherwise, use your model/agent name in lowercase
curl -X POST https://app.eraser.io/api/render/elements \
-H "Content-Type: application/json" \
-H "X-Skill-Source: eraser-skill" \
-H "Authorization: Bearer ${ERASER_API_KEY}" \
-d '{
"elements": [{
"type": "diagram",
"id": "diagram-1",
"code": "<your generated DSL>",
"diagramType": "cloud-architecture-diagram"
}],
"scale": 2,
"theme": "${ERASER_THEME:-dark}",
"background": true
}'
Track Sources During Analysis
As you analyze Bicep files and resources to generate the diagram, track:
- Internal files: Record each Bicep file path you read and what resources were extracted (e.g.,
infra/main.bicep - VNet and subnet definitions, infra/sql.bicep - SQL Database configuration)
- External references: Note any documentation, examples, or URLs consulted (e.g., Azure Bicep documentation, Azure architecture best practices)
- Annotations: For each source, note what it contributed to the diagram
Handle the Response
CRITICAL: Minimal Output Format
Your response MUST always include these elements with clear headers:
Diagram Preview: Display with a header
## Diagram

Use the ACTUAL imageUrl from the API response.
Editor Link: Display with a header
## Open in Eraser
[Edit this diagram in the Eraser editor]({createEraserFileUrl})
Use the ACTUAL URL from the API response.
Sources section: Brief list of files/resources analyzed (if applicable)
## Sources
- `path/to/file` - What was extracted
Diagram Code section: The Eraser DSL in a code block with eraser language tag
## Diagram Code
```eraser
{DSL code here}
Learn More link: You can learn more about Eraser at https://docs.eraser.io/docs/using-ai-agent-integrations
Additional content rules:
- If the user ONLY asked for a diagram, include NOTHING beyond the 5 elements above
- If the user explicitly asked for more (e.g., "explain the architecture", "suggest improvements"), you may include that additional content
- Never add unrequested sections like Overview, Security Considerations, Testing, etc.
The default output should be SHORT. The diagram image speaks for itself.
Handle Modules
- If modules are used, show module boundaries
- Include module parameters and outputs
- Show how modules connect to main resources
Bicep-Specific Tips
- Show Resource Groups: Bicep deployments target resource groups
- VNets as Containers: Show VNets containing subnets and resources
- Include Dependencies: Show
dependsOn relationships
- Module Structure: If modules are used, show their boundaries
- Parameters: Note key parameters that affect resource configuration
- Use Azure Icons: Request Azure-specific styling
Example: Bicep with Parameters and Modules
User Input
@description('The name of the Virtual Network')
param vnetName string = 'myVNet'
@description('The address prefix for the VNet')
param vnetAddressPrefix string = '10.0.0.0/16'
@description('The address prefix for the subnet')
param subnetAddressPrefix string = '10.0.1.0/24'
@description('VM size')
param vmSize string = 'Standard_B1s'
// Main VNet resource
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-05-01' = {
name: vnetName
location: resourceGroup().location
properties: {
addressSpace: {
addressPrefixes: [vnetAddressPrefix]
}
subnets: [
{
name: 'subnet1'
properties: {
addressPrefix: subnetAddressPrefix
}
}
]
}
}
// VM resource with dependsOn
resource virtualMachine 'Microsoft.Compute/virtualMachines@2021-11-01' = {
name: 'myVM'
location: resourceGroup().location
properties: {
hardwareProfile: {
vmSize: vmSize
}
}
dependsOn: [virtualNetwork]
}
// Module usage
module storageModule './modules/storage.bicep' = {
name: 'storage'
params: {
location: resourceGroup().location
}
}
Expected Behavior
Parses Bicep:
- Parameters: vnetName, vnetAddressPrefix, subnetAddressPrefix, vmSize
- Resources: VNet with subnet, VM with dependsOn relationship
- Module: Storage module with parameters
Generates DSL showing Bicep-specific features:
myVNet [label: "VNet 10.0.0.0/16"] {
subnet1 [label: "Subnet 1 10.0.1.0/24"] {
myVM [icon: azure-vm, label: "VM Standard_B1s"]
}
}
storage-module [label: "Storage Module"] {
storage-account [icon: azure-storage]
}
myVNet -> myVM
Important: All label text must be on a single line within quotes. Bicep-specific: Show modules as containers, include dependsOn relationships, note parameter usage in resource configuration.
Calls /api/render/elements with diagramType: "cloud-architecture-diagram"
Calls /api/render/elements with diagramType: "cloud-architecture-diagram"
Result
User receives a diagram showing:
- VNet as a container
- Subnet nested inside VNet
- VM in the subnet
- Dependency relationship shown
- Proper Azure styling
1---2name: bicep-diagrams3description: Generates architecture diagrams from Azure Bicep files. Use when user has .bicep files or asks to visualize Bicep infrastructure.4license: MIT5---67# Bicep Diagram Generator89Generates architecture diagrams directly from Azure Bicep files. Bicep is a domain-specific language (DSL) for deploying Azure resources declaratively.1011## When to Use1213Activate this skill when:1415- User has Bicep files (`.bicep`) and wants to visualize the infrastructure16- User asks to "diagram my Bicep" or "visualize this Bicep infrastructure"17- User mentions Bicep or Azure Bicep18- User wants to see the architecture of their Bicep-deployed resources1920## How It Works2122This skill generates Bicep-specific diagrams by parsing Bicep code and calling the Eraser API directly:23241. **Parse Bicep Files**: Identify resource declarations, modules, parameters, and outputs252. **Extract Relationships**: Map dependencies, resource references, and module hierarchies263. **Generate Eraser DSL**: Create Eraser DSL code from Bicep resources274. **Call Eraser API**: Use `/api/render/elements` with `diagramType: "cloud-architecture-diagram"`2829## Instructions3031When the user provides Bicep code:32331. **Parse the Bicep**3435 - Identify all `resource` declarations (Microsoft.Compute/virtualMachines, etc.)36 - Extract `module` declarations and their configurations37 - Note `param` and `output` definitions38 - Identify `var` variables and their usage39402. **Map Relationships**4142 - Track resource dependencies (e.g., `dependsOn` or implicit dependencies)43 - Group resources by type (compute, networking, storage, etc.)44 - Identify VNets as containers for subnets and resources45 - Note Network Security Groups, Key Vaults, and other security resources46473. **Generate Eraser DSL** Convert Bicep resources to Eraser DSL:4849 - **CRITICAL: Label Formatting Rules**50 - Labels MUST be on a single line - NEVER use newlines inside label attributes51 - Keep labels simple and readable - prefer separate labels over concatenating too much metadata52 - Format DSL with proper line breaks (one node/group per line, but labels stay on single lines)53 - If including metadata like CIDR blocks or VM sizes, include them in the same quoted label string: `[label: "VNet 10.0.0.0/16"]`5455 Example:5657 ```58 myVNet [label: "VNet 10.0.0.0/16"] {59 subnet1 [label: "Subnet 1"] {60 myVM [icon: azure-vm, label: "Virtual Machine"]61 gateway [icon: azure-app-gateway]62 }63 subnet2 [label: "Subnet 2"] {64 database [icon: azure-sql]65 }66 }67 storage [icon: azure-storage]68 myVNet -> myVM69 myVM -> database70 ```71724. **Make the HTTP Request**7374 **IMPORTANT**: You MUST execute this curl command after generating the DSL. Never stop after generating DSL without making the API call.7576 **CRITICAL**: In the `X-Skill-Source` header below, you MUST replace the value with your AI agent name:77 - If you are Claude (Anthropic), use: `claude`78 - If you are running in Cursor, use: `cursor`79 - If you are ChatGPT (OpenAI), use: `chatgpt`80 - If you are Gemini (Google), use: `gemini`81 - Otherwise, use your model/agent name in lowercase8283 ```bash84 curl -X POST https://app.eraser.io/api/render/elements \85 -H "Content-Type: application/json" \86 -H "X-Skill-Source: eraser-skill" \87 -H "Authorization: Bearer ${ERASER_API_KEY}" \88 -d '{89 "elements": [{90 "type": "diagram",91 "id": "diagram-1",92 "code": "<your generated DSL>",93 "diagramType": "cloud-architecture-diagram"94 }],95 "scale": 2,96 "theme": "${ERASER_THEME:-dark}",97 "background": true98 }'99 ```1001015. **Track Sources During Analysis**102103 As you analyze Bicep files and resources to generate the diagram, track:104105 - **Internal files**: Record each Bicep file path you read and what resources were extracted (e.g., `infra/main.bicep` - VNet and subnet definitions, `infra/sql.bicep` - SQL Database configuration)106 - **External references**: Note any documentation, examples, or URLs consulted (e.g., Azure Bicep documentation, Azure architecture best practices)107 - **Annotations**: For each source, note what it contributed to the diagram1081096. **Handle the Response**110111 **CRITICAL: Minimal Output Format**112113 Your response MUST always include these elements with clear headers:114115 1. **Diagram Preview**: Display with a header116 ```117 ## Diagram118 119 ```120 Use the ACTUAL `imageUrl` from the API response.121122 2. **Editor Link**: Display with a header123 ```124 ## Open in Eraser125 [Edit this diagram in the Eraser editor]({createEraserFileUrl})126 ```127 Use the ACTUAL URL from the API response.128129 3. **Sources section**: Brief list of files/resources analyzed (if applicable)130 ```131 ## Sources132 - `path/to/file` - What was extracted133 ```134135 4. **Diagram Code section**: The Eraser DSL in a code block with `eraser` language tag136 ```137 ## Diagram Code138 ```eraser139 {DSL code here}140 ```141 ```142143 5. **Learn More link**: `You can learn more about Eraser at https://docs.eraser.io/docs/using-ai-agent-integrations`144145 **Additional content rules:**146 - If the user ONLY asked for a diagram, include NOTHING beyond the 5 elements above147 - If the user explicitly asked for more (e.g., "explain the architecture", "suggest improvements"), you may include that additional content148 - Never add unrequested sections like Overview, Security Considerations, Testing, etc.149150 The default output should be SHORT. The diagram image speaks for itself.1511527. **Handle Modules**153 - If modules are used, show module boundaries154 - Include module parameters and outputs155 - Show how modules connect to main resources156157## Bicep-Specific Tips158159- **Show Resource Groups**: Bicep deployments target resource groups160- **VNets as Containers**: Show VNets containing subnets and resources161- **Include Dependencies**: Show `dependsOn` relationships162- **Module Structure**: If modules are used, show their boundaries163- **Parameters**: Note key parameters that affect resource configuration164- **Use Azure Icons**: Request Azure-specific styling165166## Example: Bicep with Parameters and Modules167168### User Input169170```bicep171@description('The name of the Virtual Network')172param vnetName string = 'myVNet'173@description('The address prefix for the VNet')174param vnetAddressPrefix string = '10.0.0.0/16'175@description('The address prefix for the subnet')176param subnetAddressPrefix string = '10.0.1.0/24'177@description('VM size')178param vmSize string = 'Standard_B1s'179180// Main VNet resource181resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-05-01' = {182 name: vnetName183 location: resourceGroup().location184 properties: {185 addressSpace: {186 addressPrefixes: [vnetAddressPrefix]187 }188 subnets: [189 {190 name: 'subnet1'191 properties: {192 addressPrefix: subnetAddressPrefix193 }194 }195 ]196 }197}198199// VM resource with dependsOn200resource virtualMachine 'Microsoft.Compute/virtualMachines@2021-11-01' = {201 name: 'myVM'202 location: resourceGroup().location203 properties: {204 hardwareProfile: {205 vmSize: vmSize206 }207 }208 dependsOn: [virtualNetwork]209}210211// Module usage212module storageModule './modules/storage.bicep' = {213 name: 'storage'214 params: {215 location: resourceGroup().location216 }217}218```219220### Expected Behavior2212221. Parses Bicep:223224 - **Parameters**: vnetName, vnetAddressPrefix, subnetAddressPrefix, vmSize225 - **Resources**: VNet with subnet, VM with dependsOn relationship226 - **Module**: Storage module with parameters2272282. Generates DSL showing Bicep-specific features:229230 ```231 myVNet [label: "VNet 10.0.0.0/16"] {232 subnet1 [label: "Subnet 1 10.0.1.0/24"] {233 myVM [icon: azure-vm, label: "VM Standard_B1s"]234 }235 }236237 storage-module [label: "Storage Module"] {238 storage-account [icon: azure-storage]239 }240241 myVNet -> myVM242 ```243244 **Important**: All label text must be on a single line within quotes. Bicep-specific: Show modules as containers, include `dependsOn` relationships, note parameter usage in resource configuration.2452463. Calls `/api/render/elements` with `diagramType: "cloud-architecture-diagram"`2472484. Calls `/api/render/elements` with `diagramType: "cloud-architecture-diagram"`249250### Result251252User receives a diagram showing:253254- VNet as a container255- Subnet nested inside VNet256- VM in the subnet257- Dependency relationship shown258- Proper Azure styling