ArchiMate + PlantUML = Sequence Diagram Joy

I’ve always had a love of sequence diagrams, for those that don’t know what a sequence diagram is, this may not be the blog for you!  Sequence diagrams have always struck me as one of the more useful, and practical design documents to use to describe how a system works.

ArchiMate, of course, works on a slightly larger level, but I think great things can happen when you combine the two, and have used many diagrams to help describe some of the more intricate detail within an architecture.

There are many tools which can be used to create sequence diagrams, but, as I am a nerd, and enjoy over-complicating things, PlantUML floats my boat in many ways, mainly because it still feels like a fun techie tool (and works well with Markdown too!).

PlantUML is a tool which allows you to quickly create UML diagrams based on a (fairly) simple text syntax.  It supports many types of diagram, including Sequence Diagrams and basic ArchiMate.  As PlantUML supports both of these diagrams, I have written a support library which can be included in any PlantUML diagram to define each of the ArchiMate concepts and include them within a sequence diagram.

Example Diagram Source

@startuml Archi Usage
!include archiseq.puml
title Archi Print Usage
' Define Elements
$equipment("Printer", "printer")
' Define Sequence
architect->archi ++
archi->update ++ : Make changes
$document("Not exactly correct!\nBut you get the idea.","right","update")
return Updated Model
archi ->print ++ : Click print
print -\windowsPrint ++
print –> archi : Sent to printer
windowsPrint -> printer ++
return Complete
archi –> architect
view raw archi-example.puml hosted with ❤ by GitHub

Support Library

@startuml Common
' PlantUML ArchiMate Sequence Diagram template v4
' Changelog:
' v3 Updated for new PreProcessor
' v4 Function to Procedure
' Author: Steven Mileham (
skinparam dpi 150
skinparam shadowing false
skinparam BoxPadding 10
skinparam defaultFontName "Roboto"
skinparam participantBorderColor black
skinparam noteBorderColor black
skinparam sequence {
ArrowColor black
LifeLineBorderColor DimGray
LifeLineBackgroundColor LightGray
BoxBorderColor Gray
BoxBackgroundColor #f2f2f2
skinparam participant<<Business>> {
BorderColor #GoldenRod
BackgroundColor #Business
skinparam participant<<Application>> {
BorderColor #LightSteelBlue
BackgroundColor #Application
skinparam participant<<Technology>> {
BorderColor #LimeGreen
BackgroundColor #Technology
skinparam participant<<Physical>> {
BorderColor #LimeGreen
BackgroundColor #Technology
skinparam participant<<Motivation>>{
BorderColor #Purple
BackgroundColor #Motivation
DiagonalCorner 10
' Archimate Components
' Generic
!procedure $element($layer,$type,$label,$name="")
!if ($name=="")
participant "<$archimate/$type>\r $label" as $label << $layer >>
participant "<$archimate/$type>\r $label" as $name << $layer >>
' Motivation
!procedure $driver($label,$name="")
$element("Motivation", "driver", $label, $name)
!procedure $assessment($label,$name="")
$element("Motivation", "assessment", $label, $name)
!procedure $goal($label,$name="")
$element("Motivation", "goal", $label, $name)
!procedure $outcome($label,$name="")
$element("Motivation", "motivation-outcome", $label, $name)
!procedure $principle($label,$name="")
$element("Motivation", "principle", $label, $name)
!procedure $requirement($label,$name="")
$element("Motivation", "requirement", $label, $name)
!procedure $constraint($label,$name="")
$element("Motivation", "constraint", $label, $name)
!procedure $value($label,$name="")
$element("Motivation", "value", $label, $name)
!procedure $meaning($label,$name="")
$element("Motivation", "meaning", $label, $name)
!procedure $stakeholder($label,$name="")
$element("Motivation", "role", $label, $name)
' Business
!procedure $businessActor($label,$name="")
$element("Business", "actor", $label, $name)
!procedure $businessCollaboration($label,$name="")
$element("Business", "collaboration", $label, $name)
!procedure $businessEvent($label,$name="")
$element("Business", "event", $label, $name)
!procedure $businessInteraction($label,$name="")
$element("Business","interaction", $label, $name)
!procedure $businessInterface($label,$name="")
$element("Business","interface", $label, $name)
!procedure $businessObject($label,$name="")
$element("Business","object", $label, $name)
!procedure $businessProcess($label,$name="")
$element("Business","process", $label, $name)
!procedure $businessRole($label,$name="")
$element("Business","role", $label, $name)
!procedure $businessService($label,$name="")
$element("Business","service", $label, $name)
!procedure $contract($label,$name="")
$element("Business","contract", $label, $name)
!procedure $product($label,$name="")
$element("Business","product", $label, $name)
!procedure $representation($label,$name="")
$element("Business","representation", $label, $name)
' Application
!procedure $applicationCollaboration($label,$name="")
$element("Application","collaboration", $label, $name)
!procedure $applicationComponent($label,$name="")
$element("Application","component", $label, $name)
!procedure $applicationEvent($label,$name="")
$element("Application","event", $label, $name)
!procedure $applicationFunction($label,$name="")
$element("Application","function", $label, $name)
!procedure $applicationInteraction($label,$name="")
$element("Application","interaction", $label, $name)
!procedure $applicationInterface($label,$name="")
$element("Application","interface", $label, $name)
!procedure $applicationProcess($label,$name="")
$element("Application","process", $label, $name)
!procedure $applicationService($label,$name="")
$element("Application","service", $label, $name)
!procedure $dataObject($label,$name="")
$element("Application","object", $label, $name)
' Technology
!procedure $artifact($label,$name="")
$element("Technology","technology-artifact", $label, $name)
!procedure $communicationNetwork($label,$name="")
$element("Technology","network", $label, $name)
!procedure $device($label,$name="")
$element("Technology","device", $label, $name)
!procedure $node($label,$name="")
$element("Technology","node", $label, $name)
!procedure $path($label,$name="")
$element("Technology","technology-communication-path", $label, $name)
!procedure $systemSoftware($label,$name="")
$element("Technology","system-software", $label, $name)
!procedure $technologyCollaboration($label,$name="")
$element("Technology","collaboration", $label, $name)
!procedure $technologyEvent($label,$name="")
$element("Technology","event", $label, $name)
!procedure $technologyFunction($label,$name="")
$element("Technology","function", $label, $name)
!procedure $technologyInteraction($label,$name="")
$element("Technology","interaction", $label, $name)
!procedure $technologyInterface($label,$name="")
$element("Technology","interface", $label, $name)
!procedure $technologyProcess($label,$name="")
$element("Technology","process", $label, $name)
!procedure $technologyService($label,$name="")
$element("Technology","service", $label, $name)
' Physical
!procedure $distributionNetwork($label,$name="")
$element("Physical","physical-distribution-network", $label, $name)
!procedure $equipment($label,$name="")
$element("Physical","physical-equipment", $label, $name)
!procedure $facility($label,$name="")
$element("Physical","physical-facility", $label, $name)
!procedure $material($label,$name="")
$element("Physical","physical-material", $label, $name)
' Notes
!procedure $assume($text, $placement = "left", $component = "")
hnote $placement $component #FFAAAA: <&warning> $text
!procedure $document($text, $placement = "left", $component = "")
note $placement $component #FFFFA5: <&document> $text
!procedure $question($text, $placement = "left", $component = "")
rnote $placement $component #FFBF00: <&questionmark> $text
!procedure $schedule($text, $placement = "left", $component = "")
rnote $placement $component #98FB98: <&timer> $text
!procedure $change($text, $placement = "left", $component = "")
rnote $placement $component #FFBF00: <&circlecheck> $text
!procedure $reuse($text, $placement = "left", $component = "")
rnote $placement $component #98FB98: <&circlecheck> $text
!procedure $error($text, $placement = "left", $component = "")
rnote $placement $component #FFCCCB: <&bug> $text
hide stereotype
footer Generated on %date()
view raw archi-seq.puml hosted with ❤ by GitHub

Next steps… figure out how I can write a jArchi script to write my PlantUML for me!


  1. Hi,

    I also often use PlantUML and find it useful to work directly from Archi and don’t rely on a browser. For this purpose, I have a really small script containing only:“”, “PlantUML”)

    This opens a new tab in Archi with PlantText. Once you’ve created your sequence diagram, you can simply drag’n drop it to another tab containing a canvas and the image will be created in it.


  2. Hi! This looks really amazing and I want to use it!
    Two questions:
    1) How are the archimate symbols rendered? From an image file or from code?
    2) Does this require me to download PlantUML and run it locally? I am currently writing PlantUML straight into a macro in Confluence on web. Is it possible to include the support library in the same “file” as where the actual diagram is defined?


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.