chartlet 0.22.0

Compile structured data into deterministic, accessible static charts
Documentation
1
<div class="chartlet-wrapper"><style>.chartlet-stage{position:relative;display:inline-block;max-width:100%;vertical-align:top}.chartlet-stage>svg{display:block}.chartlet-hotspot{position:absolute;border-radius:8px;cursor:pointer}.chartlet-focus{margin:0 0 12px 0;font-size:13px}.chartlet-focus summary{cursor:pointer;min-height:24px}.chartlet-focus fieldset{border:none;padding:0;margin:4px 0 0 0}.chartlet-focus label{display:inline-flex;align-items:center;min-height:44px;margin-right:14px;cursor:pointer;white-space:nowrap}.chartlet-focus input{margin-right:4px}.chartlet-focus input:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.chartlet-wrapper:has(.chartlet-focus-node:checked) #chartlet-47dc90097e464989 .chartlet-f{opacity:.18}#chartlet-47dc90097e464989-hs-0{left:2.034%;top:40%;width:8.814%;height:10.385%}#chartlet-47dc90097e464989-hs-1{left:21.272%;top:41.154%;width:10.303%;height:8.077%}#chartlet-47dc90097e464989-hs-2{left:42.415%;top:40.385%;width:10.151%;height:9.615%}#chartlet-47dc90097e464989-hs-3{left:41.298%;top:55.385%;width:12.385%;height:9.615%}#chartlet-47dc90097e464989-hs-4{left:67.31%;top:47.885%;width:10.151%;height:9.615%}#chartlet-47dc90097e464989-hs-5{left:85.763%;top:48.846%;width:10.169%;height:7.692%}.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-0:checked) #chartlet-47dc90097e464989 .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-0:checked) #chartlet-47dc90097e464989 .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-0:checked) #chartlet-47dc90097e464989 .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-1:checked) #chartlet-47dc90097e464989 .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-1:checked) #chartlet-47dc90097e464989 .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-1:checked) #chartlet-47dc90097e464989 .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-2:checked) #chartlet-47dc90097e464989 .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-2:checked) #chartlet-47dc90097e464989 .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-2:checked) #chartlet-47dc90097e464989 .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-3:checked) #chartlet-47dc90097e464989 .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-3:checked) #chartlet-47dc90097e464989 .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-3:checked) #chartlet-47dc90097e464989 .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-4:checked) #chartlet-47dc90097e464989 .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-4:checked) #chartlet-47dc90097e464989 .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-4:checked) #chartlet-47dc90097e464989 .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-5:checked) #chartlet-47dc90097e464989 .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-5:checked) #chartlet-47dc90097e464989 .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-47dc90097e464989-focus-5:checked) #chartlet-47dc90097e464989 .chartlet-n-5 .chartlet-seq-box{stroke-width:3}</style><details class="chartlet-focus"><summary>Focus</summary><fieldset><label><input type="radio" name="chartlet-47dc90097e464989-focus" checked> Show all</label><label><input type="radio" name="chartlet-47dc90097e464989-focus" class="chartlet-focus-node" id="chartlet-47dc90097e464989-focus-0"> Customer</label><label><input type="radio" name="chartlet-47dc90097e464989-focus" class="chartlet-focus-node" id="chartlet-47dc90097e464989-focus-1"> Load balancer</label><label><input type="radio" name="chartlet-47dc90097e464989-focus" class="chartlet-focus-node" id="chartlet-47dc90097e464989-focus-2"> shop-api:2.4</label><label><input type="radio" name="chartlet-47dc90097e464989-focus" class="chartlet-focus-node" id="chartlet-47dc90097e464989-focus-3"> order-worker:2.4</label><label><input type="radio" name="chartlet-47dc90097e464989-focus" class="chartlet-focus-node" id="chartlet-47dc90097e464989-focus-4"> postgres:16</label><label><input type="radio" name="chartlet-47dc90097e464989-focus" class="chartlet-focus-node" id="chartlet-47dc90097e464989-focus-5"> Data volume</label></fieldset></details><figure class="chartlet-figure" data-viz="chart"><figcaption>Web shop: deployment</figcaption><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="1180" height="520" viewBox="0 0 1180 520" id="chartlet-47dc90097e464989" role="img" aria-labelledby="chartlet-47dc90097e464989-title chartlet-47dc90097e464989-description" class="chartlet-root chartlet-theme-dark chartlet-blueprint"><title id="chartlet-47dc90097e464989-title">Web shop: deployment</title><desc id="chartlet-47dc90097e464989-description">Architecture diagram with 6 components and 5 connections in 3 boundaries. Production cluster: Load balancer, Node app-1, Node data-1. Node app-1 (in Production cluster): shop-api:2.4, order-worker:2.4. Node data-1 (in Production cluster): postgres:16, Data volume. Most connected: postgres:16 (3 connections). Nothing leads into Customer and order-worker:2.4. Nothing leads out of Data volume. Bottleneck: shop-api:2.4; without it the diagram falls apart. Customer (person): connects to Load balancer (via HTTPS). Load balancer (node): connects to shop-api:2.4 (via HTTP). shop-api:2.4 (artifact): connects to postgres:16 (via SQL/TLS). order-worker:2.4 (artifact): connects to postgres:16 (via SQL/TLS). postgres:16 (artifact): connects to Data volume (writes). Data volume (storage): no outgoing connection.</desc><style>.chartlet-root{--chartlet-text:#172033;--chartlet-muted:#344054;--chartlet-grid:#d9dee8;--chartlet-zero:#667085;--chartlet-accent:#2563eb;--chartlet-background:#fff;--chartlet-color-1:#2563eb;--chartlet-color-2:#c2410c;--chartlet-color-3:#475569;--chartlet-color-4:#111827;max-width:100%;height:auto;font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:var(--chartlet-text)}#chartlet-47dc90097e464989 .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-47dc90097e464989 .chartlet-label,#chartlet-47dc90097e464989 .chartlet-tick,#chartlet-47dc90097e464989 .chartlet-value,#chartlet-47dc90097e464989 .chartlet-value-inverse,#chartlet-47dc90097e464989 .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-47dc90097e464989 .chartlet-value,#chartlet-47dc90097e464989 .chartlet-value-inverse{font-weight:600}#chartlet-47dc90097e464989 .chartlet-value{fill:var(--chartlet-text)}#chartlet-47dc90097e464989 .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-47dc90097e464989 .chartlet-axis-title{font-weight:600}#chartlet-47dc90097e464989 .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-47dc90097e464989 .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-47dc90097e464989 .chartlet-bar,#chartlet-47dc90097e464989 .chartlet-point{fill:var(--chartlet-accent)}#chartlet-47dc90097e464989 .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-47dc90097e464989 .chartlet-background{fill:var(--chartlet-background)}.chartlet-root.chartlet-theme-dark{--chartlet-text:#e8edf6;--chartlet-muted:#a9b4c7;--chartlet-grid:#2a3342;--chartlet-zero:#7b8697;--chartlet-accent:#7ea6ff;--chartlet-background:#0e131c;--chartlet-color-1:#7ea6ff;--chartlet-color-2:#ff9c72;--chartlet-color-3:#9aa7bd;--chartlet-color-4:#e2e8f4}.chartlet-root{--chartlet-node:#eef3fd;--chartlet-lane:#f7f9fc;--chartlet-lane-head:#eef1f6;--chartlet-shadow:rgba(16,24,40,.09);--chartlet-role-blue:#2563eb;--chartlet-role-blue-fill:#eef3fd;--chartlet-role-green:#15803d;--chartlet-role-green-fill:#ecfdf3;--chartlet-role-amber:#b45309;--chartlet-role-amber-fill:#fff7e8;--chartlet-role-teal:#0f766e;--chartlet-role-teal-fill:#e9faf7;--chartlet-role-violet:#6d28d9;--chartlet-role-violet-fill:#f3efff;--chartlet-role-gray:#667085;--chartlet-role-gray-fill:#f7f8fa;--chartlet-role-red:#b42318;--chartlet-role-red-fill:#fef3f2}.chartlet-root.chartlet-theme-dark{--chartlet-node:#1a2436;--chartlet-lane:#121925;--chartlet-lane-head:#18212f;--chartlet-shadow:rgba(0,0,0,.45);--chartlet-role-blue:#7ea6ff;--chartlet-role-blue-fill:#1a2436;--chartlet-role-green:#4ade80;--chartlet-role-green-fill:#132a1d;--chartlet-role-amber:#fbbf24;--chartlet-role-amber-fill:#2b2210;--chartlet-role-teal:#2dd4bf;--chartlet-role-teal-fill:#0f2a27;--chartlet-role-violet:#b69cff;--chartlet-role-violet-fill:#231c38;--chartlet-role-gray:#9aa7bd;--chartlet-role-gray-fill:#161d29;--chartlet-role-red:#f97066;--chartlet-role-red-fill:#2d1616}#chartlet-47dc90097e464989 .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-47dc90097e464989 .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-47dc90097e464989 .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-47dc90097e464989 .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-47dc90097e464989 .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-47dc90097e464989 .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-47dc90097e464989 .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-47dc90097e464989 .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-47dc90097e464989 .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-47dc90097e464989 .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-47dc90097e464989 .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-47dc90097e464989 .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-47dc90097e464989 .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-47dc90097e464989 .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-47dc90097e464989 .chartlet-flow-start{stroke-width:2}#chartlet-47dc90097e464989 .chartlet-flow-end{stroke-width:3}#chartlet-47dc90097e464989 .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-47dc90097e464989 .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-47dc90097e464989 .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-47dc90097e464989 .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-47dc90097e464989 .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-47dc90097e464989 .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-47dc90097e464989 .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-47dc90097e464989 .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-47dc90097e464989 .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-47dc90097e464989 .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-47dc90097e464989 .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-47dc90097e464989 .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-47dc90097e464989 .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-47dc90097e464989 .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-47dc90097e464989 .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-47dc90097e464989 .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-47dc90097e464989 .chartlet-arch-head{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet);stroke-width:1.5}#chartlet-47dc90097e464989 .chartlet-arch-dot{fill:var(--chartlet-role-blue);stroke:none}.chartlet-root.chartlet-blueprint{--chartlet-text:#eaf4ff;--chartlet-muted:#b8d4f2;--chartlet-grid:#3d73ab;--chartlet-zero:#8fb8e0;--chartlet-accent:#7fd3ff;--chartlet-background:#0b3a68;--chartlet-node:#12497f;--chartlet-lane:#0e4073;--chartlet-lane-head:#14518d;--chartlet-shadow:rgba(0,0,0,0);--chartlet-role-blue:#8ecbff;--chartlet-role-blue-fill:#12497f;--chartlet-role-green:#9ae6b4;--chartlet-role-green-fill:#0f4d63;--chartlet-role-amber:#ffd98a;--chartlet-role-amber-fill:#1a4a6e;--chartlet-role-teal:#7fe3d6;--chartlet-role-teal-fill:#0c4b66;--chartlet-role-violet:#cbbaff;--chartlet-role-violet-fill:#1d4378;--chartlet-role-gray:#b8c9dc;--chartlet-role-gray-fill:#133f6e;--chartlet-role-red:#ffa198;--chartlet-role-red-fill:#183f6a}</style><rect class="chartlet-background" x="0" y="0" width="1180" height="520"/><rect x="239.007" y="154" width="916.993" height="208" class="chartlet-flow-group"/><text x="247.007" y="167" text-anchor="start" class="chartlet-flow-group-label">Production cluster</text><rect x="782.259" y="221" width="361.741" height="90" class="chartlet-flow-group"/><text x="790.259" y="234" text-anchor="start" class="chartlet-flow-group-label">Node data-1</text><rect x="475.317" y="182" width="170.14" height="168" class="chartlet-flow-group"/><text x="483.317" y="195" text-anchor="start" class="chartlet-flow-group-label">Node app-1</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="128,235 243.007,235" class="chartlet-flow-edge"><title>Customer → Load balancer: [HTTPS]</title></polyline><polyline points="243.007,238.5 251.007,235 243.007,231.5 243.007,238.5" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="372.577,235 492.497,235" class="chartlet-flow-edge"><title>Load balancer → shop-api:2.4: [HTTP]</title></polyline><polyline points="492.497,238.5 500.497,235 492.497,231.5 492.497,238.5" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><polyline points="620.277,235 757.246,235 757.246,262 786.259,262" class="chartlet-flow-edge"><title>shop-api:2.4 → postgres:16: [SQL/TLS]</title></polyline><polyline points="786.259,265.5 794.259,262 786.259,258.5 786.259,265.5" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-4"><polyline points="633.457,313 757.246,313 757.246,286 786.259,286" class="chartlet-flow-edge"><title>order-worker:2.4 → postgres:16: [SQL/TLS]</title></polyline><polyline points="786.259,289.5 794.259,286 786.259,282.5 786.259,289.5" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><polyline points="914.039,274 1004,274" class="chartlet-flow-edge"><title>postgres:16 → Data volume: writes</title></polyline><polyline points="1004,277.5 1012,274 1004,270.5 1004,277.5" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-4"></g><g class="chartlet-f chartlet-n-3 chartlet-f-3 chartlet-f-4"></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-3 chartlet-f-4 chartlet-f-5"></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5"></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><rect x="132" y="210" width="63.64" height="21" class="chartlet-diagram-chip"/><text x="137" y="224" text-anchor="start" class="chartlet-diagram-chip-text">[HTTPS]</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><rect x="376.577" y="210" width="55.6" height="21" class="chartlet-diagram-chip"/><text x="381.577" y="224" text-anchor="start" class="chartlet-diagram-chip-text">[HTTP]</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><rect x="624.277" y="353" width="78.4" height="21" class="chartlet-diagram-chip"/><text x="629.277" y="367" text-anchor="start" class="chartlet-diagram-chip-text">[SQL/TLS]</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-4"><rect x="705.677" y="353" width="78.4" height="21" class="chartlet-diagram-chip"/><text x="710.677" y="367" text-anchor="start" class="chartlet-diagram-chip-text">[SQL/TLS]</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><rect x="918.039" y="249" width="51.28" height="21" class="chartlet-diagram-chip"/><text x="923.039" y="263" text-anchor="start" class="chartlet-diagram-chip-text">writes</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><rect x="24" y="210.5" width="104" height="54" class="chartlet-diagram-shadow"/><rect x="24" y="208" width="104" height="54" class="chartlet-flow-node chartlet-role-violet"><title>Customer</title></rect><circle cx="76" cy="219" r="6" class="chartlet-arch-head"/><text x="76" y="247.5" text-anchor="middle" class="chartlet-flow-label">Customer</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"><polyline points="251.007,216.5 259.007,210.5 380.577,210.5 380.577,252.5 372.577,258.5 372.577,216.5 251.007,216.5" class="chartlet-diagram-shadow"/><polyline points="251.007,214 259.007,208 380.577,208 380.577,250 372.577,256 372.577,214 251.007,214" class="chartlet-flow-node chartlet-role-gray"/><rect x="251.007" y="216.5" width="121.57" height="42" class="chartlet-diagram-shadow"/><rect x="251.007" y="214" width="121.57" height="42" class="chartlet-flow-node chartlet-role-gray"><title>Load balancer</title></rect><line x1="372.577" y1="214" x2="380.577" y2="208" class="chartlet-flow-inner"/><text x="311.792" y="239.5" text-anchor="middle" class="chartlet-flow-label">Load balancer</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-4"><polyline points="500.497,212.5 608.277,212.5 620.277,224.5 620.277,262.5 500.497,262.5 500.497,212.5" class="chartlet-diagram-shadow"/><polyline points="500.497,210 608.277,210 620.277,222 620.277,260 500.497,260 500.497,210" class="chartlet-flow-node chartlet-role-blue"><title>shop-api:2.4 – container image</title></polyline><line x1="608.277" y1="210" x2="608.277" y2="222" class="chartlet-flow-inner"/><line x1="608.277" y1="222" x2="620.277" y2="222" class="chartlet-flow-inner"/><text x="560.387" y="232.5" text-anchor="middle" class="chartlet-flow-label">shop-api:2.4</text><text x="560.387" y="246.5" text-anchor="middle" class="chartlet-flow-sublabel">container image</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-3 chartlet-f-4"><polyline points="487.317,290.5 621.457,290.5 633.457,302.5 633.457,340.5 487.317,340.5 487.317,290.5" class="chartlet-diagram-shadow"/><polyline points="487.317,288 621.457,288 633.457,300 633.457,338 487.317,338 487.317,288" class="chartlet-flow-node chartlet-role-blue"><title>order-worker:2.4 – container image</title></polyline><line x1="621.457" y1="288" x2="621.457" y2="300" class="chartlet-flow-inner"/><line x1="621.457" y1="300" x2="633.457" y2="300" class="chartlet-flow-inner"/><text x="560.387" y="310.5" text-anchor="middle" class="chartlet-flow-label">order-worker:2.4</text><text x="560.387" y="324.5" text-anchor="middle" class="chartlet-flow-sublabel">container image</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-3 chartlet-f-4 chartlet-f-5"><polyline points="794.259,251.5 902.039,251.5 914.039,263.5 914.039,301.5 794.259,301.5 794.259,251.5" class="chartlet-diagram-shadow"/><polyline points="794.259,249 902.039,249 914.039,261 914.039,299 794.259,299 794.259,249" class="chartlet-flow-node chartlet-role-blue"><title>postgres:16 – container image</title></polyline><line x1="902.039" y1="249" x2="902.039" y2="261" class="chartlet-flow-inner"/><line x1="902.039" y1="261" x2="914.039" y2="261" class="chartlet-flow-inner"/><text x="854.149" y="271.5" text-anchor="middle" class="chartlet-flow-label">postgres:16</text><text x="854.149" y="285.5" text-anchor="middle" class="chartlet-flow-sublabel">container image</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5"><polyline points="1012,256.5 1132,256.5 1124,296.5 1020,296.5 1012,256.5" class="chartlet-diagram-shadow"/><polyline points="1012,254 1132,254 1124,294 1020,294 1012,254" class="chartlet-flow-node chartlet-role-teal"><title>Data volume</title></polyline><text x="1072" y="278.5" text-anchor="middle" class="chartlet-flow-label">Data volume</text></g></svg><label class="chartlet-hotspot" id="chartlet-47dc90097e464989-hs-0" for="chartlet-47dc90097e464989-focus-0"></label><label class="chartlet-hotspot" id="chartlet-47dc90097e464989-hs-1" for="chartlet-47dc90097e464989-focus-1"></label><label class="chartlet-hotspot" id="chartlet-47dc90097e464989-hs-2" for="chartlet-47dc90097e464989-focus-2"></label><label class="chartlet-hotspot" id="chartlet-47dc90097e464989-hs-3" for="chartlet-47dc90097e464989-focus-3"></label><label class="chartlet-hotspot" id="chartlet-47dc90097e464989-hs-4" for="chartlet-47dc90097e464989-focus-4"></label><label class="chartlet-hotspot" id="chartlet-47dc90097e464989-hs-5" for="chartlet-47dc90097e464989-focus-5"></label></div><p class="chartlet-source">Source: Operations handbook, production</p><details class="chartlet-data" data-viz-text><summary>Show chart data</summary><table><caption>Data for Web shop: deployment</caption><thead><tr><th scope="col">Component</th><th scope="col">Kind</th><th scope="col">Boundary</th><th scope="col">Connects to</th></tr></thead><tbody><tr><th scope="row">Customer</th><td>person</td><td></td><td>Load balancer (via HTTPS)</td></tr><tr><th scope="row">Load balancer</th><td>node</td><td>Production cluster</td><td>shop-api:2.4 (via HTTP)</td></tr><tr><th scope="row">shop-api:2.4</th><td>artifact</td><td>Production cluster › Node app-1</td><td>postgres:16 (via SQL/TLS)</td></tr><tr><th scope="row">order-worker:2.4</th><td>artifact</td><td>Production cluster › Node app-1</td><td>postgres:16 (via SQL/TLS)</td></tr><tr><th scope="row">postgres:16</th><td>artifact</td><td>Production cluster › Node data-1</td><td>Data volume (writes)</td></tr><tr><th scope="row">Data volume</th><td>storage</td><td>Production cluster › Node data-1</td><td></td></tr></tbody></table></details></figure></div>