diff --git a/.gitignore b/.gitignore
index 782430f..bce6fee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@ obj/
*.user
# NuGet restore scratch dir (DOTNET_CLI_HOME fallout)
.local/
+.idea
diff --git a/LICENSE.TXT b/LICENSE.TXT
new file mode 100644
index 0000000..fce4ddf
--- /dev/null
+++ b/LICENSE.TXT
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Living Software LTD (UK)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/after-dto.mmd.svg b/after-dto.mmd.svg
new file mode 100644
index 0000000..57e72c6
--- /dev/null
+++ b/after-dto.mmd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/before-after-dto.mmd.svg b/before-after-dto.mmd.svg
new file mode 100644
index 0000000..f0bc941
--- /dev/null
+++ b/before-after-dto.mmd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/puppeteer.config.json b/puppeteer.config.json
new file mode 100644
index 0000000..1333d16
--- /dev/null
+++ b/puppeteer.config.json
@@ -0,0 +1,15 @@
+{
+ "executablePath": "/home/willem/.cache/puppeteer/chrome/linux-152.0.7977.75/chrome-linux64/chrome",
+ "headless": true,
+ "args": [
+ "--no-sandbox",
+ "--disable-setuid-sandbox",
+ "--disable-gpu",
+ "--disable-gpu-compositing",
+ "--disable-software-rasterizer",
+ "--disable-dev-shm-usage",
+ "--disable-features=VizDisplayCompositor",
+ "--use-gl=swiftshader",
+ "--disable-gpu-driver-bug-workaround"
+ ]
+}
\ No newline at end of file
diff --git a/scripts/mermaid.sh b/scripts/mermaid.sh
new file mode 100755
index 0000000..c537e77
--- /dev/null
+++ b/scripts/mermaid.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env bash
+# Render a mermaid diagram to SVG using mmdc with sandbox/GPU workarounds
+# for Ubuntu 24.04+ (AppArmor restrictions).
+#
+# Usage: scripts/mermaid.sh input.mmd [output.svg]
+# scripts/mermaid.sh input.mmd - # output to stdout
+
+set -euo pipefail
+
+REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
+CONFIG="$REPO_ROOT/puppeteer.config.json"
+
+if [[ $# -lt 1 ]]; then
+ echo "Usage: $0 [output.svg|-]" >&2
+ exit 1
+fi
+
+INPUT="$1"
+shift
+
+ARGS=("-i" "$INPUT" "-p" "$CONFIG")
+
+if [[ $# -gt 0 ]]; then
+ OUTPUT="$1"
+ shift
+ ARGS+=("-o" "$OUTPUT")
+fi
+
+ARGS+=("$@")
+
+exec mmdc "${ARGS[@]}"
\ No newline at end of file