Skip to content

Model

The model describes architecture as a set of hierarchical elements and any relationships among them.

Element

Element is a basic building block.
It represents a logical or physical part of the architecture.
Any element must have a kind and a name (identifier):

specification {
element actor // define a kind
element service
}
model {
// element of kind 'actor' with the name 'customer'
actor customer
// element of kind 'service' named as 'cloud'
service cloud
// also possible with '=' and the name goes first
cloud = service
}

Element name is required for references.
It can contain letters, digits and underscore, but can’t start with a digit.

name
api
Api
_api
_1api
1api⛔️
a.pi⛔️

Element Properties

Elements may have properties: title, description and technology.
For example, Structurizr DSL style:

specification {
element softwareSystem
}
model {
// Structurizr DSL style:
// <name> = softwareSystem [title] [description] [technology]
cloud = softwareSystem 'Cloud' 'Provides services to customers' 'SaaS'
}

Element’s name is used as a title by default.
But you can specify your own:

model {
// element of kind 'actor' with name='customer' and title='customer'
actor customer
// element of kind 'service' with name='cloud' and title='Cloud Systems'
service cloud 'Cloud Systems'
// or with '='
cloud = service 'Cloud Systems'
}

These properties may be defined as nested:

model {
// Only description inside
customer = actor 'Customer' {
description: 'Uses the Mobile Application' // ':' is optional, but if you prefer
}
// All properties inside
mobile = application {
title 'Mobile Application'
description 'Provides services to customers'
technology 'React Native'
}
// Multiline
web = application {
title 'Web Application'
description '
Provides services to customers through
the web interface.
'
}
}

Element Tags

Tags are defined in nested block and before any properties:

model {
appV1 = application 'App v1' {
#deprecated
description 'Old version of the application'
}
// multiple tags
appV2 = application {
#next, #serverless
#team2
title 'App v2'
}
appV3 = application {
title 'App v3'
#team3 // ⛔️ Error: tags must be defined first
}
}

Element may have multiple links:

model {
bastion = application 'Bastion' {
// External link
link https://any-external-link.com
// or any URI
link ssh://bastion.internal
// or relative link to navigate to sources
link ../src/index.ts#L1-L10
}
}

Structure

Any element is a container and can contain other elements.
This way you define the structure and internals of the element.

model {
// service1 has backend and frontend
service service1 {
component backend {
// backend has api
component api
}
component frontend
}
// or use '='
service2 = service {
backend = component {
api = component
}
frontend = component
}
}

Nested elements are “namespaced”, the parent name is used as a prefix.
So, the model above has the elements with these fully qualified names:

  • service1
  • service1.backend
  • service1.backend.api
  • service1.frontend

and:

  • service2
  • service2.backend
  • service2.backend.api
  • service2.frontend

It is not possible to have elements with the same name on the same hierarchy level.

model {
service service1 'Service 1' {
component backend
component backend // ⛔️ Error: 'service1.backend' already defined
}
service service2 'Service 2' {
component backend // ✅ This is OK - 'service2.backend'
component legacy {
component backend // ✅ This is OK - 'service2.legacy.backend'
}
}
component backend // ✅ This is OK - 'backend'
}