chartlet 0.8.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-55d7d182de2564d7 .chartlet-f{opacity:.18}#chartlet-55d7d182de2564d7-hs-0{left:1.319%;top:34.676%;width:5.714%;height:8.148%}#chartlet-55d7d182de2564d7-hs-1{left:12.823%;top:33.01%;width:5.714%;height:11.481%}#chartlet-55d7d182de2564d7-hs-2{left:28.48%;top:81.99%;width:7.469%;height:6.667%}#chartlet-55d7d182de2564d7-hs-3{left:29.357%;top:30.787%;width:5.714%;height:15.926%}#chartlet-55d7d182de2564d7-hs-4{left:44.558%;top:20.973%;width:7.559%;height:9.259%}#chartlet-55d7d182de2564d7-hs-5{left:45.325%;top:35.417%;width:6.026%;height:6.667%}#chartlet-55d7d182de2564d7-hs-6{left:58.259%;top:32.454%;width:6.269%;height:12.593%}#chartlet-55d7d182de2564d7-hs-7{left:73.032%;top:61.99%;width:5.714%;height:11.111%}#chartlet-55d7d182de2564d7-hs-8{left:82.161%;top:46.899%;width:6.634%;height:10%}#chartlet-55d7d182de2564d7-hs-9{left:90.998%;top:35.417%;width:7.683%;height:6.667%}#chartlet-55d7d182de2564d7-hs-10{left:45.11%;top:47.269%;width:6.456%;height:12.593%}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-0:checked) #chartlet-55d7d182de2564d7 .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-0:checked) #chartlet-55d7d182de2564d7 .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-0:checked) #chartlet-55d7d182de2564d7 .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-1:checked) #chartlet-55d7d182de2564d7 .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-1:checked) #chartlet-55d7d182de2564d7 .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-1:checked) #chartlet-55d7d182de2564d7 .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-2:checked) #chartlet-55d7d182de2564d7 .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-2:checked) #chartlet-55d7d182de2564d7 .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-2:checked) #chartlet-55d7d182de2564d7 .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-3:checked) #chartlet-55d7d182de2564d7 .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-3:checked) #chartlet-55d7d182de2564d7 .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-3:checked) #chartlet-55d7d182de2564d7 .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-4:checked) #chartlet-55d7d182de2564d7 .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-4:checked) #chartlet-55d7d182de2564d7 .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-4:checked) #chartlet-55d7d182de2564d7 .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-5:checked) #chartlet-55d7d182de2564d7 .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-5:checked) #chartlet-55d7d182de2564d7 .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-5:checked) #chartlet-55d7d182de2564d7 .chartlet-n-5 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-6:checked) #chartlet-55d7d182de2564d7 .chartlet-f-6{opacity:1}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-6:checked) #chartlet-55d7d182de2564d7 .chartlet-n-6 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-6:checked) #chartlet-55d7d182de2564d7 .chartlet-n-6 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-7:checked) #chartlet-55d7d182de2564d7 .chartlet-f-7{opacity:1}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-7:checked) #chartlet-55d7d182de2564d7 .chartlet-n-7 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-7:checked) #chartlet-55d7d182de2564d7 .chartlet-n-7 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-8:checked) #chartlet-55d7d182de2564d7 .chartlet-f-8{opacity:1}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-8:checked) #chartlet-55d7d182de2564d7 .chartlet-n-8 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-8:checked) #chartlet-55d7d182de2564d7 .chartlet-n-8 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-9:checked) #chartlet-55d7d182de2564d7 .chartlet-f-9{opacity:1}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-9:checked) #chartlet-55d7d182de2564d7 .chartlet-n-9 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-9:checked) #chartlet-55d7d182de2564d7 .chartlet-n-9 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-10:checked) #chartlet-55d7d182de2564d7 .chartlet-f-10{opacity:1}.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-10:checked) #chartlet-55d7d182de2564d7 .chartlet-n-10 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-55d7d182de2564d7-focus-10:checked) #chartlet-55d7d182de2564d7 .chartlet-n-10 .chartlet-seq-box{stroke-width:3}</style><details class="chartlet-focus"><summary>Focus</summary><fieldset><label><input type="radio" name="chartlet-55d7d182de2564d7-focus" checked> Show all</label><label><input type="radio" name="chartlet-55d7d182de2564d7-focus" class="chartlet-focus-node" id="chartlet-55d7d182de2564d7-focus-0"> Customer</label><label><input type="radio" name="chartlet-55d7d182de2564d7-focus" class="chartlet-focus-node" id="chartlet-55d7d182de2564d7-focus-1"> Web shop</label><label><input type="radio" name="chartlet-55d7d182de2564d7-focus" class="chartlet-focus-node" id="chartlet-55d7d182de2564d7-focus-2"> Content network</label><label><input type="radio" name="chartlet-55d7d182de2564d7-focus" class="chartlet-focus-node" id="chartlet-55d7d182de2564d7-focus-3"> Shop API</label><label><input type="radio" name="chartlet-55d7d182de2564d7-focus" class="chartlet-focus-node" id="chartlet-55d7d182de2564d7-focus-4"> Session cache</label><label><input type="radio" name="chartlet-55d7d182de2564d7-focus" class="chartlet-focus-node" id="chartlet-55d7d182de2564d7-focus-5"> Order events</label><label><input type="radio" name="chartlet-55d7d182de2564d7-focus" class="chartlet-focus-node" id="chartlet-55d7d182de2564d7-focus-6"> Order worker</label><label><input type="radio" name="chartlet-55d7d182de2564d7-focus" class="chartlet-focus-node" id="chartlet-55d7d182de2564d7-focus-7"> Orders</label><label><input type="radio" name="chartlet-55d7d182de2564d7-focus" class="chartlet-focus-node" id="chartlet-55d7d182de2564d7-focus-8"> Invoices</label><label><input type="radio" name="chartlet-55d7d182de2564d7-focus" class="chartlet-focus-node" id="chartlet-55d7d182de2564d7-focus-9"> Payment provider</label><label><input type="radio" name="chartlet-55d7d182de2564d7-focus" class="chartlet-focus-node" id="chartlet-55d7d182de2564d7-focus-10"> Sign-in</label></fieldset></details><figure class="chartlet-figure" data-viz="chart"><figcaption>Web shop on one cloud region</figcaption><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="1820" height="540" viewBox="0 0 1820 540" id="chartlet-55d7d182de2564d7" role="img" aria-labelledby="chartlet-55d7d182de2564d7-title chartlet-55d7d182de2564d7-description" class="chartlet-root"><title id="chartlet-55d7d182de2564d7-title">Web shop on one cloud region</title><desc id="chartlet-55d7d182de2564d7-description">Architecture diagram with 11 components and 11 connections in 3 boundaries. Cloud region eu-central-1: Invoices, Private network. Private network (in Cloud region eu-central-1): Shop API, Session cache, Order events, Order worker, Sign-in, Data zone. Data zone (in Private network): Orders. Main path: Customer → Web shop → Shop API → Order events → Order worker → Payment provider. Customer (person): connects to Web shop (browses). Web shop (frontend): connects to Content network (loads assets, via HTTPS) and Shop API (calls, via HTTPS/JSON). Shop API (service): connects to Session cache (sessions, via RESP), Sign-in (checks token, via OIDC), Orders (reads, writes, via SQL/TLS) and Order events (publishes, via AMQP). Content network (external system): no outgoing connection. Session cache (cache): no outgoing connection. Order events (queue): connects to Order worker (delivers). Sign-in (security): no outgoing connection. Order worker (service): connects to Payment provider (charges, via HTTPS), Invoices (stores PDF, via S3 API) and Orders (updates, via SQL/TLS). Orders (database): no outgoing connection. Invoices (storage): no outgoing connection. Payment provider (external system): 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-55d7d182de2564d7 .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-55d7d182de2564d7 .chartlet-label,#chartlet-55d7d182de2564d7 .chartlet-tick,#chartlet-55d7d182de2564d7 .chartlet-value,#chartlet-55d7d182de2564d7 .chartlet-value-inverse,#chartlet-55d7d182de2564d7 .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-55d7d182de2564d7 .chartlet-value,#chartlet-55d7d182de2564d7 .chartlet-value-inverse{font-weight:600}#chartlet-55d7d182de2564d7 .chartlet-value{fill:var(--chartlet-text)}#chartlet-55d7d182de2564d7 .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-55d7d182de2564d7 .chartlet-axis-title{font-weight:600}#chartlet-55d7d182de2564d7 .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-55d7d182de2564d7 .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-55d7d182de2564d7 .chartlet-bar,#chartlet-55d7d182de2564d7 .chartlet-point{fill:var(--chartlet-accent)}#chartlet-55d7d182de2564d7 .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-55d7d182de2564d7 .chartlet-background{fill:var(--chartlet-background)}.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-55d7d182de2564d7 .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-55d7d182de2564d7 .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-55d7d182de2564d7 .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-55d7d182de2564d7 .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-55d7d182de2564d7 .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-55d7d182de2564d7 .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-55d7d182de2564d7 .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-55d7d182de2564d7 .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-55d7d182de2564d7 .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-55d7d182de2564d7 .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-55d7d182de2564d7 .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-55d7d182de2564d7 .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-55d7d182de2564d7 .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-55d7d182de2564d7 .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-55d7d182de2564d7 .chartlet-flow-start{stroke-width:2}#chartlet-55d7d182de2564d7 .chartlet-flow-end{stroke-width:3}#chartlet-55d7d182de2564d7 .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-55d7d182de2564d7 .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-55d7d182de2564d7 .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-55d7d182de2564d7 .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-55d7d182de2564d7 .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-55d7d182de2564d7 .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-55d7d182de2564d7 .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-55d7d182de2564d7 .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-55d7d182de2564d7 .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-55d7d182de2564d7 .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-55d7d182de2564d7 .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-55d7d182de2564d7 .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-55d7d182de2564d7 .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-55d7d182de2564d7 .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-55d7d182de2564d7 .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-55d7d182de2564d7 .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-55d7d182de2564d7 .chartlet-arch-head{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet);stroke-width:1.5}#chartlet-55d7d182de2564d7 .chartlet-arch-dot{fill:var(--chartlet-role-blue);stroke:none}</style><rect x="510.296" y="57.252" width="1117.777" height="373.495" class="chartlet-flow-group"/><text x="518.296" y="70.252" text-anchor="start" class="chartlet-flow-group-label">Cloud region eu-central-1</text><rect x="522.296" y="85.252" width="934.887" height="333.495" class="chartlet-flow-group"/><text x="530.296" y="98.252" text-anchor="start" class="chartlet-flow-group-label">Private network</text><rect x="1317.183" y="306.748" width="128" height="100" class="chartlet-flow-group"/><text x="1325.183" y="319.748" text-anchor="start" class="chartlet-flow-group-label">Data zone</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="128,209.252 225.374,209.252" class="chartlet-flow-edge chartlet-flow-main"><title>Customer → Web shop: browses</title></polyline><polyline points="225.374,212.752 233.374,209.252 225.374,205.752 225.374,212.752" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="337.374,232.252 470.215,232.252 470.215,460.748 510.331,460.748" class="chartlet-flow-edge chartlet-flow-dashed"><title>Web shop → Content network: loads assets [HTTPS]</title></polyline><polyline points="510.331,464.248 518.331,460.748 510.331,457.248 510.331,464.248" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-3"><polyline points="337.374,209.252 526.296,209.252" class="chartlet-flow-edge chartlet-flow-main"><title>Web shop → Shop API: calls [HTTPS/JSON]</title></polyline><polyline points="526.296,212.752 534.296,209.252 526.296,205.752 526.296,212.752" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-4"><polyline points="638.296,191.752 776.877,191.752 776.877,138.252 802.96,138.252" class="chartlet-flow-edge"><title>Shop API → Session cache: sessions [RESP]</title></polyline><polyline points="802.96,141.752 810.96,138.252 802.96,134.752 802.96,141.752" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-10"><polyline points="638.296,226.752 776.877,226.752 776.877,289.252 812.995,289.252" class="chartlet-flow-edge"><title>Shop API → Sign-in: checks token [OIDC]</title></polyline><polyline points="812.995,292.752 820.995,289.252 812.995,285.752 812.995,292.752" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-7"><polyline points="638.296,244.252 786.902,244.252 786.902,397.252 1036.261,397.252 1036.261,329.095 1283.072,329.095 1283.072,376.748 1321.183,376.748" class="chartlet-flow-edge"><title>Shop API → Orders: reads, writes [SQL/TLS]</title></polyline><polyline points="1321.183,380.248 1329.183,376.748 1321.183,373.248 1321.183,380.248" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-5"><polyline points="638.296,209.252 816.91,209.252" class="chartlet-flow-edge chartlet-flow-main"><title>Shop API → Order events: publishes [AMQP]</title></polyline><polyline points="816.91,212.752 824.91,209.252 816.91,205.752 816.91,212.752" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-5 chartlet-f-6"><polyline points="934.58,209.252 1052.319,209.252" class="chartlet-flow-edge chartlet-flow-main"><title>Order events → Order worker: delivers</title></polyline><polyline points="1052.319,212.752 1060.319,209.252 1052.319,205.752 1052.319,212.752" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-6 chartlet-f-9"><polyline points="1174.409,209.252 1648.17,209.252" class="chartlet-flow-edge chartlet-flow-main"><title>Order worker → Payment provider: charges [HTTPS]</title></polyline><polyline points="1648.17,212.752 1656.17,209.252 1648.17,205.752 1648.17,212.752" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-6 chartlet-f-8"><polyline points="1174.409,222.252 1283.072,222.252 1283.072,230.748 1471.275,230.748 1471.275,280.252 1487.333,280.252" class="chartlet-flow-edge"><title>Order worker → Invoices: stores PDF [S3 API]</title></polyline><polyline points="1487.333,283.752 1495.333,280.252 1487.333,276.752 1487.333,283.752" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-6 chartlet-f-7"><polyline points="1174.409,235.252 1293.096,235.252 1293.096,352.748 1321.183,352.748" class="chartlet-flow-edge"><title>Order worker → Orders: updates [SQL/TLS]</title></polyline><polyline points="1321.183,356.248 1329.183,352.748 1321.183,349.248 1321.183,356.248" 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 chartlet-f-3"></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2"></g><g class="chartlet-f chartlet-n-3 chartlet-f-1 chartlet-f-3 chartlet-f-4 chartlet-f-5 chartlet-f-7 chartlet-f-10"></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4"></g><g class="chartlet-f chartlet-n-5 chartlet-f-3 chartlet-f-5 chartlet-f-6"></g><g class="chartlet-f chartlet-n-6 chartlet-f-5 chartlet-f-6 chartlet-f-7 chartlet-f-8 chartlet-f-9"></g><g class="chartlet-f chartlet-n-7 chartlet-f-3 chartlet-f-6 chartlet-f-7"></g><g class="chartlet-f chartlet-n-8 chartlet-f-6 chartlet-f-8"></g><g class="chartlet-f chartlet-n-9 chartlet-f-6 chartlet-f-9"></g><g class="chartlet-f chartlet-n-10 chartlet-f-3 chartlet-f-10"></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><rect x="132" y="184.252" width="61.12" height="21" class="chartlet-diagram-chip"/><text x="137" y="198.252" text-anchor="start" class="chartlet-diagram-chip-text">browses</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><rect x="341.374" y="236.252" width="84.64" height="36" class="chartlet-diagram-chip"/><text x="346.374" y="250.252" text-anchor="start" class="chartlet-diagram-chip-text">loads assets</text><text x="346.374" y="265.252" text-anchor="start" class="chartlet-diagram-chip-text">[HTTPS]</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-3"><rect x="341.374" y="169.252" width="102.52" height="36" class="chartlet-diagram-chip"/><text x="346.374" y="183.252" text-anchor="start" class="chartlet-diagram-chip-text">calls</text><text x="346.374" y="198.252" text-anchor="start" class="chartlet-diagram-chip-text">[HTTPS/JSON]</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-4"><rect x="642.296" y="151.752" width="60.64" height="36" class="chartlet-diagram-chip"/><text x="647.296" y="165.752" text-anchor="start" class="chartlet-diagram-chip-text">sessions</text><text x="647.296" y="180.752" text-anchor="start" class="chartlet-diagram-chip-text">[RESP]</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-10"><rect x="642.296" y="248.252" width="87.76" height="36" class="chartlet-diagram-chip"/><text x="647.296" y="262.252" text-anchor="start" class="chartlet-diagram-chip-text">checks token</text><text x="647.296" y="277.252" text-anchor="start" class="chartlet-diagram-chip-text">[OIDC]</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-7"><rect x="941.495" y="248.252" width="92.32" height="36" class="chartlet-diagram-chip"/><text x="946.495" y="262.252" text-anchor="start" class="chartlet-diagram-chip-text">reads, writes</text><text x="946.495" y="277.252" text-anchor="start" class="chartlet-diagram-chip-text">[SQL/TLS]</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-5"><rect x="705.936" y="151.752" width="64.24" height="36" class="chartlet-diagram-chip"/><text x="710.936" y="165.752" text-anchor="start" class="chartlet-diagram-chip-text">publishes</text><text x="710.936" y="180.752" text-anchor="start" class="chartlet-diagram-chip-text">[AMQP]</text></g><g class="chartlet-f chartlet-f-5 chartlet-f-6"><rect x="938.58" y="184.252" width="57.52" height="21" class="chartlet-diagram-chip"/><text x="943.58" y="198.252" text-anchor="start" class="chartlet-diagram-chip-text">delivers</text></g><g class="chartlet-f chartlet-f-6 chartlet-f-9"><rect x="1178.409" y="169.252" width="63.64" height="36" class="chartlet-diagram-chip"/><text x="1183.409" y="183.252" text-anchor="start" class="chartlet-diagram-chip-text">charges</text><text x="1183.409" y="198.252" text-anchor="start" class="chartlet-diagram-chip-text">[HTTPS]</text></g><g class="chartlet-f chartlet-f-6 chartlet-f-8"><rect x="1178.409" y="239.252" width="78.28" height="36" class="chartlet-diagram-chip"/><text x="1183.409" y="253.252" text-anchor="start" class="chartlet-diagram-chip-text">stores PDF</text><text x="1183.409" y="268.252" text-anchor="start" class="chartlet-diagram-chip-text">[S3 API]</text></g><g class="chartlet-f chartlet-f-6 chartlet-f-7"><rect x="1259.689" y="239.252" width="78.4" height="36" class="chartlet-diagram-chip"/><text x="1264.689" y="253.252" text-anchor="start" class="chartlet-diagram-chip-text">updates</text><text x="1264.689" y="268.252" text-anchor="start" class="chartlet-diagram-chip-text">[SQL/TLS]</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><rect x="24" y="189.752" width="104" height="44" class="chartlet-diagram-shadow"/><rect x="24" y="187.252" width="104" height="44" class="chartlet-flow-node chartlet-role-violet"><title>Customer</title></rect><circle cx="76" cy="187.252" r="7" class="chartlet-arch-head"/><text x="76" y="216.752" 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 chartlet-f-3"><rect x="233.374" y="180.752" width="104" height="62" class="chartlet-diagram-shadow"/><rect x="233.374" y="178.252" width="104" height="62" class="chartlet-flow-node chartlet-role-blue"><title>Web shop – browser</title></rect><line x1="233.374" y1="190.252" x2="337.374" y2="190.252" class="chartlet-flow-inner"/><circle cx="241.374" cy="184.252" r="1.8" class="chartlet-arch-dot"/><circle cx="247.374" cy="184.252" r="1.8" class="chartlet-arch-dot"/><circle cx="253.374" cy="184.252" r="1.8" class="chartlet-arch-dot"/><text x="285.374" y="212.752" text-anchor="middle" class="chartlet-flow-label">Web shop</text><text x="285.374" y="226.752" text-anchor="middle" class="chartlet-flow-sublabel">browser</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2"><rect x="518.331" y="445.248" width="135.93" height="36" class="chartlet-diagram-shadow"/><rect x="518.331" y="442.748" width="135.93" height="36" class="chartlet-flow-node chartlet-flow-external chartlet-role-gray"><title>Content network</title></rect><text x="586.296" y="465.248" text-anchor="middle" class="chartlet-flow-label">Content network</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-1 chartlet-f-3 chartlet-f-4 chartlet-f-5 chartlet-f-7 chartlet-f-10"><rect x="534.296" y="168.752" width="104" height="86" class="chartlet-diagram-shadow"/><rect x="534.296" y="166.252" width="104" height="86" class="chartlet-flow-node chartlet-role-blue"><title>Shop API – Node.js</title></rect><text x="586.296" y="206.752" text-anchor="middle" class="chartlet-flow-label">Shop API</text><text x="586.296" y="220.752" text-anchor="middle" class="chartlet-flow-sublabel">Node.js</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4"><polyline points="822.96,115.752 936.53,115.752 948.53,140.752 936.53,165.752 822.96,165.752 810.96,140.752 822.96,115.752" class="chartlet-diagram-shadow"/><polyline points="822.96,113.252 936.53,113.252 948.53,138.252 936.53,163.252 822.96,163.252 810.96,138.252 822.96,113.252" class="chartlet-flow-node chartlet-role-amber"><title>Session cache – Redis</title></polyline><text x="879.745" y="135.752" text-anchor="middle" class="chartlet-flow-label">Session cache</text><text x="879.745" y="149.752" text-anchor="middle" class="chartlet-flow-sublabel">Redis</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-3 chartlet-f-5 chartlet-f-6"><rect x="828.91" y="189.752" width="109.67" height="36" class="chartlet-diagram-shadow"/><rect x="828.91" y="187.252" width="109.67" height="36" class="chartlet-flow-node chartlet-role-violet"/><rect x="824.91" y="193.752" width="109.67" height="36" class="chartlet-diagram-shadow"/><rect x="824.91" y="191.252" width="109.67" height="36" class="chartlet-flow-node chartlet-role-violet"><title>Order events</title></rect><text x="879.745" y="213.752" text-anchor="middle" class="chartlet-flow-label">Order events</text></g><g class="chartlet-f chartlet-n-6 chartlet-f-5 chartlet-f-6 chartlet-f-7 chartlet-f-8 chartlet-f-9"><rect x="1060.319" y="177.752" width="114.09" height="68" class="chartlet-diagram-shadow"/><rect x="1060.319" y="175.252" width="114.09" height="68" class="chartlet-flow-node chartlet-role-blue"><title>Order worker</title></rect><text x="1117.364" y="213.752" text-anchor="middle" class="chartlet-flow-label">Order worker</text></g><g class="chartlet-f chartlet-n-7 chartlet-f-3 chartlet-f-6 chartlet-f-7"><polyline points="1329.183,342.248 1329.183,392.248 1330.955,393.542 1336.15,394.748 1344.414,395.783 1355.183,396.578 1367.725,397.077 1381.183,397.248 1394.642,397.077 1407.183,396.578 1417.953,395.783 1426.216,394.748 1431.411,393.542 1433.183,392.248 1433.183,342.248 1431.411,340.953 1426.216,339.748 1417.953,338.712 1407.183,337.917 1394.642,337.418 1381.183,337.248 1367.725,337.418 1355.183,337.917 1344.414,338.712 1336.15,339.748 1330.955,340.953 1329.183,342.248 1329.183,342.248" class="chartlet-diagram-shadow"/><polyline points="1329.183,339.748 1329.183,389.748 1330.955,391.042 1336.15,392.248 1344.414,393.283 1355.183,394.078 1367.725,394.577 1381.183,394.748 1394.642,394.577 1407.183,394.078 1417.953,393.283 1426.216,392.248 1431.411,391.042 1433.183,389.748 1433.183,339.748 1431.411,338.453 1426.216,337.248 1417.953,336.212 1407.183,335.417 1394.642,334.918 1381.183,334.748 1367.725,334.918 1355.183,335.417 1344.414,336.212 1336.15,337.248 1330.955,338.453 1329.183,339.748 1329.183,339.748" class="chartlet-flow-node chartlet-role-teal"><title>Orders – Postgres</title></polyline><polyline points="1329.183,339.748 1330.955,341.042 1336.15,342.248 1344.414,343.283 1355.183,344.078 1367.725,344.577 1381.183,344.748 1394.642,344.577 1407.183,344.078 1417.953,343.283 1426.216,342.248 1431.411,341.042 1433.183,339.748" class="chartlet-diagram-rim"/><text x="1381.183" y="365.248" text-anchor="middle" class="chartlet-flow-label">Orders</text><text x="1381.183" y="379.248" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g><g class="chartlet-f chartlet-n-8 chartlet-f-6 chartlet-f-8"><polyline points="1495.333,255.752 1616.073,255.752 1608.073,309.752 1503.333,309.752 1495.333,255.752" class="chartlet-diagram-shadow"/><polyline points="1495.333,253.252 1616.073,253.252 1608.073,307.252 1503.333,307.252 1495.333,253.252" class="chartlet-flow-node chartlet-role-teal"><title>Invoices – object storage</title></polyline><text x="1555.703" y="277.752" text-anchor="middle" class="chartlet-flow-label">Invoices</text><text x="1555.703" y="291.752" text-anchor="middle" class="chartlet-flow-sublabel">object storage</text></g><g class="chartlet-f chartlet-n-9 chartlet-f-6 chartlet-f-9"><rect x="1656.17" y="193.752" width="139.83" height="36" class="chartlet-diagram-shadow"/><rect x="1656.17" y="191.252" width="139.83" height="36" class="chartlet-flow-node chartlet-flow-external chartlet-role-gray"><title>Payment provider</title></rect><text x="1726.085" y="213.752" text-anchor="middle" class="chartlet-flow-label">Payment provider</text></g><g class="chartlet-f chartlet-n-10 chartlet-f-3 chartlet-f-10"><polyline points="820.995,257.752 938.495,257.752 938.495,298.552 879.745,325.752 820.995,298.552 820.995,257.752" class="chartlet-diagram-shadow"/><polyline points="820.995,255.252 938.495,255.252 938.495,296.052 879.745,323.252 820.995,296.052 820.995,255.252" class="chartlet-flow-node chartlet-role-red"><title>Sign-in – identity provider</title></polyline><text x="879.745" y="280.752" text-anchor="middle" class="chartlet-flow-label">Sign-in</text><text x="879.745" y="294.752" text-anchor="middle" class="chartlet-flow-sublabel">identity provider</text></g></svg><label class="chartlet-hotspot" id="chartlet-55d7d182de2564d7-hs-0" for="chartlet-55d7d182de2564d7-focus-0"></label><label class="chartlet-hotspot" id="chartlet-55d7d182de2564d7-hs-1" for="chartlet-55d7d182de2564d7-focus-1"></label><label class="chartlet-hotspot" id="chartlet-55d7d182de2564d7-hs-2" for="chartlet-55d7d182de2564d7-focus-2"></label><label class="chartlet-hotspot" id="chartlet-55d7d182de2564d7-hs-3" for="chartlet-55d7d182de2564d7-focus-3"></label><label class="chartlet-hotspot" id="chartlet-55d7d182de2564d7-hs-4" for="chartlet-55d7d182de2564d7-focus-4"></label><label class="chartlet-hotspot" id="chartlet-55d7d182de2564d7-hs-5" for="chartlet-55d7d182de2564d7-focus-5"></label><label class="chartlet-hotspot" id="chartlet-55d7d182de2564d7-hs-6" for="chartlet-55d7d182de2564d7-focus-6"></label><label class="chartlet-hotspot" id="chartlet-55d7d182de2564d7-hs-7" for="chartlet-55d7d182de2564d7-focus-7"></label><label class="chartlet-hotspot" id="chartlet-55d7d182de2564d7-hs-8" for="chartlet-55d7d182de2564d7-focus-8"></label><label class="chartlet-hotspot" id="chartlet-55d7d182de2564d7-hs-9" for="chartlet-55d7d182de2564d7-focus-9"></label><label class="chartlet-hotspot" id="chartlet-55d7d182de2564d7-hs-10" for="chartlet-55d7d182de2564d7-focus-10"></label></div><p class="chartlet-source">Source: Architecture handbook, overview</p><details class="chartlet-data" data-viz-text><summary>Show chart data</summary><table><caption>Data for Web shop on one cloud region</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>Web shop (browses)</td></tr><tr><th scope="row">Web shop</th><td>frontend</td><td></td><td>Content network (loads assets, via HTTPS), Shop API (calls, via HTTPS/JSON)</td></tr><tr><th scope="row">Shop API</th><td>service</td><td>Cloud region eu-central-1 › Private network</td><td>Session cache (sessions, via RESP), Sign-in (checks token, via OIDC), Orders (reads, writes, via SQL/TLS), Order events (publishes, via AMQP)</td></tr><tr><th scope="row">Content network</th><td>external system</td><td></td><td></td></tr><tr><th scope="row">Session cache</th><td>cache</td><td>Cloud region eu-central-1 › Private network</td><td></td></tr><tr><th scope="row">Order events</th><td>queue</td><td>Cloud region eu-central-1 › Private network</td><td>Order worker (delivers)</td></tr><tr><th scope="row">Sign-in</th><td>security</td><td>Cloud region eu-central-1 › Private network</td><td></td></tr><tr><th scope="row">Order worker</th><td>service</td><td>Cloud region eu-central-1 › Private network</td><td>Payment provider (charges, via HTTPS), Invoices (stores PDF, via S3 API), Orders (updates, via SQL/TLS)</td></tr><tr><th scope="row">Orders</th><td>database</td><td>Cloud region eu-central-1 › Private network › Data zone</td><td></td></tr><tr><th scope="row">Invoices</th><td>storage</td><td>Cloud region eu-central-1</td><td></td></tr><tr><th scope="row">Payment provider</th><td>external system</td><td></td><td></td></tr></tbody></table></details></figure></div>