Move your Structurizr workspace to Modudraft
Import a workspace and keep its levels, its documentation and its decisions. You can do it in the web app with a file, or with an agent through the MCP server, and import again later to update the diagram in place. You can also export it back to DSL or JSON.
Why move
Structurizr's cloud service closed on 30 September 2026. Your model does not have to go with it. A workspace comes over as one diagram: the software systems, containers and components as nested levels, the relationships as arrows, the documentation and architecture decisions as notes, the dynamic views as sequences and the deployment model as the Cloud tab.
What to export
- From the Structurizr cloud service: export the workspace as JSON. The JSON keeps the layouts you arranged by hand, so the diagram opens with your positions.
- From Structurizr Lite, the CLI, on-premises or vNext: take the folder with
workspace.dsl. If Structurizr Lite saved layouts in aworkspace.jsonnext to it, include that file too: its positions are used.
The folder matters when the workspace uses !include, !docs or !adrs,
because those files are read from it.
Import on the web
Open a diagram, then Import in the toolbar, then Open a fileā¦. Choose one of:
- a
.dslfile; - a Structurizr
.jsonfile; - a
.zipof the workspace folder. Use the zip when the workspace uses!include,!docsor!adrs, or extends another workspace file.
A lone .dsl cannot read other files. Its !include, !docs, !adrs and
workspace extends lines are left out and listed in the report, and the rest is imported.
The import replaces the open diagram. If the diagram is not empty you are asked "Replace current diagram?" first. The import is one undo step, and it is refused on a diagram that is locked or view only. Web import never merges with what was there; to update a diagram in place, use the MCP server (below).
When it finishes, an import report opens with Imported, plus Not imported and Warnings when there is something to list:
- Imported: counts of elements, relationships, groups, sequences, cloud resources, documentation sections and decisions.
- Not imported: what was skipped (see What is not imported).
- Warnings: things to check, such as an unknown colour, a skipped dynamic-view step whose elements are not components, or an unsupported statement.
Use Copy report to keep it.
With an agent (MCP)
Ask your agent to call import_file on workspace.dsl (or a Structurizr
workspace.json), or import_directory on the folder. For a workspace.dsl, the files it uses are read
from its folder. Set up the MCP server first.
Importing the same workspace again updates the diagram in place:
- Elements are matched by their Structurizr names, so matched items keep their position and pin.
- New elements are added, and elements removed from the workspace are removed with their arrows, unless a DB table, API endpoint or task is attached to them; those are kept and listed in the response.
- Items you made by hand inside a removed element are moved up one level, not deleted.
- Renaming a software system or a container gives it, and everything inside it, a new name. Its contents are imported again as new items, with fresh positions, and the old ones are removed.
- The documentation and decisions block in the Notes is replaced, not added twice.
You can import several workspaces into one diagram: each keeps its own items, sequences and notes block, and a
re-import of one never touches another. A diagram made by importing a workspace on the web is picked
up by the first import_file of the same workspace: when the workspace matches (the same entry file and most element names),
its items are matched rather than added a second time. A web import of a different workspace is left
alone, the new one is imported beside it, and a warning says so.
To get a warning when the workspace and the diagram drift apart, add workspace.dsl to the
sources in modudraft.json, as described on the CI drift check page.
The tools that watch a project track the workspace.dsl file itself, not the files it includes; after editing an
included file, run the sync or the CI check, which read the whole workspace. sync_project and the CI check do not
report a change to only the documentation, decisions or dynamic views as drift.
What maps to what
| In Structurizr | In Modudraft |
|---|---|
| People, software systems, containers, components | A component with the matching C4 kind. Containers sit inside their software system and components inside their container, each on its own level. Custom elements get no C4 kind. Descriptions are kept. |
| Technology | The catalog tool it names, when there is one. Otherwise the neutral Service tool, with the technology shown on the component. A person with no matching technology gets the web client tool. |
| External systems (location External, or the tag External or Existing System) | An external software system with no matching catalog technology is a component of the external type (with the neutral Service tool). |
| Tags, URL, properties, perspectives | Custom properties of the component. |
| Groups | Boundaries drawn around their members. A nested group (the workspace must set structurizr.groupSeparator, as Structurizr itself requires) becomes one boundary named with the full group path. A group's colour is kept. |
| Relationships | Arrows, with the description as the label and the technology as the protocol. Only the ones you declared are imported. Implied relationships are not: Modudraft computes the dashed arrows on the levels above, as described in Levels and C4. A relationship's colour is kept. |
| Layouts | Positions from the JSON's views (landscape and context views for the top level, a container view for the inside of its system, a component view for the inside of its container). Everything else is laid out automatically on its level. |
Documentation and decisions (!docs, !adrs) | One block in the Notes tab: a "Structurizr documentation" part with a heading per section, and an "Architecture decisions" part with one heading per decision. adrtools, MADR and Log4brains decision formats are read. |
| Dynamic views | Sequences on the Sequence tab, one per view, with the steps in order. |
| Deployment model | The Cloud tab: each environment is a resource that holds its deployment nodes and infrastructure nodes. An instance of a container or software system links that component to its deployment node ("runs on"), using the first environment (in file order) that holds an instance of it. Other environments that hold instances are listed in the report; all environments are imported to the Cloud tab. |
Scroll sideways to see the whole table.
What is not imported
The report lists these under Not imported or Warnings:
- Filtered, custom, image and deployment views. The deployment model itself is imported, as the Cloud tab.
- Element styles: colours, shapes and icons. Components keep the look of their tool. Group and relationship colours are the exception, and are kept. Themes are not imported either.
!script,!pluginand custom importers.- Includes and workspace
extendsthat point to a URL: remote files are not fetched, and the report lists each one under Warnings. - Relationships between deployment elements.
- Images in documentation. The text is imported.
- Files in a zip that are not a type the import reads (
.dsl,.json, Markdown, AsciiDoc and text files).
The system landscape, system context, container and component views are not imported as views either. They are replaced by the levels (see Levels and views); only their positions are used.
Limits
- Zip upload: 20 MB packed, 50 MB unpacked, 2,000 files.
- A single file on the web: 5 MB.
- Size of the model: 5,000 elements.
- With an agent: the entry file may be up to 2 MB, or up to 20 MB for a Structurizr JSON; the files it includes count toward the 50 MB total.
- The notes hold 100,000 characters. A documentation or decision section that does not fit is left out and listed in the report.
Paths in !include, !docs and !adrs must stay inside the workspace folder.
Levels and views
In Structurizr a view is a picture of the model: you decide what a diagram shows with include * and
keep one view per picture. In Modudraft the model is the diagram, and the inside of each
component is a level you open. Open a software system to see its containers, and a container to see its
components. There is no separate view to keep up to date.
The arrows that an include * context view draws between systems are the implied arrows here:
they are computed from the real arrows below, so they never go out of date. Read how levels, implied
arrows and the C4 look work on the Levels and C4 page.
Export back to Structurizr
Moving in does not lock you in. You can write the diagram back out as a Structurizr workspace, so your DSL can live in git, be edited visually in Modudraft and be written back when you are done.
On the web
Open the diagram, then Export in the toolbar, and under Other choose
Structurizr DSL or Structurizr JSON. A summary opens with
Exported counts, plus Not exported and Changed on export when there is
something to list. Download saves workspace.dsl or workspace.json, and
Copy puts the text on the clipboard.
With an agent (MCP)
Ask your agent to call export with the diagram and a format of
structurizr_dsl or structurizr_json. Without an output_path it returns the workspace text and the summary. With an
output_path it writes the file inside your project folders (it will not replace an existing file unless you pass
overwrite: true) and returns the path and the summary. See the MCP docs.
DSL or JSON
- DSL has the model (people, software systems, containers, components, groups, relationships, the Cloud tab as deployment), the views (system landscape, container and component views, a dynamic view per sequence) and colour styles. It has no positions: the views use automatic layout.
- JSON has the same, plus the layouts (the positions you arranged) and the Notes tab as the workspace's documentation. Choose JSON when you want the picture to open the way you drew it.
What is not exported
The summary lists what has no Structurizr equivalent under Not exported. The main cases:
- The DB schema, API and Network tabs, and data flows: they are counted (for example "3 DB tables") and left out.
- Sticky notes, step markers and arrow shapes on the canvas, and tool logos.
- Architecture tabs other than the one exported.
- Boundaries with no components inside; a group colour or arrow colour that is not a hex colour.
- Arrows Structurizr cannot express: to a boundary, a note or a marker, to the item itself, between an item and what is inside it, or a second arrow with the same ends and label.
- Sequence fragments (loop, alt, opt, par), notes and messages that do not connect two components, and messages to the same lane.
- Cloud resource settings beyond technology, description and instances; a component that runs on a resource that no longer exists.
- The Notes tab in DSL. It is written to JSON only.
Things that are exported but changed are listed under Changed on export: a component whose kind does not fit its place (a container at the top level is exported as a software system), items more than two levels deep (exported as components of their container), duplicate names in one scope (the copy is renamed), a component without a name (exported as "Unnamed"), a URL that is not absolute (exported as a property), nested boundaries (the member is exported in the innermost group only), a sequence message that needed a relationship Structurizr requires (one is added), and create, destroy or async messages (exported as plain steps).
Implied arrows
Only the arrows you drew are exported as relationships. In both formats Structurizr shows the arrows between the levels above: in the DSL Structurizr works them out itself, and the JSON includes them as Structurizr's derived relationships, linked to the arrow they come from.
Round trip
Importing the exported DSL gives back the same components (names, levels, C4 kinds, descriptions and technology), the same drawn arrows (label and technology), the same groups and the same sequences. The JSON also brings back the positions (rounded to whole numbers) and the notes. Tool logos and the tabs listed above are not part of the round trip.