Skip to content

Layout and routing ​

Choose automatic layout when relationships explain the flow. Choose authored rows and containers when the explanation depends on a specific grouping or reading order. You can combine both in one diagram.

Infer flow from edges ​

Request processing{"languageVersion":1,"diagramId":"main","diagrams":["main"],"manifest":[{"id":"main","diagramType":"graph","status":"selected","reason":null,"annotations":[],"span":{"start":0,"end":273,"line":1,"column":1,"endLine":10,"endColumn":2}}],"targets":[],"diagnostics":[],"diagram":{"declaration":"diagram","attributes":{"flow-direction":{"value":{"type":"choice","value":"right"},"span":{"start":57,"end":77,"line":1,"column":58,"endLine":1,"endColumn":78},"valueSpan":{"start":72,"end":77,"line":1,"column":73,"endLine":1,"endColumn":78},"nameSpan":{"start":57,"end":71,"line":1,"column":58,"endLine":1,"endColumn":72}},"layout":{"value":{"type":"choice","value":"auto"},"span":{"start":45,"end":56,"line":1,"column":46,"endLine":1,"endColumn":57},"valueSpan":{"start":52,"end":56,"line":1,"column":53,"endLine":1,"endColumn":57},"nameSpan":{"start":45,"end":51,"line":1,"column":46,"endLine":1,"endColumn":52}},"type":{"value":{"type":"choice","value":"graph"},"span":{"start":34,"end":44,"line":1,"column":35,"endLine":1,"endColumn":45},"valueSpan":{"start":39,"end":44,"line":1,"column":40,"endLine":1,"endColumn":45},"nameSpan":{"start":34,"end":38,"line":1,"column":35,"endLine":1,"endColumn":39}}},"path":null,"authoredId":null,"documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}},"objects":{"object:[\"auth\"]":{"declaration":"node","attributes":{},"path":["auth"],"authoredId":"auth","documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}},"object:[\"gateway\"]":{"declaration":"node","attributes":{},"path":["gateway"],"authoredId":"gateway","documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}},"object:[\"store\"]":{"declaration":"node","attributes":{},"path":["store"],"authoredId":"store","documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}},"object:[\"validate\"]":{"declaration":"node","attributes":{},"path":["validate"],"authoredId":"validate","documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}}},"relationships":{"anonymous:0":{"declaration":"edge","attributes":{},"path":null,"authoredId":null,"documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}},"anonymous:1":{"declaration":"edge","attributes":{},"path":null,"authoredId":null,"documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}},"anonymous:2":{"declaration":"edge","attributes":{},"path":null,"authoredId":null,"documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}},"anonymous:3":{"declaration":"edge","attributes":{},"path":null,"authoredId":null,"documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}}}}Copyright © 2017 IBM Corp. with Reserved Font Name "Plex" This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.Request processingGatewayAuthenticateValidateStore
text
diagram main "Request processing" type=graph layout=auto flow-direction=right {
  node gateway "Gateway"
  node auth "Authenticate"
  node validate "Validate"
  node store "Store"
  ::gateway -> ::auth
  ::gateway -> ::validate
  ::auth -> ::store
  ::validate -> ::store
}

flow-direction=down|up|right|left controls inferred graph flow. Peers occupy the perpendicular axis; labels stay upright. Declaration order breaks ties. Disconnected components retain authored region order. Graph direction is independent from text direction.

An automatic canvas starts at 900 units and grows from measured text, ranks, tree extents, and container padding. width=N fixes the canvas. State machines use specialized cycle placement; sequence diagrams keep event order instead of graph ranks.

Author rows and hierarchy ​

Read and write paths{"languageVersion":1,"diagramId":"main","diagrams":["main"],"manifest":[{"id":"main","diagramType":"graph","status":"selected","reason":null,"annotations":[],"span":{"start":0,"end":283,"line":1,"column":1,"endLine":13,"endColumn":2}}],"targets":[],"diagnostics":[],"diagram":{"declaration":"diagram","attributes":{"type":{"value":{"type":"choice","value":"graph"},"span":{"start":36,"end":46,"line":1,"column":37,"endLine":1,"endColumn":47},"valueSpan":{"start":41,"end":46,"line":1,"column":42,"endLine":1,"endColumn":47},"nameSpan":{"start":36,"end":40,"line":1,"column":37,"endLine":1,"endColumn":41}}},"path":null,"authoredId":null,"documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}},"objects":{"object:[\"reader\"]":{"declaration":"node","attributes":{},"path":["reader"],"authoredId":"reader","documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}},"object:[\"store\"]":{"declaration":"node","attributes":{},"path":["store"],"authoredId":"store","documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}},"object:[\"writer\"]":{"declaration":"node","attributes":{},"path":["writer"],"authoredId":"writer","documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}}},"relationships":{"anonymous:0":{"declaration":"edge","attributes":{},"path":null,"authoredId":null,"documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}},"anonymous:1":{"declaration":"edge","attributes":{},"path":null,"authoredId":null,"documentation":null,"sourceLocations":[],"metadata":{},"annotations":[],"paint":{"paletteOrigin":null,"fillColor":null,"strokeColor":null,"textColor":null,"backgroundColor":null,"strokeStyle":null,"strokeWidth":null}}}}Copyright © 2017 IBM Corp. with Reserved Font Name "Plex" This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.Read and write pathsReaderfetch(key)Writerput(key, value)Storereadwrite
text
diagram main "Read and write paths" type=graph {
  row gap=24 weights=[1, 2] {
    node reader "Reader" {
      code "fetch(key)"
    }
    node writer "Writer" {
      code "put(key, value)"
    }
  }
  node store "Store"
  ::reader -> ::store "read"
  ::writer -> ::store "write"
}

Weights split the available row width after gutters. row weights=[1, 2] gives the second child twice the space. Sections, rows, dividers, gaps, and paragraphs are layout boundaries: automatic placement does not reorder across them. Nested containers apply the same layout rules to their own children.

layout=manual uses authored block flow. Use width=N to pin the canvas, defaults node palette=gray to select a common palette, and legend visibility=hidden to suppress a legend. These choices are independent.

Add a relationship-free constraint ​

Inside automatic regions:

HintMeaning
after=apiPut this node in a later flow rank
same-rank=apiKeep this node in the same flow rank
beside=apiKeep these nodes as peers

after= follows the selected direction. Explicit rows retain authored cell order even when automatic inference is enabled.

Guide a route when needed ​

Edges choose orthogonal paths and attach to the actual node outline. Return paths and self-loops receive outside space. Obstructed paths can try other ports and search around nodes; dense graphs can still need author guidance.

text
api -> store "query" source-side=bottom target-side=top
store -> api "response" route-side=right

source-side= and target-side= pin endpoint sides. route-side= reserves an outside side. These options apply to graph and state-machine routing, not sequence lifelines. Warnings identify overflow, obstructed routes, overlapping edges, and labels without enough room. Shorten a caption, widen the canvas, adjust grouping, or add a hint; use layup check --strict before sharing the result.

Try changing the direction and adding a row in the playground.

MIT OR Apache-2.0 · Bundled fonts: SIL OFL 1.1