Skip to content

Architecture Diagrams Documentation (v11.1.0+)

In the context of mermaid-js, the architecture diagram is used to show the relationship between services and resources commonly found within the Cloud or CI/CD deployments. In an architecture diagram, services (nodes) are connected by edges. Related services can be placed within groups to better illustrate how they are organized.

Example

Syntax

The building blocks of an architecture are groups, services, edges, and junctions.

For supporting components, icons are declared by surrounding the icon name with (), while labels are declared by surrounding the text with [].

To begin an architecture diagram, use the keyword architecture-beta, followed by your groups, services, edges, and junctions. While each of the 3 building blocks can be declared in any order, care must be taken to ensure the identifier was previously declared by another component.

Groups

The syntax for declaring a group is:

group {group id}({icon name})[{title}] (in {parent id})?

Put together:

group public_api(cloud)[Public API]

creates a group identified as public_api, uses the icon cloud, and has the label Public API.

Additionally, groups can be placed within a group using the optional in keyword

group private_api(cloud)[Private API] in public_api

Services

The syntax for declaring a service is:

service {service id}({icon name})[{title}] (in {parent id})?

Put together:

service database(db)[Database]

creates the service identified as database, using the icon db, with the label Database.

If the service belongs to a group, it can be placed inside it through the optional in keyword

service database(db)[Database] in private_api

Edges

The syntax for declaring an edge is:

{serviceId}{{group}}?:{T|B|L|R} {<}?--{>}? {T|B|L|R}:{serviceId}{{group}}?

Edge Direction

The side of the service the edge comes out of is specified by adding a colon (:) to the side of the service connecting to the arrow and adding L|R|T|B

For example:

db:R -- L:server

creates an edge between the services db and server, with the edge coming out of the right of db and the left of server.

db:T -- L:server

creates a 90 degree edge between the services db and server, with the edge coming out of the top of db and the left of server.

Arrows

Arrows can be added to each side of an edge by adding < before the direction on the left, and/or > after the direction on the right.

For example:

subnet:R --> L:gateway

creates an edge with the arrow going into the gateway service

Edges out of Groups

To have an edge go from a group to another group or service within another group, the {group} modifier can be added after the serviceId.

For example:

service server[Server] in groupOne
service subnet[Subnet] in groupTwo

server{group}:B --> T:subnet{group}

creates an edge going out of groupOne, adjacent to server, and into groupTwo, adjacent to subnet.

It's important to note that groupIds cannot be used for specifying edges and the {group} modifier can only be used for services within a group.

Junctions

Junctions are a special type of node which acts as a potential 4-way split between edges.

The syntax for declaring a junction is:

junction {junction id} (in {parent id})?

Icons

By default, architecture diagram supports the following icons: cloud, database, disk, internet, server. Users can use any of the 200,000+ icons available in iconify.design, or add their own custom icons, by following the steps below.

The icon packs available can be found at icones.js.org. We use the name defined when registering the icon pack, to override the prefix field of the iconify pack. This allows the user to use shorter names for the icons. It also allows us to load a particular pack only when it is used in a diagram.

Using JSON file directly from CDN:

js
import mermaid from 'CDN/mermaid.esm.mjs';
mermaid.registerIconPacks([
  {
    name: 'logos',
    loader: () =>
      fetch('https://unpkg.com/@iconify-json/logos/icons.json').then((res) => res.json()),
  },
]);

Using packages and a bundler:

bash
npm install @iconify-json/logos

With lazy loading

js
import mermaid from 'mermaid';

mermaid.registerIconPacks([
  {
    name: 'logos',
    loader: () => import('@iconify-json/logos').then((module) => module.icons),
  },
]);

Without lazy loading

js
import mermaid from 'mermaid';
import { icons } from '@iconify-json/logos';
mermaid.registerIconPacks([
  {
    name: icons.prefix, // To use the prefix defined in the icon pack
    icons,
  },
]);

After the icons are installed, they can be used in the architecture diagram by using the format "name:icon-name", where name is the value used when registering the icon pack.