Coder Social home page Coder Social logo

lite's People

Contributors

pcrock-thmdo avatar simonbrowndotje avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

lite's Issues

Documentation suggestion for Lite

I ran Structurizr Lite using Docker compose. I share my docker-compose.yaml here in case anyone else finds it useful.

version: '3'
services:
  structurizr:
    container_name: system-architecture-structurizr
    image: structurizr/lite
    ports:
      - "8080:8080"
    volumes:
      - "./src:/usr/local/structurizr:rw"

Generated offline HTML Export not zoomable

First of all: I love the approach! Awesome tool!

I just bumped into an issue (quite possible that I am not seeing some option).
The Generated offline HTML Page is not zoomable.

This makes Diagrams with 2 vertically "stacked" elements huge.

Is there some way to either fit the diagrams to the viewport or make them zoomable?

Export HTML functionality is missing in new versions

Question

In previous versions of Structurizr Lite, it was possible to load an HTML file with all diagrams from the workspace. It seems that this option has been removed. I used this feature in the past to quickly send intermediate results to business users not familiar with docker. Should I publish workspaces to StructurizR On-Prem instead? Also, I am wondering why this feature was removed.

How to move diagram when zoomed in?

If I zoom into a diagram, how do I then move the diagram with my mouse? Usually I press space and can then "grab" the canvas in similar programs. I have not found any modifier key to do so.
Using just the scrollbars to move the canvas horizontally and vertially is quite annoying.

Diagram sort order appears to be using string sorting?

Description

With a set of DSL files with more than 10 diagrams, the 10th diagram occupies position 2 in the left hand diagram list
Screenshot 2023-04-07 145357

Steps to reproduce

1, create a model with more than 9 diagrams.

Screenshot

No response

Code sample

No response

Configuration

Structurizr Lite

  • build: 3047 (2023-04-06T07:33:20Z
  • structurizr-java: v1.24.1
  • structurizr-dsl: v1.30.1
  • structurizr-import: v1.4.1

Severity

Minor

Priority

Medium

Resolution

I have no budget, please fix this for free

More information

No response

Decisions page not rendering

Hello Simon,

I'm experiencing a strange behavior with Structurizr Lite. I have the following folder structure:

.
├── architecture
│   ├── decisions
│   │   └── 0001-record-architecture-decisions.md
│   ├── documentation
│   │   └── 01-introduction.md
│   ├── workspace.dsl

This is the content of the files:

WORKSPACE.DSL

workspace "VAS Platform 2.x" "Architecture of the VAS Platform" {
    # Disabling implied relationships
    !impliedRelationships false

    # Structurizr specific references
    !docs documentation
    !adrs decisions

    model {
        #####################
        # Internal Entities #
        #####################
        enterprise "VAS Ecosystem" {
            ss_vasPlatform = softwareSystem "VAS Platform"
        }
    }

    views {
        ##########################################
        # Common styles for common look and feel #
        ##########################################
        #LND-01
        systemLandscape "lnd01" {
            title "LND-01: VAS Platform 2.x High Level Architecture"
            description "This diagram presents the whole echosystem of the VAS Platform from a logical point of view"
            include *
            exclude "element.tag==hidden"
            autoLayout "lr"
        }
    }
}

0001-record-architecture-decisions.md (created with ADR tool)

# 1. Record architecture decisions

Date: 2021-01-01

## Status

Accepted

## Context

We need to record the architectural decisions made on this project.

## Decision

We will use Architecture Decision Records, as [described by Michael Nygard](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions).

## Consequences

See Michael Nygard's article, linked above. For a lightweight ADR toolset, see Nat Pryce's [adr-tools](https://github.com/npryce/adr-tools).

01-introduction.md

## Overview and Goals
---

The high level architecture of the system, with regards to functionalities and logical components, is illustrated in the diagram below:

![](embed:lnd01)

I start Structurizr Lite from the root with the following command:

docker run -d -it --rm -p 8080:8080 -v $PWD/architecture:/usr/local/structurizr --name structurizr structurizr/lite:latest

Then I can see the diagrams, the documentation, but I cannot see the decisions.

This is a simplified version of my model, which is presented correctly on the Cloud.

I also have the v1.x of the model (same folder structure), which works fine locally up to version 2875, but refuses to load on any version newer than that.

docker run -d -it --rm -p 8080:8080 -v $PWD/architecture:/usr/local/structurizr --name structurizr structurizr/lite:2875 ==> GOOD

docker run -d -it --rm -p 8080:8080 -v $PWD/architecture:/usr/local/structurizr --name structurizr structurizr/lite:latest ==> BAD

Funny enough, the simplified version I present here does not work at all on version 2875.

Both models are fine on the Cloud.

Thanks for helping

Add support for local theme files

Currently, themes only support URLs for downloading the themes file. Sometimes due to security and privacy, uploading these files to a public web server is impossible.

Add support for themes files stored in the data directory.

themes https://static.structurizr.com/themes/microsoft-azure-2021.01.26/theme.json ./theme.json

Manual line shape always lost

Much like in #19 I am using manual layouts. I am not experiencing their complete loss of position. Moving blocks and components around is saved fine. However, any edits to the line locations and shape is (for my complex diagrams) lost every single time the page is loaded. This makes structurizr somewhat unusable as I cannot make the lines correct at all.

Reproduction:

workspace {
  model {
    ExternalSystem = softwareSystem "External System"
    System = softwareSystem "The Project"
    ExternalSystem -> System
    System -> ExternalSystem
  }

  views {
    systemContext System "SystemContext" "Top Level Context" {
      include *
    }
  }
}

Launch structurizr lite:

docker run -d  --rm -p 8080:8080 -v ${PWD}:/usr/local/structurizr structurizr/lite:2920

View the page:
image

Move the blocks and also change the line locations. Note that with this simple model, sometimes the line positions are saved, sometimes they are lost. The simple edit that is always lost is to remove the elbow so that the lines are straight and overlapping.
image

Ensure that the save has completed

Press f5 to reload the page. The block positions are saved, but the lines positions are lost:
image

Are image view actually supported in Strucutrizr Lite?

Description

I am attempting to use an image view with Structurizr Lite.

However, it complains that there is an unexpected token.

2023-06-19 10:41:07.794 ERROR 1 --- [nio-8080-exec-1] s.l.c.w.FileSystemWorkspaceComponentImpl : com.structurizr.dsl.StructurizrDslParserException: Unexpected tokens (expected: systemLandscape, systemContext, container, component, filtered, dynamic, deployment, custom, styles, theme, themes, branding, terminology, properties) at line 22: image component1 {

Steps to reproduce

  1. Take the example from the documentation
  2. Paste that into workspace.dsl
  3. Browse to structurizr lite URL

Screenshot

No response

Code sample

workspace {

    model {
        softwareSystem "Software System" {
            container = container "Container" {
                component1 = component "Component 1"
            }
        }
    }

    views {
        properties {
            "mermaid.url" "https://mermaid.ink"
            "mermaid.format" "svg"
        }

        component container {
            include *
            autoLayout lr
        }

        image component1 {
            mermaid https://raw.githubusercontent.com/structurizr/dsl/master/docs/cookbook/image-view/component1.mmd
            title "Class diagram for Component1"
        }
    }
    
}


### Configuration

_No response_

### Severity

Major

### Priority

Low

### Resolution

I have no budget, please fix this for free

### More information

_No response_

Error in the latest Docker image

Description

just pulled the latest docker image and could not start the project. When I use the tag 3000 it works (didn't try all the version in between).
Didn't change anything since earlier when it worked, same compose file, same dsl file etc...

Here is the log

2023-03-31 12:08:31 2023-03-31T10:08:31.960Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : Starting StructurizrLite using Java 17.0.5 with PID 1 (/usr/local/structurizr-lite.war started by root in /)
2023-03-31 12:08:31 2023-03-31T10:08:31.965Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : No active profile set, falling back to 1 default profile: "default"
2023-03-31 12:08:36 2023-03-31T10:08:36.061Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : Started StructurizrLite in 4.58 seconds (process running for 5.297)
2023-03-31 12:08:36 2023-03-31T10:08:36.064Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : ***********************************************************************************
2023-03-31 12:08:36 2023-03-31T10:08:36.064Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : _____ _ _ _
2023-03-31 12:08:36 2023-03-31T10:08:36.064Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : / | | | | ()
2023-03-31 12:08:36 2023-03-31T10:08:36.064Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : | (
| |_ _ __ _ _ | | _ _ _ __ _ _____ __
2023-03-31 12:08:36 2023-03-31T10:08:36.064Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : _
| | '| | | |/ | | | | | '| | / '|
2023-03-31 12:08:36 2023-03-31T10:08:36.064Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : __) | || | | || | (
| || || | | | |/ /| |
2023-03-31 12:08:36 2023-03-31T10:08:36.064Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : |
/ _|| _,|_|_|_,|| |/|_|
2023-03-31 12:08:36 2023-03-31T10:08:36.064Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite :
2023-03-31 12:08:36 2023-03-31T10:08:36.064Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : Structurizr Lite
2023-03-31 12:08:36 2023-03-31T10:08:36.066Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : - build: 3041 (2023-03-31T08:35:17Z
2023-03-31 12:08:36 2023-03-31T10:08:36.066Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : - structurizr-java: v1.24.0
2023-03-31 12:08:36 2023-03-31T10:08:36.074Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : - structurizr-dsl: v1.30.0
2023-03-31 12:08:36 2023-03-31T10:08:36.075Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : - structurizr-import: v1.4.1
2023-03-31 12:08:36 2023-03-31T10:08:36.075Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite :
2023-03-31 12:08:36 2023-03-31T10:08:36.075Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : Workspace path: /usr/local/structurizr
2023-03-31 12:08:36 2023-03-31T10:08:36.075Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : Workspace filename: workspace[.dsl|.json]
2023-03-31 12:08:36 2023-03-31T10:08:36.075Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : URL:
2023-03-31 12:08:36 2023-03-31T10:08:36.076Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : Auto-save interval: 5000ms
2023-03-31 12:08:36 2023-03-31T10:08:36.076Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : Auto-refresh interval: 0ms
2023-03-31 12:08:36 2023-03-31T10:08:36.084Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : dot: available
2023-03-31 12:08:36 2023-03-31T10:08:36.084Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : ***********************************************************************************
2023-03-31 12:08:36 2023-03-31T10:08:36.084Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : MIT License
2023-03-31 12:08:36 2023-03-31T10:08:36.085Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite :
2023-03-31 12:08:36 2023-03-31T10:08:36.085Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : Copyright (c) 2023 Structurizr Limited
2023-03-31 12:08:36 2023-03-31T10:08:36.085Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite :
2023-03-31 12:08:36 2023-03-31T10:08:36.085Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : Permission is hereby granted, free of charge, to any person obtaining a copy
2023-03-31 12:08:36 2023-03-31T10:08:36.085Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : of this software and associated documentation files (the "Software"), to deal
2023-03-31 12:08:36 2023-03-31T10:08:36.085Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : in the Software without restriction, including without limitation the rights
2023-03-31 12:08:36 2023-03-31T10:08:36.085Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2023-03-31 12:08:36 2023-03-31T10:08:36.085Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : copies of the Software, and to permit persons to whom the Software is
2023-03-31 12:08:36 2023-03-31T10:08:36.085Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : furnished to do so, subject to the following conditions:
2023-03-31 12:08:36 2023-03-31T10:08:36.085Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite :
2023-03-31 12:08:36 2023-03-31T10:08:36.085Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : The above copyright notice and this permission notice shall be included in all
2023-03-31 12:08:36 2023-03-31T10:08:36.085Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : copies or substantial portions of the Software.
2023-03-31 12:08:36 2023-03-31T10:08:36.086Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite :
2023-03-31 12:08:36 2023-03-31T10:08:36.086Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2023-03-31 12:08:36 2023-03-31T10:08:36.086Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2023-03-31 12:08:36 2023-03-31T10:08:36.086Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2023-03-31 12:08:36 2023-03-31T10:08:36.086Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2023-03-31 12:08:36 2023-03-31T10:08:36.086Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2023-03-31 12:08:36 2023-03-31T10:08:36.086Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2023-03-31 12:08:36 2023-03-31T10:08:36.086Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : SOFTWARE.
2023-03-31 12:08:36 2023-03-31T10:08:36.086Z INFO 1 --- [ main] com.structurizr.lite.StructurizrLite : ***********************************************************************************
2023-03-31 12:08:39 2023-03-31T10:08:39.940Z WARN 1 --- [nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Failure in @ExceptionHandler com.structurizr.lite.web.ApiController#error(HttpServletResponse, String)
2023-03-31 12:08:39
2023-03-31 12:08:39 java.lang.IllegalStateException: Could not resolve parameter [1] in public com.structurizr.lite.web.ApiResponse com.structurizr.lite.web.ApiController.error(jakarta.servlet.http.HttpServletResponse,java.lang.String): No suitable resolver
2023-03-31 12:08:39 at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:178) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:148) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:413) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:74) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1341) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1152) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1098) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:705) ~[tomcat-embed-core-10.1.5.jar!/:6.0.0]
2023-03-31 12:08:39 at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814) ~[tomcat-embed-core-10.1.5.jar!/:6.0.0]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
2023-03-31 12:08:39
2023-03-31 12:08:39 2023-03-31T10:08:39.945Z ERROR 1 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.NoSuchMethodError: 'java.util.Set com.structurizr.documentation.Documentation.getSections()'] with root cause
2023-03-31 12:08:39
2023-03-31 12:08:39 java.lang.NoSuchMethodError: 'java.util.Set com.structurizr.documentation.Documentation.getSections()'
2023-03-31 12:08:39 at com.structurizr.dsl.plugins.mermaid.MermaidEncoderPlugin.run(MermaidEncoderPlugin.java:22) ~[na:na]
2023-03-31 12:08:39 at com.structurizr.dsl.PluginDslContext.end(PluginDslContext.java:28) ~[structurizr-dsl-1.30.0.jar!/:1.30.0]
2023-03-31 12:08:39 at com.structurizr.dsl.StructurizrDslParser.endContext(StructurizrDslParser.java:964) ~[structurizr-dsl-1.30.0.jar!/:1.30.0]
2023-03-31 12:08:39 at com.structurizr.dsl.StructurizrDslParser.parse(StructurizrDslParser.java:848) ~[structurizr-dsl-1.30.0.jar!/:1.30.0]
2023-03-31 12:08:39 at com.structurizr.dsl.StructurizrDslParser.parse(StructurizrDslParser.java:128) ~[structurizr-dsl-1.30.0.jar!/:1.30.0]
2023-03-31 12:08:39 at com.structurizr.lite.component.workspace.FileSystemWorkspaceComponentImpl.loadWorkspaceFromDsl(FileSystemWorkspaceComponentImpl.java:122) ~[classes!/:na]
2023-03-31 12:08:39 at com.structurizr.lite.component.workspace.FileSystemWorkspaceComponentImpl.loadWorkspace(FileSystemWorkspaceComponentImpl.java:88) ~[classes!/:na]
2023-03-31 12:08:39 at com.structurizr.lite.component.workspace.FileSystemWorkspaceComponentImpl.getWorkspace(FileSystemWorkspaceComponentImpl.java:156) ~[classes!/:na]
2023-03-31 12:08:39 at com.structurizr.lite.web.ApiController.getWorkspace(ApiController.java:37) ~[classes!/:na]
2023-03-31 12:08:39 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
2023-03-31 12:08:39 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
2023-03-31 12:08:39 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
2023-03-31 12:08:39 at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]
2023-03-31 12:08:39 at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:705) ~[tomcat-embed-core-10.1.5.jar!/:6.0.0]
2023-03-31 12:08:39 at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814) ~[tomcat-embed-core-10.1.5.jar!/:6.0.0]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.6.jar!/:6.0.6]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.5.jar!/:na]
2023-03-31 12:08:39 at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
2023-03-31 12:08:39

Steps to reproduce

run docker compose up -d with

version: '3.3'
services:
  structurizer:
    container_name: structurizr
    pull_policy: always
    image: structurizr/lite:latest
    ports:
      - 8080:8080
    volumes:
      - .:/usr/local/structurizr
    restart: always

Screenshot

No response

Code sample

No response

Configuration

No response

Severity

Critical

Priority

Low

Resolution

I have no budget, please fix this for free

More information

No response

Link to the structurizr-lite.war file in the installation chapter was not accessible.

Description

The link: https://static.structurizr.com/download/structurizr-lite.war was not accessible.

Steps to reproduce

  1. Visit https://structurizr.com/share/76352/documentation#spring-boot
  2. Click the link: https://static.structurizr.com/download/structurizr-lite.war

Screenshot

image

image

Code sample

No response

Configuration

No response

Severity

Minor

Priority

Low

Resolution

I have no budget, please fix this for free

More information

No response

Issues with !script

I am not able to use scripts in structurizr lite. I tried inline, file, kts, kt, js.. always get the same error:

ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider kotlin.script.experimental.jsr223.KotlinJsr223DefaultScriptEngineFactory could not be instantiated
2023-02-14 16:25:56.721 ERROR 1 --- [nio-8080-exec-3] s.l.c.w.FileSystemWorkspaceComponentImpl : com.structurizr.dsl.StructurizrDslParserException: Error running inline script, caused by java.lang.RuntimeException: Could not load a scripting engine for extension "kts" at line 13: }

This is the version I'm using.

2023-02-14 16:25:21.727  INFO 1 --- [           main] com.structurizr.lite.StructurizrLite     :  - build: 2948 (2023-02-14T07:59:41Z
2023-02-14 16:25:21.727  INFO 1 --- [           main] com.structurizr.lite.StructurizrLite     :  - structurizr-java: v1.19.0
2023-02-14 16:25:21.734  INFO 1 --- [           main] com.structurizr.lite.StructurizrLite     :  - structurizr-dsl: v1.25.0
2023-02-14 16:25:21.735  INFO 1 --- [           main] com.structurizr.lite.StructurizrLite     :  - structurizr-documentation: v1.1.1

Did I misunderstand something?

TypeError: Cannot read properties of undefined (reading 'length')

Hello,

Thanks for the effort that goes into maintaining + updating this project. We've been using the docker images to keep all our project docs together and it's been working great!

In the latest docker images it seems that we can't load ADRs or documentation though unfortunately.

If we peg the image tag to 3000 it seems to work great. 3001 throws an error in the console (but still appears to work) and 3002 doesn't load the ADRs & Documentation at all.

We have pegged our container image to 3000 and thats helped us continue for now, so I'm raising for awareness!

Thanks again

Mermaid support for documenation

Hi,

Is there a way to add support for mermaid diagrams in the markdown files for documentation?
I would like to add some process documentation and explanations about the data flows etc.

Thanks!

sequenceDiagram
User->>System A: call
System A ->> System B: get data

Markdown embed diagram perspective

Question

Hi all,

I’m using structurizr lite to generate documentation for my project with the documentation markdown feature. In my diagrams and model I’m using perspectives to highlight specific contexts. Now I want to embed diagrams in my markdown files with a specific perspective, but I cannot find any way to do so.

Is there an option to embed a diagram in markdown with a perspective selected?

Thanks!
Jeffrey

Label 'latest' missing from dockerhub

Following the getting started guide via the prebuild image yields the following error:

$ docker pull structurizr/lite
Using default tag: latest
Error response from daemon: manifest for structurizr/lite:latest not found: manifest unknown: manifest unknown

"Hide this introduction" checkbox doesn't work

Steps

  1. Run structurizr lite in docker
  2. Check the "Hide this introduction" checkbox and click "Close"
  3. Refresh the page

Expected

Popup doesn't show

Actual

The popup shows regardless of the checkbox

image

Layout json file getting reset

Hi,

I've been using structurizr lite using docker via Windows Subsystem for Linux. It's generally been working really well, the one problem that I've had is regarding the json layout file. I don't tend to use autolayout, except for the most simple diagrams. For more complex diagrams I manually position the components on the diagram. However I've been finding that the layout file is getting frequently "reset" so that all of the diagram components get positioned back in the top left hand corner. I'm working around this by creating local git repos so that i can revert the json when it occurs but i'm ending up with lots of unnecessary local repos, and sometimes i forget to commit my changes. It typically seems to happens when I stop working on the diagram for a few hours and then go back to it.

Can you think what might be the cause? I was wondering whether it could be related to the running docker using WSL? My colleagues are all experiencing the same behaviour so I don't think its something specific/unusual to my setup.

Thanks,
Mark

Be able to raise an instance only for view C4 models

First:
Congratulations for the system, it's really great to use a tool that has a well-defined purpose and for which it is perfectly suited.

The issue:
The business areas should be able to visualize the models without being able to manipulate them.

Could be implemented a parameter in the instance configuration that blocks editing actions on the interface in all views, hiding the buttons, similar to what happens when the view uses autolayout?

Eg: structurizr.readOnly
In order not to affect the default behavior of the application, the default value could be equal to false

Finally:
I'm sure that a lot of people who use Structurizr would like to be able to contribute by coding, are there any plans to allow other devs to participate more actively in the project?

Thank you very much

Workspace generation fails when documentation key is absent

Description

I'm reporting this here, since the problem occurred for me with lite. The source may well reside in other parts of the ecosystem.

The problem is the following: I have a workspace definition (JSON) where the workspace has no documentation key. This is legal according to the OpenAPI spec which does not require any of the workspace keys. I can upload this workspace definition and download it again without problem to an on-premise instance. However, when I try to view the workspace using structurizr lite, there is an error because null has no method getSections. I can circumvent this problem by adding "documentation": {} to the workspace JSON. I understand why this happens but it seems like it shouldn't be an issue ideally.

Steps to reproduce

  1. Create a workspace definition without a documentation key.
  2. Run latest dockerized structurizr/lite to visualize the workspace.
  3. It will fail because of a missing method getSections on the null object.

Screenshot

No response

Code sample

No response

Configuration

Docker image structurizr/lite:latest

Severity

Minor

Priority

Low

Resolution

I have no budget, please fix this for free

More information

This problem is easily avoided but it still seems that either the documentation key should be required, or its absence should be handled.

The URL used for the first call takes precedence for all future calls

Structurizr requires browser automation to export diagrams. I attempted to set this up in a Docker compose file that would launch Structurizr lite and then a puppeteer container to export the images, but leave Structurizr lite running for use directly to edit the manual layouts. Docker compose allows you to setup a network and have one service call another one by name. However, this name is not available from outside.

If I call it from a browser at http://localhost:8080 first, then the Puppeteer container fails because the pages return absolute paths to http://localhost:8080. If Puppeteer calls it first, then using my local browser fails because it returns absolute paths to http://structurizr:8080, which only exists inside the Docker world.

This appears to be caused by this code. Better approaches would be to always return the URL that was used for the particular incoming call without saving the URL for use later, or to return relative paths.

Thumbnails disappear with more than 20 views

With 20 or less views the navigation pane renders thumbnails like this
image
However add one more view and they disappear and looks like this
image
Is this limitation by design or a bug?

Can I generate diagram images from command line?

Question

I'm not sure if this is the right place to ask, but how can one run the docker container in an automated way to generate the diagrams as they are displayed on the web? Since I need to include some diagrams in the documentation, it would be nice if I could automate the generation of the files so that they land in the places where they belong in the folder structure rather then opening it, downloading the images, etc...

Edit:

And no, I don't want to use PlantUML because the output is not the same.

!include directive interferes and 'change' the path for the !docs directive

Question

Resume

I got in touch via slack to ask about a error I was receiving whilst trying to use the !docs directive.

Here's the slack channel link
https://structurizr.slack.com/archives/C017K4GS0SY/p1680023469824089

I engaged in a disussion/conversation/troubleshoot with @simonbrowndotje and after some exchange I achieved my result to use correctly the !docs directive.

The problem

The !include directive interferes on the path relativity to be used in the !docs directive whilst using some more complex folder architectures and DRY files.

I simplified my case and recreated the behavior on this zip
example.zip

workspace.dsl
model.dsl
some_docs_folder/
    1.md
folder_1_file_include/
    folder_2_file_include/
        container1.dsl
    folder_2_folder_include/
        container2.dsl
    system1.dsl
folder_1_folder_include/
    folder_2_file_include/
        container3.dsl
    folder_2_folder_include/
        container4.dsl
    system1.dsl

The goal is to be able to use the directive !docs some_docs_folder on every DSL file on the folder hierarchy.

But on

  • folder_1_file_include/system1.dsl the directive is working with !docs "../some_docs_folder"
  • folder_1_folder_include/system2.dsl the directive is working with !docs "some_docs_folder"

The cause for the problem

The !include directive works differently for FILE INCLUDE and FOLDER INCLUDE. There's some shenanigans happening with the way the files/paths are processed.

So even if the files are on the same FOLDER HIERARCHICAL level the !docs directive need to be used with different file path relativity!

Another problem encountered

The container3 and container4 DSL's are not possible to be declared using this folder hierarchy and includes.

The reason is that the FOLDER INCLUDE does a recursive include inside the folder. That's a great tool and behavior. But for some cases it's not so great. The way it is, the include folder directive should be used only on LEAF DSL files.

by leaf I mean a DSL file that WILL NOT include another file.

The goal would be:

  • declare the container3 and container4 files inside the folder_1_folder_include
  • include FILES ONLY from a FOLDER INCLUDE
  • include container3.dsl and container4.dsl on system2.dsl

Proposed actions

  1. investigate folder include path relativity behavior. It's working as expected? If so, this should be documented! If not this should be documented!
  2. create a !include_folder_not_recursively directive to allow this type of modelling/doc architecture!
  3. evidentiate on the documentation that the FOLDER INCLUDE directive is recursive and should be used only to include LEAF DSL files

«Hide this introduction» checkbox is not persisted

Probably, because of the hardcoded date for the cookie.
I can suggest that for such user data the Local Storage might be a better fit.

$('#hideDiagramEditorIntroductionCheckbox').click(function() {
  if ($('#hideDiagramEditorIntroductionCheckbox').is(':checked')) {
    document.cookie = "structurizr.hideDiagramEditorIntroduction=true; expires=31 Dec 2022 23:59:59 UTC; path=/";
  } else {
    document.cookie = "structurizr.hideDiagramEditorIntroduction=; expires=01 Jan 1970 00:00:00 UTC; path=/";
  }
});

Cannot start structurizr lite Spring Boot version

Question

System Info:

Windows 10
Java version: zulu19.32.13-ca-jdk19.0.2-win_x64
structurizr-lite version: structurizr-lite-3033

structurizr failed to start in my machine with below error.
Could someone help on this issue? Thanks.

java -jar C:\Users\dengzhl9\Downloads\structurizr-lite-3033.war .
2023-03-21T15:32:37.568+08:00  INFO 1756 --- [           main] com.structurizr.lite.StructurizrLite     : Starting StructurizrLite using Java 19.0.2 with PID 1756 (C:\Users\dengzhl9\Downloads\structurizr-lite-3033.war started by dengzhl9 in D:\1-project\1-biz\numaris\Mainline\DEV\Dragon\src\WebOrganizer\doc\c4)
2023-03-21T15:32:37.573+08:00  INFO 1756 --- [           main] com.structurizr.lite.StructurizrLite     : No active profile set, falling back to 1 default profile: "default"
2023-03-21T15:32:41.304+08:00 ERROR 1756 --- [           main] org.apache.catalina.core.ContainerBase   : A child container failed during start

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]
        at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[na:na]
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191) ~[na:na]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:923) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:886) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[na:na]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:252) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:430) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:926) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.startup.Tomcat.start(Tomcat.java:485) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:488) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:210) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:578) ~[spring-context-6.0.6.jar!/:6.0.6]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at com.structurizr.lite.StructurizrLite.main(StructurizrLite.java:50) ~[classes!/:na]
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[structurizr-lite-3033.war:na]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) ~[structurizr-lite-3033.war:na]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[structurizr-lite-3033.war:na]
        at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:59) ~[structurizr-lite-3033.war:na]
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]
        at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[na:na]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916) ~[tomcat-embed-core-10.1.5.jar!/:na]
        ... 35 common frames omitted
Caused by: java.lang.IllegalStateException: zip file closed
        at java.base/java.util.zip.ZipFile.ensureOpen(ZipFile.java:832) ~[na:na]
        at java.base/java.util.zip.ZipFile.getManifestName(ZipFile.java:1058) ~[na:na]
        at java.base/java.util.zip.ZipFile$1.getManifestName(ZipFile.java:1101) ~[na:na]
        at java.base/java.util.jar.JarFile.getManEntry(JarFile.java:950) ~[na:na]
        at java.base/java.util.jar.JarFile.checkForSpecialAttributes(JarFile.java:1013) ~[na:na]
        at java.base/java.util.jar.JarFile.isMultiRelease(JarFile.java:387) ~[na:na]
        at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:68) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:41) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:393) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:328) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:271) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:234) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) ~[tomcat-embed-jasper-10.1.5.jar!/:na]
        at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) ~[tomcat-embed-jasper-10.1.5.jar!/:na]
        at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:83) ~[tomcat-embed-jasper-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5144) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        ... 41 common frames omitted

2023-03-21T15:32:41.311+08:00 ERROR 1756 --- [           main] org.apache.catalina.core.ContainerBase   : A child container failed during start

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: A child container failed during start
        at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[na:na]
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191) ~[na:na]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:923) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:252) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:430) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:926) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.startup.Tomcat.start(Tomcat.java:485) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:488) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:210) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:578) ~[spring-context-6.0.6.jar!/:6.0.6]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at com.structurizr.lite.StructurizrLite.main(StructurizrLite.java:50) ~[classes!/:na]
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[structurizr-lite-3033.war:na]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) ~[structurizr-lite-3033.war:na]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[structurizr-lite-3033.war:na]
        at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:59) ~[structurizr-lite-3033.war:na]
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:935) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:886) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[na:na]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916) ~[tomcat-embed-core-10.1.5.jar!/:na]
        ... 27 common frames omitted
Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]
        at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[na:na]
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191) ~[na:na]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:923) ~[tomcat-embed-core-10.1.5.jar!/:na]
        ... 35 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]
        at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[na:na]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916) ~[tomcat-embed-core-10.1.5.jar!/:na]
        ... 35 common frames omitted
Caused by: java.lang.IllegalStateException: zip file closed
        at java.base/java.util.zip.ZipFile.ensureOpen(ZipFile.java:832) ~[na:na]
        at java.base/java.util.zip.ZipFile.getManifestName(ZipFile.java:1058) ~[na:na]
        at java.base/java.util.zip.ZipFile$1.getManifestName(ZipFile.java:1101) ~[na:na]
        at java.base/java.util.jar.JarFile.getManEntry(JarFile.java:950) ~[na:na]
        at java.base/java.util.jar.JarFile.checkForSpecialAttributes(JarFile.java:1013) ~[na:na]
        at java.base/java.util.jar.JarFile.isMultiRelease(JarFile.java:387) ~[na:na]
        at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:68) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:41) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:393) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:328) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:271) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:234) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) ~[tomcat-embed-jasper-10.1.5.jar!/:na]
        at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) ~[tomcat-embed-jasper-10.1.5.jar!/:na]
        at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:83) ~[tomcat-embed-jasper-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5144) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        ... 41 common frames omitted

2023-03-21T15:32:41.320+08:00  WARN 1756 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server
2023-03-21T15:32:41.320+08:00  INFO 1756 --- [           main] com.structurizr.lite.StructurizrLite     : ********************************************************
2023-03-21T15:32:41.321+08:00  INFO 1756 --- [           main] com.structurizr.lite.StructurizrLite     :  Stopping Structurizr Lite
2023-03-21T15:32:41.321+08:00  INFO 1756 --- [           main] com.structurizr.lite.StructurizrLite     : ********************************************************
2023-03-21T15:32:41.357+08:00 ERROR 1756 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.context.ApplicationContextException: Unable to start web server
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:164) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:578) ~[spring-context-6.0.6.jar!/:6.0.6]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at com.structurizr.lite.StructurizrLite.main(StructurizrLite.java:50) ~[classes!/:na]
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[structurizr-lite-3033.war:na]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) ~[structurizr-lite-3033.war:na]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[structurizr-lite-3033.war:na]
        at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:59) ~[structurizr-lite-3033.war:na]
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:142) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:488) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:210) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183) ~[spring-boot-3.0.4.jar!/:3.0.4]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) ~[spring-boot-3.0.4.jar!/:3.0.4]
        ... 14 common frames omitted
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:935) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:252) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:430) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:926) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.startup.Tomcat.start(Tomcat.java:485) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) ~[spring-boot-3.0.4.jar!/:3.0.4]
        ... 19 common frames omitted
Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: A child container failed during start
        at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[na:na]
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191) ~[na:na]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:923) ~[tomcat-embed-core-10.1.5.jar!/:na]
        ... 27 common frames omitted
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:935) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:886) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[na:na]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916) ~[tomcat-embed-core-10.1.5.jar!/:na]
        ... 27 common frames omitted
Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]
        at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[na:na]
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191) ~[na:na]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:923) ~[tomcat-embed-core-10.1.5.jar!/:na]
        ... 35 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]
        at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[na:na]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916) ~[tomcat-embed-core-10.1.5.jar!/:na]
        ... 35 common frames omitted
Caused by: java.lang.IllegalStateException: zip file closed
        at java.base/java.util.zip.ZipFile.ensureOpen(ZipFile.java:832) ~[na:na]
        at java.base/java.util.zip.ZipFile.getManifestName(ZipFile.java:1058) ~[na:na]
        at java.base/java.util.zip.ZipFile$1.getManifestName(ZipFile.java:1101) ~[na:na]
        at java.base/java.util.jar.JarFile.getManEntry(JarFile.java:950) ~[na:na]
        at java.base/java.util.jar.JarFile.checkForSpecialAttributes(JarFile.java:1013) ~[na:na]
        at java.base/java.util.jar.JarFile.isMultiRelease(JarFile.java:387) ~[na:na]
        at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:68) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:41) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:393) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:328) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:271) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:234) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) ~[tomcat-embed-jasper-10.1.5.jar!/:na]
        at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) ~[tomcat-embed-jasper-10.1.5.jar!/:na]
        at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:83) ~[tomcat-embed-jasper-10.1.5.jar!/:na]
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5144) ~[tomcat-embed-core-10.1.5.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.5.jar!/:na]
        ... 41 common frames omitted

Feature Request: Navigate to thumbnail on page reload

I have many views and thus a long list of thumbnails. When I make a change in the model and then subsequently reload the page to see the change, the correct diagram loads due to it being in the URL; However, the thumbnail list is defaulted with the first view at the top. Is it possible to scroll the thumbnail list to have the current diagram in view?

Error when using structurizr-lite locally: Cannot run program "dot"

Hi, I receive the following error when trying to run structurizr-lite locally from the .war file (Build 2848).

I can start the server, accept the license agreement, and then go to the diagrams page. This is when the error occurs (see below).
I'm running this on Windows 10 with OpenJDK 11.0.14.

Note: In the copy below, I replaced the actual workspace path manually with ****.

2022-10-25 12:32:14.844  INFO 18772 --- [           main] com.structurizr.lite.StructurizrLite     : Structurizr Lite
2022-10-25 12:32:14.854  INFO 18772 --- [           main] com.structurizr.lite.StructurizrLite     : Build: 2848
2022-10-25 12:32:14.854  INFO 18772 --- [           main] com.structurizr.lite.StructurizrLite     : Built: 2022-10-24T17:14:19Z
2022-10-25 12:32:14.854  INFO 18772 --- [           main] com.structurizr.lite.StructurizrLite     : structurizr-java: v1.16.0
2022-10-25 12:32:14.874  INFO 18772 --- [           main] com.structurizr.lite.StructurizrLite     : structurizr-dsl: v1.21.0
2022-10-25 12:32:14.874  INFO 18772 --- [           main] com.structurizr.lite.StructurizrLite     :
2022-10-25 12:32:14.874  INFO 18772 --- [           main] com.structurizr.lite.StructurizrLite     : Workspace path: ****
2022-10-25 12:32:14.874  INFO 18772 --- [           main] com.structurizr.lite.StructurizrLite     : Workspace filename: workspace[.dsl|.json]
2022-10-25 12:32:14.874  INFO 18772 --- [           main] com.structurizr.lite.StructurizrLite     : URL:
2022-10-25 12:32:14.884  INFO 18772 --- [           main] com.structurizr.lite.StructurizrLite     : Memory: used=74MB; free=79MB; total=154MB; max=2018MB
2022-10-25 12:32:14.894  INFO 18772 --- [           main] com.structurizr.lite.StructurizrLite     : Auto-save interval: 5000ms
2022-10-25 12:32:14.894  INFO 18772 --- [           main] com.structurizr.lite.StructurizrLite     : Auto-refresh interval: 0ms
2022-10-25 12:32:26.968  INFO 18772 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'**************************
2022-10-25 12:32:26.968  INFO 18772 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-10-25 12:32:26.968  INFO 18772 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms
2022-10-25 12:32:31.224  WARN 18772 --- [nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase        : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [365] milliseconds.
java.io.IOException: Cannot run program "dot": CreateProcess error=2, The system cannot find the file specified
        at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
        at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
        at com.structurizr.graphviz.GraphvizAutomaticLayout.runGraphviz(GraphvizAutomaticLayout.java:78)
        at com.structurizr.graphviz.GraphvizAutomaticLayout.apply(GraphvizAutomaticLayout.java:97)
        at com.structurizr.lite.web.GraphvizController.post(GraphvizController.java:66)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1787)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
        at java.base/java.lang.ProcessImpl.create(Native Method)
        at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:487)
        at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:154)
        at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
        ... 54 more

hide Introduction cookie expiry

Your JQuery is setting the expiry on the cookie to December 2022. Since that has passed, the cookie doesn't set, and the pop-up returns repeatedly. This is what is in the UI code on inspection:

document.cookie = "structurizr.hideDiagramEditorIntroduction=true; expires=31 Dec 2022 23:59:59 UTC; path=/";

Using the console, and changing it to Dec 2030 fixed it. I'm not seeing if ya'll have a repo for the UI anywhere, I would put in a PR for it, but ¯_(ツ)_/¯

Hope this helps :)

Java command for Spring Boot appears to be malformed

Description

Following the instructions here:
https://structurizr.com/share/76352/documentation#spring-boot
I create this command:

java -Djdk.util.jar.enableMultiRelease=false -jar structurizr-lite-3087.war C:\git\python-experiments\C4-DSL

Which produces the following:

PS C:\tools> java -Djdk.util.jar.enableMultiRelease=false -jar structurizr-lite-3087.war C:\git\python-experiments\C4-DSL
Error: Could not find or load main class .util.jar.enableMultiRelease=false
Caused by: java.lang.ClassNotFoundException: /util/jar/enableMultiRelease=false

I believe the first argument is the problem, because I get the same error message if I lop off the rest of the line:

PS C:\tools> java -Djdk.util.jar.enableMultiRelease=false
Error: Could not find or load main class .util.jar.enableMultiRelease=false
Caused by: java.lang.ClassNotFoundException: /util/jar/enableMultiRelease=false
PS C:\tools>

Steps to reproduce

(Follow instructions above)

Screenshot

No response

Code sample

No response

Configuration

    Directory: C:\tools

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---            7/3/2023 11:39 AM      125042412 structurizr-lite-3087.war

Severity

Major

Priority

High

Resolution

I have no budget, please fix this for free

More information

PS C:\tools> java --version
openjdk 20.0.1 2023-04-18
OpenJDK Runtime Environment (build 20.0.1+9-29)
OpenJDK 64-Bit Server VM (build 20.0.1+9-29, mixed mode, sharing)

(I also tried it with JDK 18 with the same results)

Processor Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz 1.50 GHz
Installed RAM 16.0 GB (15.6 GB usable)
System type 64-bit operating system, x64-based processor
Edition Windows 11 Home
Version 22H2
Installed on ‎12/‎10/‎2022
OS build 22621.1848

No output in browser on Windows 11 running the Jar file

Description

Following these instructions:
https://structurizr.com/share/76352/documentation#open-your-web-browser
I go to http://localhost:8080/
I get a blank browser page along with the "loading" spinner in the browser tab.

If I CTRL-C out of the app running on the console, then I immediately see this:
image

But that only happens sometimes.

There was one attempt where I seemed to be able to get it working, even editing the workspace.dsl, getting an (appropriate) error message and fixing it and reloading the page to regenerate the diagram. But it's unclear to me how I accomplished this; so far it appears random whether a particular command-line invocation is going to successfully produce a browser page.

Steps to reproduce

  1. Start program in the Powershell Console:
java "-Djdk.util.jar.enableMultiRelease=false" -jar structurizr-lite-3087.war C:\git\python-experiments\C4-DSL
  1. Open http://localhost:8080/
  2. The generated workspace.dsl (slightly modified):
workspace {

    model {
        user = person "Bob"
        softwareSystem = softwareSystem "Robotic Storage System"

        user -> softwareSystem "Uses"
    }

    views {
        systemContext softwareSystem "Foo_Bar" {
            include *
            autoLayout
        }
    }

}
  1. The generated workspace.json (unmodified):
{
  "id" : 1,
  "name" : "Name",
  "description" : "Description",
  "lastModifiedDate" : "2023-07-05T17:30:01Z",
  "properties" : {
    "structurizr.dsl" : "d29ya3NwYWNlIHsNCg0KICAgIG1vZGVsIHsNCiAgICAgICAgdXNlciA9IHBlcnNvbiAiQm9iIg0KICAgICAgICBzb2Z0d2FyZVN5c3RlbSA9IHNvZnR3YXJlU3lzdGVtICJSb2JvdGljIFN0b3JhZ2UgU3lzdGVtIg0KDQogICAgICAgIHVzZXIgLT4gc29mdHdhcmVTeXN0ZW0gIlVzZXMiDQogICAgfQ0KDQogICAgdmlld3Mgew0KICAgICAgICBzeXN0ZW1Db250ZXh0IHNvZnR3YXJlU3lzdGVtICJGb29fQmFyIiB7DQogICAgICAgICAgICBpbmNsdWRlICoNCiAgICAgICAgICAgIGF1dG9MYXlvdXQNCiAgICAgICAgfQ0KICAgIH0NCg0KfQ0K"
  },
  "configuration" : { },
  "model" : {
    "people" : [ {
      "id" : "1",
      "tags" : "Element,Person",
      "properties" : {
        "structurizr.dsl.identifier" : "user"
      },
      "name" : "Bob",
      "relationships" : [ {
        "id" : "3",
        "tags" : "Relationship",
        "properties" : {
          "structurizr.dsl.identifier" : "40283aa9-5fc2-43c6-98d2-f585918a5020"
        },
        "sourceId" : "1",
        "destinationId" : "2",
        "description" : "Uses"
      } ],
      "location" : "Unspecified"
    } ],
    "softwareSystems" : [ {
      "id" : "2",
      "tags" : "Element,Software System",
      "properties" : {
        "structurizr.dsl.identifier" : "softwaresystem"
      },
      "name" : "Robotic Storage System",
      "location" : "Unspecified",
      "documentation" : { }
    } ]
  },
  "documentation" : { },
  "views" : {
    "systemContextViews" : [ {
      "key" : "Foo_Bar",
      "order" : 1,
      "softwareSystemId" : "2",
      "automaticLayout" : {
        "implementation" : "Graphviz",
        "rankDirection" : "TopBottom",
        "rankSeparation" : 300,
        "nodeSeparation" : 300,
        "edgeSeparation" : 0,
        "vertices" : false
      },
      "enterpriseBoundaryVisible" : true,
      "relationships" : [ {
        "id" : "3"
      } ],
      "elements" : [ {
        "id" : "1",
        "x" : 0,
        "y" : 0
      }, {
        "id" : "2",
        "x" : 0,
        "y" : 0
      } ]
    } ],
    "configuration" : {
      "branding" : { },
      "styles" : { },
      "terminology" : { },
      "lastSavedView" : "Foo_Bar"
    }
  }
}

Screenshot

No response

Code sample

Powershell console output:

2023-07-05T11:44:43.383-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : Starting StructurizrLite using Java 20.0.1 with PID 9584 (C:\tools\structurizr-lite-3087.war started by bruce in C:\tools)
2023-07-05T11:44:43.395-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : No active profile set, falling back to 1 default profile: "default"
2023-07-05T11:45:00.661-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : Started StructurizrLite in 18.372 seconds (process running for 21.318)
2023-07-05T11:45:00.674-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : ***********************************************************************************
2023-07-05T11:45:00.674-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :   _____ _                   _              _
2023-07-05T11:45:00.674-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :  / ____| |                 | |            (_)
2023-07-05T11:45:00.674-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : | (___ | |_ _ __ _   _  ___| |_ _   _ _ __ _ _____ __
2023-07-05T11:45:00.674-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :  \___ \| __| '__| | | |/ __| __| | | | '__| |_  / '__|
2023-07-05T11:45:00.674-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :  ____) | |_| |  | |_| | (__| |_| |_| | |  | |/ /| |
2023-07-05T11:45:00.674-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : |_____/ \__|_|   \__,_|\___|\__|\__,_|_|  |_/___|_|
2023-07-05T11:45:00.674-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :

2023-07-05T11:45:00.674-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : Structurizr Lite
2023-07-05T11:45:00.674-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :  - build: 3087 (2023-07-03T16:28:01Z
2023-07-05T11:45:00.685-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :  - structurizr-java: v1.24.1
2023-07-05T11:45:00.738-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :  - structurizr-dsl: v1.30.2
2023-07-05T11:45:00.745-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :  - structurizr-import: v1.4.1
2023-07-05T11:45:00.745-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :
2023-07-05T11:45:00.745-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : Workspace path: C:\git\python-experiments\C4-DSL
2023-07-05T11:45:00.745-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : Workspace filename: workspace[.dsl|.json]
2023-07-05T11:45:00.745-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : URL:
2023-07-05T11:45:00.745-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : Auto-save interval: 5000ms
2023-07-05T11:45:00.745-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : Auto-refresh interval: 0ms
2023-07-05T11:45:00.817-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : dot: available
2023-07-05T11:45:00.817-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : ***********************************************************************************
2023-07-05T11:45:00.817-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : MIT License
2023-07-05T11:45:00.817-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :
2023-07-05T11:45:00.817-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : Copyright (c) 2023 Structurizr Limited
2023-07-05T11:45:00.817-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :
2023-07-05T11:45:00.817-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : Permission is hereby granted, free of charge, to any person obtaining a copy
2023-07-05T11:45:00.817-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : of this software and associated documentation files (the "Software"), to deal
2023-07-05T11:45:00.826-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : in the Software without restriction, including without limitation the rights
2023-07-05T11:45:00.826-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2023-07-05T11:45:00.826-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : copies of the Software, and to permit persons to whom the Software is
2023-07-05T11:45:00.826-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : furnished to do so, subject to the following conditions:
2023-07-05T11:45:00.826-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :
2023-07-05T11:45:00.826-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : The above copyright notice and this permission notice shall be included in all
2023-07-05T11:45:00.826-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : copies or substantial portions of the Software.
2023-07-05T11:45:00.826-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     :
2023-07-05T11:45:00.826-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2023-07-05T11:45:00.826-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2023-07-05T11:45:00.826-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2023-07-05T11:45:00.833-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2023-07-05T11:45:00.834-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2023-07-05T11:45:00.834-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2023-07-05T11:45:00.834-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : SOFTWARE.
2023-07-05T11:45:00.834-06:00  INFO 9584 --- [           main] com.structurizr.lite.StructurizrLite     : ***********************************************************************************

Configuration

 7/3/2023 11:39 AM      125042412 structurizr-lite-3087.war

PS C:\tools> java --version
openjdk 20.0.1 2023-04-18
OpenJDK Runtime Environment (build 20.0.1+9-29)
OpenJDK 64-Bit Server VM (build 20.0.1+9-29, mixed mode, sharing)


Host Name:                 DESKTOP-25UJOVE
OS Name:                   Microsoft Windows 11 Home
OS Version:                10.0.22621 N/A Build 22621
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Standalone Workstation
OS Build Type:             Multiprocessor Free
Registered Organization:   N/A
Original Install Date:     12/10/2022, 7:24:40 PM
System Boot Time:          6/29/2023, 11:57:39 AM
System Manufacturer:       Microsoft Corporation
System Model:              Surface Pro 7
System Type:               x64-based PC
Processor(s):              1 Processor(s) Installed.
                           [01]: Intel64 Family 6 Model 126 Stepping 5 GenuineIntel ~1298 Mhz
BIOS Version:              Microsoft Corporation 15.11.140, 7/8/2022
Windows Directory:         C:\WINDOWS
System Directory:          C:\WINDOWS\system32
Boot Device:               \Device\HarddiskVolume1
System Locale:             en-us;English (United States)
Input Locale:              en-us;English (United States)
Time Zone:                 (UTC-07:00) Mountain Time (US & Canada)
Total Physical Memory:     15,970 MB
Available Physical Memory: 6,037 MB
Virtual Memory: Max Size:  16,994 MB
Virtual Memory: Available: 4,185 MB
Virtual Memory: In Use:    12,809 MB

### Severity

Critical

### Priority

High

### Resolution

I have no budget, please fix this for free

### More information

I'm going to try the Docker version to see if that works any better.

Structurizr lite docker image, out of memory

I am trying to run structurizr/lite and it hits out of memory issues.

stdout:

[0.002s][warning][os,thread] Failed to start thread "GC Thread#0" - pthread_create failed (EPERM) for attributes: stacksize: 1024k, guardsize: 4k, detached.
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create worker GC thread. Out of system resources.
# An error report file with more information is saved as:
# //hs_err_pid12.log

hs_err_pidN.log:

#
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create worker GC thread. Out of system resources.
# Possible reasons:
#   The system is out of physical RAM or swap space
#   The process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap
# Possible solutions:
#   Reduce memory load on the system
#   Increase physical memory or swap space
#   Check if swap backing store is full
#   Decrease Java heap size (-Xmx/-Xms)
#   Decrease number of Java threads
#   Decrease Java thread stack sizes (-Xss)
#   Set larger code cache with -XX:ReservedCodeCacheSize=
#   JVM is running with Zero Based Compressed Oops mode in which the Java heap is
#     placed in the first 32GB address space. The Java Heap base address is the
#     maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress
#     to set the Java Heap base and to place the Java Heap above 32GB virtual address.
# This output file may be truncated or incomplete.
#
#  Out of Memory Error (workerManager.hpp:87), pid=13, tid=13
#
# JRE version:  (17.0.4+8) (build )
# Java VM: OpenJDK 64-Bit Server VM (17.0.4+8, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)
# Core dump will be written. Default location: Core dumps may be processed with "/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E" (or dumping to //core.13)
#

---------------  S U M M A R Y ------------

Command Line: -Xms1G -Xmx5G /usr/local/structurizr-lite.war

Host: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz, 8 cores, 31G, Ubuntu 22.04.1 LTS
Time: Mon Sep 26 06:24:41 2022 UTC elapsed time: 0.001758 seconds (0d 0h 0m 0s)

---------------  T H R E A D  ---------------

Current thread (0x0000557f19961cf0):  JavaThread "Unknown thread" [_thread_in_vm, id=13, stack(0x00007ffe46424000,0x00007ffe46c24000)]

Stack: [0x00007ffe46424000,0x00007ffe46c24000],  sp=0x00007ffe46c1e690,  free space=8169k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0xed8f41]  VMError::report_and_die(int, char const*, char const*, __va_list_tag*, Thread*, unsigned char*, void*, void*, char const*, int, unsigned long)+0x1a1
V  [libjvm.so+0xed9b0d]  VMError::report_and_die(Thread*, char const*, int, unsigned long, VMErrorType, char const*, __va_list_tag*)+0x2d
V  [libjvm.so+0x603593]  report_vm_out_of_memory(char const*, int, unsigned long, VMErrorType, char const*, ...)+0xc3
V  [libjvm.so+0xf0d13f]  WorkerManager::add_workers(WorkGang*, unsigned int, unsigned int, unsigned int, os::ThreadType, bool)+0x18f
V  [libjvm.so+0xf0d2da]  WorkGang::initialize_workers()+0x4a
V  [libjvm.so+0x6e9631]  G1CollectedHeap::initialize()+0x6c1
V  [libjvm.so+0xe874f2]  universe_init()+0xd2
V  [libjvm.so+0x7f5b17]  init_globals()+0x37
V  [libjvm.so+0xe5e6e0]  Threads::create_vm(JavaVMInitArgs*, bool*)+0x3a0
V  [libjvm.so+0x8b3062]  JNI_CreateJavaVM+0x52
C  [libjli.so+0x4a1f]  JavaMain+0x8f
C  [libjli.so+0x9a90]  CallJavaMainInNewThread+0xb0
C  [libjli.so+0x6a0d]  ContinueInNewThread+0x5d
C  [libjli.so+0x8166]  JLI_Launch+0x1566
C  [java+0x1203]


---------------  P R O C E S S  ---------------

Threads class SMR info:
_java_thread_list=0x00007f1721c4c3a0, length=0, elements={
}

Java Threads: ( => current thread )

Other Threads:

[error occurred during error reporting (printing all threads), id 0xb, SIGSEGV (0xb) at pc=0x00007f172100fe20]

VM state: not at safepoint (not fully initialized)

VM Mutex/Monitor currently owned by a thread:  ([mutex/lock_event])
[0x0000557f1995f680] Heap_lock - owner thread: 0x0000557f19961cf0

Heap address: 0x00000006c0000000, size: 5120 MB, Compressed Oops mode: Zero based, Oop shift amount: 3

CDS archive(s) mapped at: [0x0000000000000000-0x0000000000000000-0x0000000000000000), size 0, SharedBaseAddress: 0x0000000800000000, ArchiveRelocationMode: 0.
Narrow klass base: 0x0000000000000000, Narrow klass shift: 0, Narrow klass range: 0x0

GC Precious Log:
<Empty>

Heap:
 garbage-first heap   total 0K, used 0K [0x00000006c0000000, 0x0000000800000000)
  region size 4096K, 0 young (0K), 0 survivors (0K)

[error occurred during error reporting (printing heap information), id 0xb, SIGSEGV (0xb) at pc=0x00007f17215d197a]

GC Heap History (0 events):
No events

Deoptimization events (0 events):
No events

Classes unloaded (0 events):
No events

Classes redefined (0 events):
No events

Internal exceptions (0 events):
No events

VM Operations (0 events):
No events

Events (2 events):
Event: 0.001 Protecting memory [0x00007ffe46424000,0x00007ffe46428000] with protection modes 0
Event: 0.001 Loaded shared library /opt/java/openjdk/lib/libjava.so


Dynamic libraries:
6c0000000-800000000 ---p 00000000 00:00 0 
557f18a7d000-557f18a7e000 r--p 00000000 00:164 3732201                   /opt/java/openjdk/bin/java
557f18a7e000-557f18a7f000 r-xp 00001000 00:164 3732201                   /opt/java/openjdk/bin/java
557f18a7f000-557f18a80000 r--p 00002000 00:164 3732201                   /opt/java/openjdk/bin/java
557f18a80000-557f18a81000 r--p 00002000 00:164 3732201                   /opt/java/openjdk/bin/java
557f18a81000-557f18a82000 rw-p 00003000 00:164 3732201                   /opt/java/openjdk/bin/java
557f19928000-557f199f7000 rw-p 00000000 00:00 0                          [heap]
7f16ff987000-7f16ffd72000 rw-p 00000000 00:00 0 
7f16ffd72000-7f16ffd73000 ---p 00000000 00:00 0 
7f16ffd73000-7f16ffec7000 rw-p 00000000 00:00 0 
7f16ffec7000-7f170bcc7000 ---p 00000000 00:00 0 
7f170bcc7000-7f170c4d4000 rw-p 00000000 00:00 0 
7f170c4d4000-7f170c5ba000 ---p 00000000 00:00 0 
7f170c5ba000-7f170c5bf000 rw-p 00000000 00:00 0 
7f170c5bf000-7f170c6a5000 ---p 00000000 00:00 0 
7f170c6a5000-7f170c6aa000 rw-p 00000000 00:00 0 
7f170c6aa000-7f170c6b1000 ---p 00000000 00:00 0 
7f170c6b1000-7f170c921000 rwxp 00000000 00:00 0 
7f170c921000-7f170cc43000 ---p 00000000 00:00 0 
7f170cc43000-7f170ceb3000 rwxp 00000000 00:00 0 
7f170ceb3000-7f171417a000 ---p 00000000 00:00 0 
7f171417a000-7f17143ea000 rwxp 00000000 00:00 0 
7f17143ea000-7f171b6b1000 ---p 00000000 00:00 0 
7f171b6b1000-7f171b6be000 r--p 00000000 00:164 3732416                   /opt/java/openjdk/lib/libjava.so
7f171b6be000-7f171b6d0000 r-xp 0000d000 00:164 3732416                   /opt/java/openjdk/lib/libjava.so
7f171b6d0000-7f171b6d6000 r--p 0001f000 00:164 3732416                   /opt/java/openjdk/lib/libjava.so
7f171b6d6000-7f171b6d7000 ---p 00025000 00:164 3732416                   /opt/java/openjdk/lib/libjava.so
7f171b6d7000-7f171b6d8000 r--p 00025000 00:164 3732416                   /opt/java/openjdk/lib/libjava.so
7f171b6d8000-7f171b6d9000 rw-p 00026000 00:164 3732416                   /opt/java/openjdk/lib/libjava.so
7f171b6d9000-7f171b6da000 rw-p 00000000 00:00 0 
7f171b6da000-7f171b6e2000 rw-s 00000000 00:164 3723862                   /tmp/hsperfdata_root/13
7f171b6e2000-7f172070e000 r--s 00000000 00:164 3732439                   /opt/java/openjdk/lib/modules
7f172070e000-7f1720712000 r--p 00000000 00:164 3732420                   /opt/java/openjdk/lib/libjimage.so
7f1720712000-7f1720725000 r-xp 00004000 00:164 3732420                   /opt/java/openjdk/lib/libjimage.so
7f1720725000-7f172072b000 r--p 00017000 00:164 3732420                   /opt/java/openjdk/lib/libjimage.so
7f172072b000-7f172072d000 r--p 0001c000 00:164 3732420                   /opt/java/openjdk/lib/libjimage.so
7f172072d000-7f172072e000 rw-p 0001e000 00:164 3732420                   /opt/java/openjdk/lib/libjimage.so
7f172072e000-7f172082e000 rw-p 00000000 00:00 0 
7f172082e000-7f172083c000 r--p 00000000 00:164 3724783                   /usr/lib/x86_64-linux-gnu/libm.so.6
7f172083c000-7f17208b8000 r-xp 0000e000 00:164 3724783                   /usr/lib/x86_64-linux-gnu/libm.so.6
7f17208b8000-7f1720913000 r--p 0008a000 00:164 3724783                   /usr/lib/x86_64-linux-gnu/libm.so.6
7f1720913000-7f1720914000 r--p 000e4000 00:164 3724783                   /usr/lib/x86_64-linux-gnu/libm.so.6
7f1720914000-7f1720915000 rw-p 000e5000 00:164 3724783                   /usr/lib/x86_64-linux-gnu/libm.so.6
7f1720915000-7f1720916000 r--p 00000000 00:164 3724828                   /usr/lib/x86_64-linux-gnu/librt.so.1
7f1720916000-7f1720917000 r-xp 00001000 00:164 3724828                   /usr/lib/x86_64-linux-gnu/librt.so.1
7f1720917000-7f1720918000 r--p 00002000 00:164 3724828                   /usr/lib/x86_64-linux-gnu/librt.so.1
7f1720918000-7f1720919000 r--p 00002000 00:164 3724828                   /usr/lib/x86_64-linux-gnu/librt.so.1
7f1720919000-7f172091a000 rw-p 00003000 00:164 3724828                   /usr/lib/x86_64-linux-gnu/librt.so.1
7f172091a000-7f1720b6b000 r--p 00000000 00:164 3732449                   /opt/java/openjdk/lib/server/libjvm.so
7f1720b6b000-7f1721884000 r-xp 00251000 00:164 3732449                   /opt/java/openjdk/lib/server/libjvm.so
7f1721884000-7f1721b0f000 r--p 00f6a000 00:164 3732449                   /opt/java/openjdk/lib/server/libjvm.so
7f1721b0f000-7f1721bc8000 r--p 011f4000 00:164 3732449                   /opt/java/openjdk/lib/server/libjvm.so
7f1721bc8000-7f1721bfd000 rw-p 012ad000 00:164 3732449                   /opt/java/openjdk/lib/server/libjvm.so
7f1721bfd000-7f1721c5a000 rw-p 00000000 00:00 0 
7f1721c5a000-7f1721c82000 r--p 00000000 00:164 3724731                   /usr/lib/x86_64-linux-gnu/libc.so.6
7f1721c82000-7f1721e17000 r-xp 00028000 00:164 3724731                   /usr/lib/x86_64-linux-gnu/libc.so.6
7f1721e17000-7f1721e6f000 r--p 001bd000 00:164 3724731                   /usr/lib/x86_64-linux-gnu/libc.so.6
7f1721e6f000-7f1721e73000 r--p 00214000 00:164 3724731                   /usr/lib/x86_64-linux-gnu/libc.so.6
7f1721e73000-7f1721e75000 rw-p 00218000 00:164 3724731                   /usr/lib/x86_64-linux-gnu/libc.so.6
7f1721e75000-7f1721e82000 rw-p 00000000 00:00 0 
7f1721e82000-7f1721e83000 r--p 00000000 00:164 3724745                   /usr/lib/x86_64-linux-gnu/libdl.so.2
7f1721e83000-7f1721e84000 r-xp 00001000 00:164 3724745                   /usr/lib/x86_64-linux-gnu/libdl.so.2
7f1721e84000-7f1721e85000 r--p 00002000 00:164 3724745                   /usr/lib/x86_64-linux-gnu/libdl.so.2
7f1721e85000-7f1721e86000 r--p 00002000 00:164 3724745                   /usr/lib/x86_64-linux-gnu/libdl.so.2
7f1721e86000-7f1721e87000 rw-p 00003000 00:164 3724745                   /usr/lib/x86_64-linux-gnu/libdl.so.2
7f1721e87000-7f1721e88000 r--p 00000000 00:164 3724826                   /usr/lib/x86_64-linux-gnu/libpthread.so.0
7f1721e88000-7f1721e89000 r-xp 00001000 00:164 3724826                   /usr/lib/x86_64-linux-gnu/libpthread.so.0
7f1721e89000-7f1721e8a000 r--p 00002000 00:164 3724826                   /usr/lib/x86_64-linux-gnu/libpthread.so.0
7f1721e8a000-7f1721e8b000 r--p 00002000 00:164 3724826                   /usr/lib/x86_64-linux-gnu/libpthread.so.0
7f1721e8b000-7f1721e8c000 rw-p 00003000 00:164 3724826                   /usr/lib/x86_64-linux-gnu/libpthread.so.0
7f1721e8c000-7f1721e8f000 r--p 00000000 00:164 3732421                   /opt/java/openjdk/lib/libjli.so
7f1721e8f000-7f1721e99000 r-xp 00003000 00:164 3732421                   /opt/java/openjdk/lib/libjli.so
7f1721e99000-7f1721e9c000 r--p 0000d000 00:164 3732421                   /opt/java/openjdk/lib/libjli.so
7f1721e9c000-7f1721e9d000 ---p 00010000 00:164 3732421                   /opt/java/openjdk/lib/libjli.so
7f1721e9d000-7f1721e9e000 r--p 00010000 00:164 3732421                   /opt/java/openjdk/lib/libjli.so
7f1721e9e000-7f1721e9f000 rw-p 00011000 00:164 3732421                   /opt/java/openjdk/lib/libjli.so
7f1721e9f000-7f1721ea1000 r--p 00000000 00:164 3724862                   /usr/lib/x86_64-linux-gnu/libz.so.1.2.11
7f1721ea1000-7f1721eb2000 r-xp 00002000 00:164 3724862                   /usr/lib/x86_64-linux-gnu/libz.so.1.2.11
7f1721eb2000-7f1721eb8000 r--p 00013000 00:164 3724862                   /usr/lib/x86_64-linux-gnu/libz.so.1.2.11
7f1721eb8000-7f1721eb9000 ---p 00019000 00:164 3724862                   /usr/lib/x86_64-linux-gnu/libz.so.1.2.11
7f1721eb9000-7f1721eba000 r--p 00019000 00:164 3724862                   /usr/lib/x86_64-linux-gnu/libz.so.1.2.11
7f1721eba000-7f1721ebb000 rw-p 0001a000 00:164 3724862                   /usr/lib/x86_64-linux-gnu/libz.so.1.2.11
7f1721ebc000-7f1721ebd000 ---p 00000000 00:00 0 
7f1721ebd000-7f1721ebe000 r--p 00000000 00:00 0 
7f1721ebe000-7f1721ec0000 rw-p 00000000 00:00 0 
7f1721ec0000-7f1721ec2000 r--p 00000000 00:164 3724713                   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7f1721ec2000-7f1721eec000 r-xp 00002000 00:164 3724713                   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7f1721eec000-7f1721ef7000 r--p 0002c000 00:164 3724713                   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7f1721ef7000-7f1721ef8000 ---p 00000000 00:00 0 
7f1721ef8000-7f1721efa000 r--p 00037000 00:164 3724713                   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7f1721efa000-7f1721efc000 rw-p 00039000 00:164 3724713                   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7ffe46424000-7ffe46428000 ---p 00000000 00:00 0 
7ffe46c03000-7ffe46c24000 rw-p 00000000 00:00 0                          [stack]
7ffe46c77000-7ffe46c7b000 r--p 00000000 00:00 0                          [vvar]
7ffe46c7b000-7ffe46c7d000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]


VM Arguments:
jvm_args: -Xms1G -Xmx5G 
java_command: /usr/local/structurizr-lite.war
java_class_path (initial): /usr/local/structurizr-lite.war
Launcher Type: SUN_STANDARD

[Global flags]
     intx CICompilerCount                          = 4                                         {product} {ergonomic}
     uint ConcGCThreads                            = 2                                         {product} {ergonomic}
     uint G1ConcRefinementThreads                  = 8                                         {product} {ergonomic}
   size_t G1HeapRegionSize                         = 4194304                                   {product} {ergonomic}
    uintx GCDrainStackTargetSize                   = 64                                        {product} {ergonomic}
   size_t InitialHeapSize                          = 1073741824                                {product} {command line}
   size_t MarkStackSize                            = 4194304                                   {product} {ergonomic}
   size_t MaxHeapSize                              = 5368709120                                {product} {command line}
   size_t MinHeapDeltaBytes                        = 4194304                                   {product} {ergonomic}
   size_t MinHeapSize                              = 1073741824                                {product} {command line}
    uintx NonNMethodCodeHeapSize                   = 5839372                                {pd product} {ergonomic}
    uintx NonProfiledCodeHeapSize                  = 122909434                              {pd product} {ergonomic}
    uintx ProfiledCodeHeapSize                     = 122909434                              {pd product} {ergonomic}
    uintx ReservedCodeCacheSize                    = 251658240                              {pd product} {ergonomic}
     bool SegmentedCodeCache                       = true                                      {product} {ergonomic}
   size_t SoftMaxHeapSize                          = 5368709120                             {manageable} {ergonomic}
     bool UseCompressedClassPointers               = true                           {product lp64_product} {ergonomic}
     bool UseCompressedOops                        = true                           {product lp64_product} {ergonomic}
     bool UseG1GC                                  = true                                      {product} {ergonomic}

Logging:
Log output configuration:
 #0: stdout all=warning uptime,level,tags
 structurizr/structurizr#1: stderr all=off uptime,level,tags

Environment Variables:
JAVA_HOME=/opt/java/openjdk
PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
TERM=xterm

Signal Handlers:
   SIGSEGV: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
    SIGBUS: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
    SIGFPE: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGPIPE: javaSignalHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGXFSZ: javaSignalHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
    SIGILL: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGUSR2: SR_handler in libjvm.so, mask=00000000000000000000000000000000, flags=SA_RESTART|SA_SIGINFO
    SIGHUP: SIG_DFL, mask=00000000000000000000000000000000, flags=none
    SIGINT: SIG_DFL, mask=00000000000000000000000000000000, flags=none
   SIGTERM: SIG_DFL, mask=00000000000000000000000000000000, flags=none
   SIGQUIT: javaSignalHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGTRAP: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO


---------------  S Y S T E M  ---------------

OS:
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.1 LTS"
uname: Linux 5.15.0-48-generic structurizr/structurizr#54-Ubuntu SMP Fri Aug 26 13:26:29 UTC 2022 x86_64
OS uptime: 0 days 0:18 hours
libc: glibc 2.35 NPTL 2.35 
rlimit (soft/hard): STACK 8192k/infinity , CORE infinity/infinity , NPROC infinity/infinity , NOFILE 1048576/1048576 , AS infinity/infinity , CPU infinity/infinity , DATA infinity/infinity , FSIZE infinity/infinity , MEMLOCK 64k/64k
load average: 0.44 0.87 1.01

/proc/meminfo:
MemTotal:       32875028 kB
MemFree:        17946604 kB
MemAvailable:   25609248 kB
Buffers:          319380 kB
Cached:          7538476 kB
SwapCached:            0 kB
Active:          3366916 kB
Inactive:       10923012 kB
Active(anon):      17380 kB
Inactive(anon):  6438864 kB
Active(file):    3349536 kB
Inactive(file):  4484148 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Dirty:              1256 kB
Writeback:             0 kB
AnonPages:       6432052 kB
Mapped:          1183400 kB
Shmem:             81560 kB
KReclaimable:     292312 kB
Slab:             434644 kB
SReclaimable:     292312 kB
SUnreclaim:       142332 kB
KernelStack:       24944 kB
PageTables:        44844 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    18534660 kB
Committed_AS:   17892192 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       64744 kB
VmallocChunk:          0 kB
Percpu:            10272 kB
HardwareCorrupted:     0 kB
AnonHugePages:     22528 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      405440 kB
DirectMap2M:    33148928 kB

/sys/kernel/mm/transparent_hugepage/enabled: always [madvise] never
/sys/kernel/mm/transparent_hugepage/defrag (defrag/compaction efforts parameter): always defer defer+madvise [madvise] never

Process Memory:
Virtual Size: 5806540K (peak: 5806540K)
Resident Set Size: 18448K (peak: 18448K) (anon: 5900K, file: 12548K, shmem: 0K)
Swapped out: 0K
C-Heap outstanding allocations: 12997K, retained: 66K
glibc malloc tunables: (default)

/proc/sys/kernel/threads-max (system-wide limit on the number of threads): 255943
/proc/sys/vm/max_map_count (maximum number of memory map areas a process may have): 65530
/proc/sys/kernel/pid_max (system-wide limit on number of process identifiers): 4194304

container (cgroup) information:
container_type: cgroupv2
cpu_cpuset_cpus: not supported
cpu_memory_nodes: not supported
active_processor_count: 8
cpu_quota: no quota
cpu_period: 100000
cpu_shares: no shares
memory_limit_in_bytes: unlimited
memory_and_swap_limit_in_bytes: unlimited
memory_soft_limit_in_bytes: unlimited
memory_usage_in_bytes: 7480 k
memory_max_usage_in_bytes: not supported
maximum number of tasks: 38391
current number of tasks: 2

KVM virtualization detected
Steal ticks since vm start: 0
Steal ticks percentage since vm start:  0.000

CPU: total 8 (initial active 8) (8 cores per cpu, 1 threads per core) family 6 model 158 stepping 13 microcode 0x0, cx8, cmov, fxsr, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, clmul, vzeroupper, clflush, clflushopt, hv
CPU Model and flags from /proc/cpuinfo:
model name	: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single tpr_shadow vnmi flexpriority vpid fsgsbase avx2 invpcid rdseed clflushopt md_clear flush_l1d arch_capabilities

Online cpus: 0-7
Offline cpus: 
BIOS frequency limitation: <Not Available>
Frequency switch latency (ns): <Not Available>
Available cpu frequencies: <Not Available>
Current governor: <Not Available>
Core performance/turbo boost: <Not Available>

Memory: 4k page, physical 32875028k(17946604k free), swap 2097148k(2097148k free)
Page Sizes: 4k

vm_info: OpenJDK 64-Bit Server VM (17.0.4+8) for linux-amd64 JRE (17.0.4+8), built on Jul 19 2022 00:00:00 by "temurin" with gcc 10.3.0

END.

I tried tweaking the memory limits a bit (java -jar -Xms6G -Xmx8G /usr/local/structurizr-lite.war) but that yielded the same result.
I ran free -h from the docker container context:

root@7f84bcb9477d:/# free -h
               total        used        free      shared  buff/cache   available
Mem:            31Gi       6.5Gi        17Gi        80Mi       7.8Gi        24Gi
Swap:          2.0Gi          0B       2.0Gi

Multiple relationships between containers of 2 systems do not render properly - only the last one declared is rendered

Description

When there are 2 relationships between containers of 2 software systems (for example because the technology underpinning those relationships is not the same), only the last relationship declared in the DSL is rendered ; expectation is to have both relationships rendered.
Example 1 (relationship a.c2 -> b.c2 not rendered) :

 workspace {
    !identifiers hierarchical
    model {
          a = softwareSystem "System A" {
              c1 = container "Container A1"
              c2 = container "Container A2"
          }
          b = softwareSystem "System B" {
              c1 = container "Container B1"
              c2 = container "Container B2"
          }
          a.c1 -> b.c1 "Does 1" "Techno 1"
          a.c2 -> b.c2 "Does 2" "Techno 2"
    }
    views {
        systemLandscape test-ab "Test 4 bug"
            include *
            autolayout lr
    }
}

On the contrary, if:

  • one relationship is between containers of those 2 systems,
  • and one relationship is between the 2 systems directly
    Then the 2 relationships are rendered as expected.
    Example 2 (relationship a -> b rendered):
workspace {
    !identifiers hierarchical
    model {
          a = softwareSystem "System A" {
              c1 = container "Container A1"
              c2 = container "Container A2"
          }
          b = softwareSystem "System B" {
              c1 = container "Container B1"
              c2 = container "Container B2"
          }
          a.c1 -> b.c1 "Does 1" "Techno 1"
          a -> b "Does 2" "Techno 2"
    }
    views {
        systemLandscape test-ab "Test 4 bug"
            include *
            autolayout lr
    }
}

Steps to reproduce

Render the Description' Example 1 in Structurizr/lite

Screenshot

No response

Code sample

No response

Configuration

Docker for Structurizr/lite 3046.

Severity

Major

Priority

Medium

Resolution

I have no budget, please fix this for free

More information

No response

Rendering plantuml / mermaid in markdowns included with !docs

Question

I'm trying to render a plantuml diagram in a markdown file included with !docs, however it doesn't render and I simply see the contents of the plantuml script.

Is this a supported feature?

Here's the example I'm trying to render:

@startuml 

Alice -> Bob: Hello!
Bob -> Alice: Hi!
		
@enduml

Nested bullet points are flattened

Hi Simon

For a (short-lived) project we're experimenting going all-in structurizr for diagrams and documentation, as the workflow is very appealing.

I know you have stated that not all markdown features might be supported:

markdown-it is used to render Markdown, and asciidoctor.js is used to render AsciiDoc. Please note that Structurizr's documentation feature may not render your Markdown/AsciiDoc in exactly the same way that other dedicated documentation tools will, and some features may not be supported. If you need full control over the look and feel of your documentation, you may be better to use an external tool (e.g. Asciidoctor, Hugo, Jekyll, etc) in conjunction with the iframe embed or image embed features.

But I think this (nested lists) still counts as an elemental feature in order to write even the most simple forms of documentation.

image

Any chance this is fixable? Or do you have a workaround?

Unable to disable automatic layout using struturizr lite docker image

I'm running the structurizr lite docker image locally using:

docker run -it --rm -p 8080:8080 -v $PWD:/usr/local/structurizr structurizr/lite

and then editing workspace.dsl to the sample to the basic example in the language reference

workspace {

    model {
        user = person "User"
        softwareSystem = softwareSystem "Software System" {
            webapp = container "Web Application"
            database = container "Database"
         }

        user -> webapp "Uses"
        webapp -> database "Reads from and writes to"
    }
    
    views {
    	theme default
    }

}

When I render it on localhost:8080 I can't edit because This diagram is not editable because automatic layout is enabled. However the dsl contains no autoLayout option. I can see autoLayout in workplace.json but if I remove that, it is overwritten and recreated again.

Is there a way to hot reload changes?

Hi,

I'm using docker command docker run --rm -v $(pwd):/usr/local/structurizr -p 8080:8080 structurizr/lite is there any way to hot reload the changes using plugins (jetbrains), extensions (vscode). I tried "live server" with proxy but it does not reload the changes done to workspace.dsl.
If there are any way to do it, please shed a light on it.

Thanks

New versions of StruturizrR Lite fail to parse some relationships

Description

New versions of StruturizrR Lite fail to parse some relationships. I provided one example, but there are others. Sometimes it fails if a relationship doesn't have a description.

Steps to reproduce

  1. Checkout https://github.com/max-arshinov/masad/tree/main
  2. Update line 21 of the model.dsl file:
  • before update: internetBankingSystem -> email "Sends email using"
  • after update: internetBankingSystem -> email "Sends e-mail using"

Expected behavior
StructurizR updates the relationship comment.

Actual behavior
StructurizR fails with the following error workspace.dsl: Cannot invoke "Object.equals(Object)" because "r" is null at line 21: internetBankingSystem -> email "Sends e-mail using" at line 5: !include model.dsl

Screenshot

image

Code sample

group "Big Bank plc" {
    mainframe = softwaresystem "Mainframe Banking System" "Stores all of the core banking information about customers, accounts, transactions, etc." "Existing"
    supportStaff -> mainframe "Uses"

    email = softwaresystem "E-mail System" "The internal Microsoft Exchange e-mail system." "Existing"
    email -> customer "Sends e-mails to"

    atm = softwaresystem "ATM" "Allows customers to withdraw cash." "Existing"
    atm -> mainframe "Uses"

    customer -> atm "Withdraws cash using"

    internetBankingSystem = softwaresystem "Internet Banking System" "Allows customers to view information about their bank accounts, and make payments." {
        !include internet-banking-system/ibs.dsl
    }
    internetBankingSystem -> mainframe "Gets account information from, and makes payments using"
    internetBankingSystem -> email "Sends e-mail using" 
    customer -> internetBankingSystem "Views account balances and makes payments using"
}

Configuration

services:
target-architecture:
container_name: software-architecture-documentation-target
image: structurizr/lite
volumes:
- ./target:/usr/local/structurizr
ports:
- "8081:8080"

Severity

Critical

Priority

High

Resolution

I'm willing to fix this myself and raise a PR

More information

No response

Problems with Docker behind SSL Terminating Reverse Proxy (Traefik)

When deploying structurizrs docker image as a container behind an SSL terminating reverse proxy (like traefik) by docker-compose some static content like css and js files are not reachable as their URLs are generated with "http" not "https".
Other URLs are correctly built with "https".

In this example when opening structurizr with the Base URL "https://struct.example.com" this is the result:

grafik

Design completely messed up cause of missing css/js. This can be found in DevTools network view:

grafik

Is there any way to configure structurizrs Base URL / Scheme (Env - var?) Couldn't find anything in the Docker regarding docs.
Or could structurizr simply respect "X-Forwarded-Proto" Header for building URLs?

Content must be specified at line 6: !docs docs

Hey,
I have a problem running my structurizr lite with AsciiDoc documentation. I'm getting the following error:

workspace.dsl: Error importing documentation from /usr/local/structurizr/docs: java.lang.IllegalArgumentException: Content must be specified at line 6: !docs docs

This has been working fine and I don't think I have changed anything in the documentation. This is the output from the container terminal meaning that the doc folder and content inside do really exist:

# ls /usr/local/structurizr
docs  images  workspace.dsl  workspace.json
# ls /usr/local/structurizr/docs
1.Introduction.adoc  3.1.Frontend.adoc     3.4.EventsHandlerApp.adoc
2.Cloud.adoc     3.2.Backend.adoc     3.9.Others.adoc
3.0.Components.adoc  3.3.CampaignTasksFunction.adoc  4.Additional.adoc

What seems to be an issue here?
Thanks

Issues with kts scripts

Description

Hello, I am facing the following error while browsing the site : java.lang.RuntimeException: Could not load a scripting engine for extension "kts".

Maybe you have an idea?

The issue seems to be similar to this one : #33

Steps to reproduce

I haven't found a way to systematically reproduce the bug, but these steps produced an error for me :

  1. Navigate to documentation
  2. Navigate to Diagrams
  3. Repeat the operations several times

Screenshot

image

Code sample

workspace {

    model {
        user = person "User"
        softwareSystem = softwareSystem "Software System" {
            test_container = container "Test Container" {
                description "test_container"
                tags "test"
                technology "TEST TECHNOLOGY"
            }
        }

        user -> softwareSystem "Uses"
    }

    # https://github.com/structurizr/dsl/blob/master/docs/language-reference.md#scripts
    !script scripts/copy_containers_tech_as_tags.kts



    views {
        systemContext softwareSystem "Diagram1" {
            include *
            autoLayout
        }
        container softwareSystem "Diagram2" {
            include *
            autoLayout
        }
    }

}

Configuration

Structurizr versions

  • build: 3078 (2023-06-19T15:14:49Z
  • structurizr-java: v1.24.1
  • structurizr-dsl: v1.30.1
  • structurizr-import: v1.4.1

Device

  • macOS :13.4 (22F66)
  • chip : Apple M1 Pro

Severity

Minor

Priority

Low

Resolution

I have no budget, please fix this for free

More information

Content of scripts/copy_containers_tech_as_tags.kts :

import com.structurizr.model.*

// For each container, append defined Technology as new Tag
// in order to help styling (styles are based on tags)
workspace.model.softwareSystems.forEach { ss: SoftwareSystem ->
    ss.containers.forEach { co: Container ->
        val tech: String? = co.technology?.trim()
        if (!tech.isNullOrEmpty()) {
            co.addTags(tech)
        }
    }
}

AsciiDoc preview doesn't hold the right order of Headings

Hey,

Preview of my .adoc file doesn't hold the right order of the headings. There is only one level 2 headings and every other level 3 heading is appended to that one.

This is my doc file:
image

This is how it looks in Structurizrz lite:
image

Is it a bug or am I doing something wrong?

Perspectives button missing

I just updated to the latest version and was doing a little testing and noticed that the perspectives button is no longer appearing for me. To verify it wasn't a DSL issue on my end, I downloaded the perspectives sample from the cookbook and it's behaving the same way. Is anyone else experiencing the same issue?

Structurizr Lite destroys work on workspace

I don't know how reproducible this is, but here's a walkthrough of what I did, along with a gist of the error log

  1. Build context view
  2. Auto layout with button
  3. Work through layout, changing styles, tag names, and other normal behavior
  4. Export to png
  5. Left for lunch hour (expecting this is the problem based on logs)
  6. Came back, changed another tag
  7. Refresh layout, get a completely baseline layout, no recovery possible

This has happened several times. We're using source control for workspace.dsl and workspace.json. I cannot use the undo layout changes button, as it seems to have also destroyed all history in the process.

attached error log
https://gist.github.com/ss-traviswilliams/785a90fdfd03c6195a8f746901348c72

Generated HTML offline page is not clickable

The title says it all, when you're inside of Structurizr Lite, you can click throughout the diagrams, but when you generate the offline HTML page, you don't have this option.

The mouse shows a (+) Zoom icon, however double clicking doesn't do anything.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.