{"id":45877433,"url":"https://github.com/lsd-consulting/lsd-core","last_synced_at":"2026-02-27T12:45:31.084Z","repository":{"id":37712856,"uuid":"369911048","full_name":"lsd-consulting/lsd-core","owner":"lsd-consulting","description":"Core components for generating reports with sequence diagrams","archived":false,"fork":false,"pushed_at":"2026-02-15T21:51:44.000Z","size":5292,"stargazers_count":6,"open_issues_count":7,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-02-15T23:40:01.617Z","etag":null,"topics":["lsd","sequence-diagrams"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lsd-consulting.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-05-22T21:43:38.000Z","updated_at":"2026-02-15T16:42:04.000Z","dependencies_parsed_at":"2024-03-08T11:29:52.690Z","dependency_job_id":"0cd45bc5-ac99-46b0-9bc0-4150c280bba0","html_url":"https://github.com/lsd-consulting/lsd-core","commit_stats":null,"previous_names":["nickmcdowall/lsd-core"],"tags_count":257,"template":false,"template_full_name":null,"purl":"pkg:github/lsd-consulting/lsd-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lsd-consulting%2Flsd-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lsd-consulting%2Flsd-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lsd-consulting%2Flsd-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lsd-consulting%2Flsd-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lsd-consulting","download_url":"https://codeload.github.com/lsd-consulting/lsd-core/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lsd-consulting%2Flsd-core/sbom","scorecard":{"id":600955,"data":{"date":"2025-08-11","repo":{"name":"github.com/lsd-consulting/lsd-core","commit":"376a4476fa199d04b6f8fdc9f1dd814ff1f4902d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/19 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/dependabot_merge.yml:1","Warn: no topLevel permission defined: .github/workflows/nightly.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/lsd-consulting/lsd-core/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/lsd-consulting/lsd-core/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dependabot_merge.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/lsd-consulting/lsd-core/dependabot_merge.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/nightly.yml:8: update your workflow using https://app.stepsecurity.io/secureworkflow/lsd-consulting/lsd-core/nightly.yml/main?enable=pin","Info:   0 out of   4 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 22 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-21T00:24:29.765Z","repository_id":37712856,"created_at":"2025-08-21T00:24:29.765Z","updated_at":"2025-08-21T00:24:29.765Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29895601,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T12:09:13.686Z","status":"ssl_error","status_checked_at":"2026-02-27T12:09:13.282Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["lsd","sequence-diagrams"],"created_at":"2026-02-27T12:45:30.178Z","updated_at":"2026-02-27T12:45:31.076Z","avatar_url":"https://github.com/lsd-consulting.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![CI](https://github.com/lsd-consulting/lsd-core/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/lsd-consulting/lsd-core/actions/workflows/ci.yml)\n[![Nightly Build](https://github.com/lsd-consulting/lsd-core/actions/workflows/nightly.yml/badge.svg)](https://github.com/lsd-consulting/lsd-core/actions/workflows/nightly.yml)\n[![GitHub release](https://img.shields.io/github/release/lsd-consulting/lsd-core)](https://github.com/lsd-consulting/lsd-core/releases)\n[![Maven Central](https://img.shields.io/maven-central/v/io.github.lsd-consulting/lsd-core.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22io.github.lsd-consulting%22%20AND%20a:%22lsd-core%22)\n[![](https://data.jsdelivr.com/v1/package/gh/lsd-consulting/lsd-core/badge)](https://www.jsdelivr.com/package/gh/lsd-consulting/lsd-core)\n\n![LSD](src/main/resources/static/lsd_logo.png)\n\n# Living Sequence Diagrams \n\n\u003e Automatically generate interactive sequence diagrams from your code\n\nLSD Core transforms how you document system interactions. Instead of manually maintaining sequence diagrams that quickly become stale, **capture interactions programmatically** and generate living documentation that stays in sync with your code.\n\n**Key Features:**\n- Generate sequence diagrams without writing PlantUML markup\n- Interactive HTML reports with clickable event details\n- Component diagrams showing system-wide relationships\n- Automatic diagram splitting for complex flows\n- Multiple output formats and customizable themes\n\n**Use Cases:**\n- Document API interactions in integration tests\n- Visualize microservice communication patterns\n- Debug complex distributed system flows\n- Generate architecture documentation from tests\n- Create onboarding materials automatically\n\n![LSD_example](https://user-images.githubusercontent.com/1330362/233956459-f8545861-b323-4243-9097-4b1dd1877bda.gif)\n\n## Table of Contents\n\n- [Why LSD?](#why-lsd)\n- [Quick Start](#quick-start)\n- [Advanced Features](#advanced-features)\n- [Configuration](#configuration)\n- [Gallery](#gallery)\n- [Ecosystem](#ecosystem)\n- [FAQ](#faq)\n- [Development](#development)\n\n## Why LSD?\n\n### Traditional Approach\n\n```plantuml\n@startuml\nUser -\u003e API: POST /login\nAPI -\u003e Database: SELECT * FROM users\nDatabase --\u003e API: user data\nAPI --\u003e User: 200 OK\n@enduml\n```\n\n**Problems:**\n- Manual maintenance required\n- Quickly becomes outdated\n- No connection to actual code\n- Limited interactivity\n\n### LSD Approach\n\n```kotlin\n// In your test or application code\nlsd.capture(\n    \"User\" messages \"API\" withLabel \"POST /login\",\n    \"API\" messages \"Database\" withLabel \"SELECT * FROM users\",\n    \"Database\" messages \"API\" withLabel \"user data\" withType SYNCHRONOUS_RESPONSE,\n    \"API\" messages \"User\" withLabel \"200 OK\" withType SYNCHRONOUS_RESPONSE\n)\n```\n\n**Benefits:**\n- Generated from actual execution\n- Always in sync with code\n- Interactive HTML with details\n- Automatic from tests\n\n### Features at a Glance\n\n| Feature | Description |\n|---------|-------------|\n| **Zero Markup** | No PlantUML syntax to learn - just Java/Kotlin code |\n| **Living Documentation** | Diagrams generated from actual execution, not manual drawings |\n| **Interactive Reports** | Click any interaction to see full request/response details |\n| **Multiple Diagrams** | Sequence diagrams + component diagrams from same data |\n| **Test Integration** | JUnit 5 and Cucumber plugins available |\n| **HTTP Interception** | Auto-capture REST/HTTP calls with interceptors |\n| **Customizable** | Themes, colors, participant types, custom icons |\n| **Large Diagram Support** | Auto-splitting for complex flows |\n| **Offline Mode** | Works without internet (inline CSS/JS) |\n\n## Quick Start\n\n### Installation\n\nAdd the dependency to your project: [![Maven Central](https://img.shields.io/maven-central/v/io.github.lsd-consulting/lsd-core.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22io.github.lsd-consulting%22%20AND%20a:%22lsd-core%22)\n\n\u003cdetails\u003e\n  \u003csummary\u003eMaven\u003c/summary\u003e\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.lsd-consulting\u003c/groupId\u003e\n    \u003cartifactId\u003elsd-core\u003c/artifactId\u003e\n    \u003cversion\u003eX.X.X\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eGradle\u003c/summary\u003e\n\n```groovy\nimplementation 'io.github.lsd-consulting:lsd-core:X.X.X'\n```\n\u003c/details\u003e\n\n### Basic Usage\n\nCapture interactions using the `LsdContext` singleton:\n\n\u003cdetails open\u003e\n  \u003csummary\u003eKotlin Example\u003c/summary\u003e\n\n(Kotlin DSL as below or alternatively use the Java style builder or create `Message()` instances directly)\n\n```kotlin\nfun main() {\n    val lsd = LsdContext.instance\n\n    // Capture message exchanges\n    lsd.capture(\n        \"User Service\" messages \"Auth Service\" withLabel \"POST /authenticate\",\n        \"Auth Service\" messages \"User Service\" withLabel \"200 OK\" withData \"\u003ctoken\u003e\"\n    )\n\n    // Complete the scenario and generate report\n    lsd.completeScenario(\"User Authentication Flow\")\n    lsd.completeReport(\"Authentication API\")\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eJava Example\u003c/summary\u003e\n\n```java\npublic static void main(String[] args) {\n    LsdContext lsd = LsdContext.getInstance();\n    \n    lsd.capture(\n        messageBuilder()\n            .from(\"User Service\")\n            .to(\"Auth Service\")\n            .label(\"POST /authenticate\"),\n        messageBuilder()\n            .from(\"Auth Service\")\n            .to(\"User Service\")\n            .label(\"200 OK\")\n            .data(\"\u003ctoken\u003e\")\n            .type(SYNCHRONOUS_RESPONSE)\n    );\n    \n    lsd.completeScenario(\"User Authentication Flow\");\n    lsd.completeReport(\"Authentication API\");\n}\n```\n\u003c/details\u003e\n\n**Output:** The generated HTML report will be in `build/reports/lsd/` (configurable via properties).\n\n### Real-World Example\n\nHere's how you might document an order processing flow:\n\n```kotlin\n@Test\nfun `process order with payment`() {\n    val lsd = LsdContext.instance\n    \n    // Customer places order\n    lsd.capture(\n        \"Customer\" messages \"Order Service\" withLabel \"POST /orders {items, total}\"\n    )\n    \n    // Order service validates and requests payment\n    lsd.capture(\n        \"Order Service\" messages \"Payment Service\" withLabel \"POST /payments\",\n        \"Payment Service\" messages \"Order Service\" withLabel \"200 OK\" withData \"\u003ctransactionId\u003e\" withType SYNCHRONOUS_RESPONSE,\n    )\n    \n    // Order confirmed\n    lsd.capture(\n        \"Order Service\" messages \"Customer\" withLabel \"201 Created\" withData \"\u003corderId\u003e\" withType SYNCHRONOUS_RESPONSE\n    )\n    \n    lsd.completeScenario(\"Successful Order Processing\")\n    lsd.completeReport(\"E-Commerce API Flows\")\n}\n```\n\nThis generates an interactive diagram showing the complete flow, with each arrow clickable to reveal request/response details.\n\n## Advanced Features\n\n### Customizing Participants\n\nEnhance diagrams with typed participants that have custom colors and aliases:\n\n```kotlin\n// Define participants with visual styling\nval frontend = BOUNDARY.called(\"Web App\", \"Frontend\", \"#3498db\")\nval api = CONTROL.called(\"API Gateway\", \"Gateway\", \"#2ecc71\")\nval userDb = DATABASE.called(\"PostgreSQL\", \"User DB\", \"#e74c3c\")\nval cache = DATABASE.called(\"Redis\", \"Cache\", \"#f39c12\")\nval queue = QUEUE.called(\"RabbitMQ\", \"Event Queue\", \"#9b59b6\")\n\n// Register participants for consistent styling across scenarios\nlsd.addParticipants(listOf(frontend, api, userDb, cache, queue))\n\n// Use in messages\nlsd.capture(\n    frontend messages api withLabel \"GET /users/123\" withData \"data for report diagram popup (may contain json, xml, html)\"\n)\n```\n\n**Available Participant Types:**\n\n| Type | Visual | Best For |\n|------|--------|----------|\n| `ACTOR` | Stick figure | End users, external actors |\n| `BOUNDARY` | Box with side bar | UI components, API boundaries |\n| `CONTROL` | Circle with arrow | Controllers, orchestrators |\n| `DATABASE` | Cylinder | Databases, data stores |\n| `ENTITY` | Circle | Domain entities, models |\n| `QUEUE` | Queue icon | Message queues, event streams |\n| `COLLECTIONS` | Stacked boxes | Collections, lists |\n| `PARTICIPANT` | Simple box | Generic components (default) |\n\n### Sequence Events\n\nBeyond messages, capture additional context with these event types:\n\n```kotlin\n// Add a title to the diagram\nlsd.capture(PageTitle(\"User Registration Flow\"))\n\n// Add explanatory notes\nlsd.capture(NoteOver(\"API\", \"Validates email format\"))\nlsd.capture(NoteLeft(\"Database\", \"Checks for existing user\"))\nlsd.capture(NoteRight(\"Email Service\", \"Sends welcome email\"))\n\n// Show async operations or delays\nlsd.capture(TimeDelay(\"Processing...\"))\n\n// Split complex flows into multiple pages\nlsd.capture(Newpage title \"Payment Processing\")\n\n// Show active processing for a component (useful for async operations)\nlsd.capture(ACTIVATE lifeline \"Payment Processor\" withColour \"#ff6b6b\")\n// ... capture message events ...\nlsd.capture(DEACTIVATE lifeline \"Payment Processor\")\n```\n\n**Available Event Types:**\n\n| Event | Use Case | Example |\n|-------|----------|----------|\n| `PageTitle` | Set diagram title | `PageTitle(\"Authentication Flow\")` |\n| `NoteLeft` | Add context to the left | `NoteLeft(\"API\", \"Rate limited\")` |\n| `NoteRight` | Add context to the right | `NoteRight(\"DB\", \"Cached result\")` |\n| `NoteOver` | Add context over lifeline | `NoteOver(\"Service\", \"Retry logic\")` |\n| `TimeDelay` | Show elapsed time | `TimeDelay(\"5 seconds\")` |\n| `Newpage` | Split into pages | `Newpage(\"Error Handling\")` |\n| `ActivateLifeline` | Show active processing | `ActivateLifeline(\"Worker\", \"red\")` |\n| `DeactivateLifeline` | End active processing | `DeactivateLifeline(\"Worker\")` |\n\n### Additional Capabilities\n\n**Generate an index page** for multiple reports:\n```kotlin\nlsd.createIndex()\n```\n\n**Create component diagrams** showing relationships across all scenarios:\n```kotlin\nlsd.completeComponentsReport(\"Relationships\")\n```\n\n**Highlight important information** with facts:\n```kotlin\n// The keyword \"Lorem\" will be highlighted throughout the report\nlsd.addFact(\"Something to highlight\", \"Lorem\")\n```\n\n**Include custom icons** (e.g., Font Awesome):\n```kotlin\nlsd.includeFiles(listOf(\"tupadr3/font-awesome-5/heart\"))\nlsd.capture(NoteLeft(\"Friends \u003c$heart{scale=0.4,color=red}\u003e\"))\n```\n## Configuration\n\nCustomize LSD behavior by adding an `lsd.properties` file to your classpath or setting system properties (which take precedence).\n\n| Property | Default | Description |\n|----------|---------|-------------|\n| `lsd.core.label.maxWidth` | `200` | Maximum label width (in characters) before abbreviation |\n| `lsd.core.diagram.theme` | `plain` | PlantUML theme ([available themes](https://plantuml.com/theme)) |\n| `lsd.core.report.outputDir` | `build/reports/lsd` | Output directory for report files |\n| `lsd.core.ids.deterministic` | `false` | Generate deterministic HTML element IDs (useful for approval testing) |\n| `lsd.core.diagram.sequence.maxEventsPerDiagram` | `50` | Maximum events per diagram before auto-splitting |\n| `lsd.core.devMode` | `true` | Offline mode with inline CSS/JS (no CDN dependencies) |\n| `lsd.core.metrics.enabled` | `false` | _Experimental:_ Show performance metrics table |\n\n## Gallery\n\n### Report Types\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\"\u003e\n      \u003cb\u003eSequence Diagrams with Metrics\u003c/b\u003e\u003cbr/\u003e\n      \u003cimg src=\"docs/lsd_metrics_example_report.png\" alt=\"LSD report example\"/\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"50%\"\u003e\n      \u003cb\u003eInteractive Popups\u003c/b\u003e\u003cbr/\u003e\n      Click arrows to view detailed event data\u003cbr/\u003e\n      \u003cimg src=\"docs/popup_example.png\" alt=\"Popup example\"/\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\"\u003e\n      \u003cb\u003eComponent Diagrams\u003c/b\u003e\u003cbr/\u003e\n      Visualize all participants across scenarios\u003cbr/\u003e\n      \u003cimg src=\"docs/combine_components_report.png\" alt=\"components report example\"/\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"50%\"\u003e\n      \u003cb\u003eIndex Pages\u003c/b\u003e\u003cbr/\u003e\n      Navigate between multiple reports\u003cbr/\u003e\n      \u003cimg src=\"docs/example_index.png\" alt=\"index page example\"/\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Ecosystem\n\n**LSD Core** is the foundation library. Several companion libraries automate diagram generation for popular testing frameworks:\n\n- **[lsd-junit-jupiter](https://github.com/lsd-consulting/lsd-junit-jupiter)** - JUnit Jupiter extension\n- **[lsd-junit5](https://github.com/lsd-consulting/lsd-junit5)** - JUnit 5 extension (deprecated)\n- **[lsd-cucumber](https://github.com/lsd-consulting/lsd-cucumber)** - Cucumber plugin\n- **[lsd-interceptors](https://github.com/lsd-consulting/lsd-interceptors)** - HTTP/messaging interceptors\n- **[More libraries...](https://github.com/lsd-consulting)**\n\n\n## FAQ\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eHow does LSD differ from manually writing PlantUML?\u003c/b\u003e\u003c/summary\u003e\n\nLSD generates diagrams from actual code execution, ensuring they stay synchronized with your implementation. You can capture events during tests, and the diagrams are always accurate.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eCan I use LSD with existing test frameworks?\u003c/b\u003e\u003c/summary\u003e\n\nYes! Check out the [Ecosystem](#ecosystem) section for integrations with JUnit, Cucumber, and HTTP interceptors that automatically capture interactions.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eWhat's the performance impact?\u003c/b\u003e\u003c/summary\u003e\n\nLSD is designed for test and development environments. In production, you can disable event capture or use conditional logic. Event capture is lightweight, but diagram generation should happen offline.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eCan I customize the diagram appearance?\u003c/b\u003e\u003c/summary\u003e\n\nYes! You can use any PlantUML theme, customize participant colors, add notes, and control diagram layout. See [Configuration](#configuration) and [Advanced Features](#advanced-features).\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eHow do I handle large diagrams?\u003c/b\u003e\u003c/summary\u003e\n\nLSD automatically splits diagrams when they exceed `lsd.core.diagram.sequence.maxEventsPerDiagram` (default: 50 events). You can also manually split using `Newpage` events.\n\u003c/details\u003e\n\n## Development\n\n### Prerequisites\n\n- Java 17 JDK\n\n### Building\n\n```bash\n./gradlew clean build\n```\n\nGit hooks are configured automatically on first build (uses `.githooks` directory).\n\n### Troubleshooting\n\n#### CDN Cache Issues\n\nStatic files (CSS/JS) are cached on JSDelivr CDN for up to 7 days. To force a cache refresh:\n\n1. Use the [JSDelivr Purge tool](https://www.jsdelivr.com/tools/purge)\n2. Purge these files:\n   - `https://cdn.jsdelivr.net/gh/lsd-consulting/lsd-core@8/src/main/resources/static/style.min.css`\n   - `https://cdn.jsdelivr.net/gh/lsd-consulting/lsd-core@8/src/main/resources/static/custom.min.js`\n3. Clear your browser cache\n\n**Tip:** Use `lsd.core.devMode=true` (default) to avoid CDN issues during development.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE.txt](LICENSE.txt) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flsd-consulting%2Flsd-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flsd-consulting%2Flsd-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flsd-consulting%2Flsd-core/lists"}