chartlet 0.21.0

Compile structured data into deterministic, accessible static charts
Documentation
1
<div class="chartlet-wrapper chartlet-responsive chartlet-bp-640"><style>.chartlet-wrapper.chartlet-responsive{display:block;width:100%;container-type:inline-size}.chartlet-variant-mobile{display:none}@container (max-width:639px){.chartlet-bp-640 .chartlet-variant-desktop{display:none}.chartlet-bp-640 .chartlet-variant-mobile{display:block}}</style><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-c5bbc166624832ea .chartlet-f{opacity:.18}#chartlet-c5bbc166624832ea-hs-0{left:1.579%;top:49.537%;width:6.842%;height:9.643%}#chartlet-c5bbc166624832ea-hs-1{left:14.781%;top:50.073%;width:6.842%;height:8.571%}#chartlet-c5bbc166624832ea-hs-2{left:29.69%;top:49.894%;width:6.899%;height:8.929%}#chartlet-c5bbc166624832ea-hs-3{left:44.529%;top:38.466%;width:8.207%;height:6.429%}#chartlet-c5bbc166624832ea-hs-4{left:44.896%;top:49.894%;width:7.472%;height:8.929%}#chartlet-c5bbc166624832ea-hs-5{left:60.708%;top:51.144%;width:7.215%;height:6.429%}#chartlet-c5bbc166624832ea-hs-6{left:74.769%;top:51.144%;width:7.574%;height:6.429%}#chartlet-c5bbc166624832ea-hs-7{left:90%;top:31.429%;width:6.842%;height:10.714%}#chartlet-c5bbc166624832ea-hs-8{left:90%;top:62.857%;width:6.842%;height:10.714%}#chartlet-c5bbc166624832ea-hs-9{left:90%;top:47.143%;width:6.842%;height:10.714%}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-0:checked) #chartlet-c5bbc166624832ea .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-0:checked) #chartlet-c5bbc166624832ea .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-0:checked) #chartlet-c5bbc166624832ea .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-1:checked) #chartlet-c5bbc166624832ea .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-1:checked) #chartlet-c5bbc166624832ea .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-1:checked) #chartlet-c5bbc166624832ea .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-2:checked) #chartlet-c5bbc166624832ea .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-2:checked) #chartlet-c5bbc166624832ea .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-2:checked) #chartlet-c5bbc166624832ea .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-3:checked) #chartlet-c5bbc166624832ea .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-3:checked) #chartlet-c5bbc166624832ea .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-3:checked) #chartlet-c5bbc166624832ea .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-4:checked) #chartlet-c5bbc166624832ea .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-4:checked) #chartlet-c5bbc166624832ea .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-4:checked) #chartlet-c5bbc166624832ea .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-5:checked) #chartlet-c5bbc166624832ea .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-5:checked) #chartlet-c5bbc166624832ea .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-5:checked) #chartlet-c5bbc166624832ea .chartlet-n-5 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-6:checked) #chartlet-c5bbc166624832ea .chartlet-f-6{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-6:checked) #chartlet-c5bbc166624832ea .chartlet-n-6 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-6:checked) #chartlet-c5bbc166624832ea .chartlet-n-6 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-7:checked) #chartlet-c5bbc166624832ea .chartlet-f-7{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-7:checked) #chartlet-c5bbc166624832ea .chartlet-n-7 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-7:checked) #chartlet-c5bbc166624832ea .chartlet-n-7 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-8:checked) #chartlet-c5bbc166624832ea .chartlet-f-8{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-8:checked) #chartlet-c5bbc166624832ea .chartlet-n-8 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-8:checked) #chartlet-c5bbc166624832ea .chartlet-n-8 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-9:checked) #chartlet-c5bbc166624832ea .chartlet-f-9{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-9:checked) #chartlet-c5bbc166624832ea .chartlet-n-9 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-9:checked) #chartlet-c5bbc166624832ea .chartlet-n-9 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(.chartlet-focus-node:checked) #chartlet-c5bbc166624832ea-m .chartlet-f{opacity:.18}#chartlet-c5bbc166624832ea-m-hs-0{left:44.795%;top:1.091%;width:17.361%;height:4.909%}#chartlet-c5bbc166624832ea-m-hs-1{left:44.322%;top:14.215%;width:18.307%;height:4.364%}#chartlet-c5bbc166624832ea-m-hs-2{left:41.559%;top:30.693%;width:23.832%;height:3.273%}#chartlet-c5bbc166624832ea-m-hs-3{left:20.34%;top:43.573%;width:16.593%;height:4.727%}#chartlet-c5bbc166624832ea-m-hs-4{left:40.57%;top:44.3%;width:25.811%;height:3.273%}#chartlet-c5bbc166624832ea-m-hs-5{left:41.013%;top:61.25%;width:24.925%;height:3.273%}#chartlet-c5bbc166624832ea-m-hs-6{left:40.392%;top:74.13%;width:26.166%;height:3.273%}#chartlet-c5bbc166624832ea-m-hs-7{left:20.172%;top:90.909%;width:16.93%;height:5.455%}#chartlet-c5bbc166624832ea-m-hs-8{left:62.899%;top:90.909%;width:16.93%;height:5.455%}#chartlet-c5bbc166624832ea-m-hs-9{left:42.108%;top:90.909%;width:17.155%;height:5.455%}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-0:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-0:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-0:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-1:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-1:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-1:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-2:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-2:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-2:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-3:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-3:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-3:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-4:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-4:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-4:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-5:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-5:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-5:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-5 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-6:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-6{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-6:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-6 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-6:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-6 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-7:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-7{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-7:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-7 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-7:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-7 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-8:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-8{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-8:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-8 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-8:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-8 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-9:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-9{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-9:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-9 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-9:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-9 .chartlet-seq-box{stroke-width:3}</style><details class="chartlet-focus"><summary>Focus</summary><fieldset><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" checked> Show all</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-0"> Shopper</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-1"> Shop app</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-2"> API gateway</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-3"> Catalog service</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-4"> Order service</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-5"> Order events</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-6"> Billing worker</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-7"> Catalog</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-8"> Orders</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-9"> Invoices</label></fieldset></details><figure class="chartlet-figure" data-viz="chart"><figcaption>Order platform and its data stores</figcaption><div class="chartlet-variant-desktop"><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="1520" height="560" viewBox="0 0 1520 560" id="chartlet-c5bbc166624832ea" role="img" aria-labelledby="chartlet-c5bbc166624832ea-title chartlet-c5bbc166624832ea-description" class="chartlet-root"><title id="chartlet-c5bbc166624832ea-title">Order platform and its data stores</title><desc id="chartlet-c5bbc166624832ea-description">Architecture diagram with 10 components and 9 connections in 2 boundaries. Order platform: API gateway, Catalog service, Order service, Order events, Billing worker, Data tier. Data tier (in Order platform): Catalog, Orders, Invoices. Main path: Shopper → Shop app → API gateway → Order service → Order events → Billing worker. Most connected: API gateway and Order service (3 connections each). Nothing leads into Shopper. Nothing leads out of Catalog, Orders and Invoices. Shopper (person): connects to Shop app (orders). Shop app (frontend): connects to API gateway (via HTTPS). API gateway (service): connects to Catalog service (browse) and Order service (checkout). Catalog service (service): connects to Catalog (via SQL). Order service (service): connects to Orders (via SQL) and Order events (publishes). Order events (queue): connects to Billing worker (delivers). Billing worker (service): connects to Invoices (via SQL). Catalog (database): no outgoing connection. Invoices (database): no outgoing connection. Orders (database): 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-c5bbc166624832ea .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea .chartlet-label,#chartlet-c5bbc166624832ea .chartlet-tick,#chartlet-c5bbc166624832ea .chartlet-value,#chartlet-c5bbc166624832ea .chartlet-value-inverse,#chartlet-c5bbc166624832ea .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-c5bbc166624832ea .chartlet-value,#chartlet-c5bbc166624832ea .chartlet-value-inverse{font-weight:600}#chartlet-c5bbc166624832ea .chartlet-value{fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea .chartlet-axis-title{font-weight:600}#chartlet-c5bbc166624832ea .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-c5bbc166624832ea .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-c5bbc166624832ea .chartlet-bar,#chartlet-c5bbc166624832ea .chartlet-point{fill:var(--chartlet-accent)}#chartlet-c5bbc166624832ea .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-c5bbc166624832ea .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-c5bbc166624832ea .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-c5bbc166624832ea .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-c5bbc166624832ea .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-c5bbc166624832ea .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-c5bbc166624832ea .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-c5bbc166624832ea .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-c5bbc166624832ea .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-c5bbc166624832ea .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-c5bbc166624832ea .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-c5bbc166624832ea .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-c5bbc166624832ea .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-c5bbc166624832ea .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-c5bbc166624832ea .chartlet-flow-start{stroke-width:2}#chartlet-c5bbc166624832ea .chartlet-flow-end{stroke-width:3}#chartlet-c5bbc166624832ea .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-c5bbc166624832ea .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-c5bbc166624832ea .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-c5bbc166624832ea .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-c5bbc166624832ea .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-c5bbc166624832ea .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-c5bbc166624832ea .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-c5bbc166624832ea .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-c5bbc166624832ea .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-c5bbc166624832ea .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-c5bbc166624832ea .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-c5bbc166624832ea .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-c5bbc166624832ea .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-c5bbc166624832ea .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-c5bbc166624832ea .chartlet-arch-head{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet);stroke-width:1.5}#chartlet-c5bbc166624832ea .chartlet-arch-dot{fill:var(--chartlet-role-blue);stroke:none}</style><rect x="439.285" y="120" width="1056.715" height="316" class="chartlet-flow-group"/><text x="447.285" y="133" text-anchor="start" class="chartlet-flow-group-label">Order platform</text><rect x="1356" y="148" width="128" height="276" class="chartlet-flow-group"/><text x="1364" y="161" text-anchor="start" class="chartlet-flow-group-label">Data tier</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="128,304.408 216.667,304.408" class="chartlet-flow-edge chartlet-flow-main"><title>Shopper → Shop app: orders</title></polyline><polyline points="216.667,307.908 224.667,304.408 216.667,300.908 216.667,307.908" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="328.667,304.408 443.285,304.408" class="chartlet-flow-edge chartlet-flow-main"><title>Shop app → API gateway: [HTTPS]</title></polyline><polyline points="443.285,307.908 451.285,304.408 443.285,300.908 443.285,307.908" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><polyline points="556.145,287.408 652.238,287.408 652.238,233.408 668.835,233.408" class="chartlet-flow-edge"><title>API gateway → Catalog service: browse</title></polyline><polyline points="668.835,236.908 676.835,233.408 668.835,229.908 668.835,236.908" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><polyline points="556.145,304.408 674.425,304.408" class="chartlet-flow-edge chartlet-flow-main"><title>API gateway → Order service: checkout</title></polyline><polyline points="674.425,307.908 682.425,304.408 674.425,300.908 674.425,307.908" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-7"><polyline points="801.585,233.408 1331.104,233.408 1331.104,206 1360,206" class="chartlet-flow-edge"><title>Catalog service → Catalog: [SQL]</title></polyline><polyline points="1360,209.5 1368,206 1360,202.5 1360,209.5" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-8"><polyline points="795.995,321.408 898.17,321.408 898.17,341.088 1331.104,341.088 1331.104,382 1360,382" class="chartlet-flow-edge"><title>Order service → Orders: [SQL]</title></polyline><polyline points="1360,385.5 1368,382 1360,378.5 1360,385.5" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><polyline points="795.995,304.408 914.768,304.408" class="chartlet-flow-edge chartlet-flow-main"><title>Order service → Order events: publishes</title></polyline><polyline points="914.768,307.908 922.768,304.408 914.768,300.908 914.768,307.908" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-5 chartlet-f-6"><polyline points="1032.438,304.408 1128.484,304.408" class="chartlet-flow-edge chartlet-flow-main"><title>Order events → Billing worker: delivers</title></polyline><polyline points="1128.484,307.908 1136.484,304.408 1128.484,300.908 1128.484,307.908" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-6 chartlet-f-9"><polyline points="1251.614,304.408 1331.104,304.408 1331.104,294 1360,294" class="chartlet-flow-edge"><title>Billing worker → Invoices: [SQL]</title></polyline><polyline points="1360,297.5 1368,294 1360,290.5 1360,297.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-3 chartlet-f-4"></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-7"></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-4 chartlet-f-5 chartlet-f-8"></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5 chartlet-f-6"></g><g class="chartlet-f chartlet-n-6 chartlet-f-5 chartlet-f-6 chartlet-f-9"></g><g class="chartlet-f chartlet-n-7 chartlet-f-3 chartlet-f-7"></g><g class="chartlet-f chartlet-n-8 chartlet-f-4 chartlet-f-8"></g><g class="chartlet-f chartlet-n-9 chartlet-f-6 chartlet-f-9"></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><rect x="132" y="279.408" width="50.32" height="21" class="chartlet-diagram-chip"/><text x="137" y="293.408" text-anchor="start" class="chartlet-diagram-chip-text">orders</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><rect x="332.667" y="279.408" width="63.64" height="21" class="chartlet-diagram-chip"/><text x="337.667" y="293.408" text-anchor="start" class="chartlet-diagram-chip-text">[HTTPS]</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><rect x="560.145" y="262.408" width="54.4" height="21" class="chartlet-diagram-chip"/><text x="565.145" y="276.408" text-anchor="start" class="chartlet-diagram-chip-text">browse</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><rect x="560.145" y="308.408" width="63.76" height="21" class="chartlet-diagram-chip"/><text x="565.145" y="322.408" text-anchor="start" class="chartlet-diagram-chip-text">checkout</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-7"><rect x="805.585" y="208.408" width="47.56" height="21" class="chartlet-diagram-chip"/><text x="810.585" y="222.408" text-anchor="start" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-8"><rect x="799.995" y="325.408" width="47.56" height="21" class="chartlet-diagram-chip"/><text x="804.995" y="339.408" text-anchor="start" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><rect x="799.995" y="279.408" width="64.24" height="21" class="chartlet-diagram-chip"/><text x="804.995" y="293.408" text-anchor="start" class="chartlet-diagram-chip-text">publishes</text></g><g class="chartlet-f chartlet-f-5 chartlet-f-6"><rect x="1036.438" y="279.408" width="57.52" height="21" class="chartlet-diagram-chip"/><text x="1041.438" y="293.408" text-anchor="start" class="chartlet-diagram-chip-text">delivers</text></g><g class="chartlet-f chartlet-f-6 chartlet-f-9"><rect x="1255.614" y="279.408" width="47.56" height="21" class="chartlet-diagram-chip"/><text x="1260.614" y="293.408" text-anchor="start" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><rect x="24" y="279.908" width="104" height="54" class="chartlet-diagram-shadow"/><rect x="24" y="277.408" width="104" height="54" class="chartlet-flow-node chartlet-role-violet"><title>Shopper</title></rect><circle cx="76" cy="288.408" r="6" class="chartlet-arch-head"/><text x="76" y="316.908" text-anchor="middle" class="chartlet-flow-label">Shopper</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"><rect x="224.667" y="282.908" width="104" height="48" class="chartlet-diagram-shadow"/><rect x="224.667" y="280.408" width="104" height="48" class="chartlet-flow-node chartlet-role-blue"><title>Shop app</title></rect><line x1="224.667" y1="292.408" x2="328.667" y2="292.408" class="chartlet-flow-inner"/><circle cx="232.667" cy="286.408" r="1.8" class="chartlet-arch-dot"/><circle cx="238.667" cy="286.408" r="1.8" class="chartlet-arch-dot"/><circle cx="244.667" cy="286.408" r="1.8" class="chartlet-arch-dot"/><text x="276.667" y="314.908" text-anchor="middle" class="chartlet-flow-label">Shop app</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-4"><rect x="451.285" y="281.908" width="104.86" height="50" class="chartlet-diagram-shadow"/><rect x="451.285" y="279.408" width="104.86" height="50" class="chartlet-flow-node chartlet-role-blue"><title>API gateway</title></rect><text x="503.715" y="308.908" text-anchor="middle" class="chartlet-flow-label">API gateway</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-7"><rect x="676.835" y="217.908" width="124.75" height="36" class="chartlet-diagram-shadow"/><rect x="676.835" y="215.408" width="124.75" height="36" class="chartlet-flow-node chartlet-role-blue"><title>Catalog service</title></rect><text x="739.21" y="237.908" text-anchor="middle" class="chartlet-flow-label">Catalog service</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-4 chartlet-f-5 chartlet-f-8"><rect x="682.425" y="281.908" width="113.57" height="50" class="chartlet-diagram-shadow"/><rect x="682.425" y="279.408" width="113.57" height="50" class="chartlet-flow-node chartlet-role-blue"><title>Order service</title></rect><text x="739.21" y="308.908" text-anchor="middle" class="chartlet-flow-label">Order service</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5 chartlet-f-6"><rect x="926.768" y="284.908" width="109.67" height="36" class="chartlet-diagram-shadow"/><rect x="926.768" y="282.408" width="109.67" height="36" class="chartlet-flow-node chartlet-role-violet"/><rect x="922.768" y="288.908" width="109.67" height="36" class="chartlet-diagram-shadow"/><rect x="922.768" y="286.408" width="109.67" height="36" class="chartlet-flow-node chartlet-role-violet"><title>Order events</title></rect><text x="977.603" y="308.908" 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-9"><rect x="1136.484" y="288.908" width="115.13" height="36" class="chartlet-diagram-shadow"/><rect x="1136.484" y="286.408" width="115.13" height="36" class="chartlet-flow-node chartlet-role-blue"><title>Billing worker</title></rect><text x="1194.049" y="308.908" text-anchor="middle" class="chartlet-flow-label">Billing worker</text></g><g class="chartlet-f chartlet-n-7 chartlet-f-3 chartlet-f-7"><polyline points="1368,183.5 1368,233.5 1369.772,234.794 1374.967,236 1383.23,237.036 1394,237.83 1406.541,238.33 1420,238.5 1433.459,238.33 1446,237.83 1456.77,237.036 1465.033,236 1470.228,234.794 1472,233.5 1472,183.5 1470.228,182.206 1465.033,181 1456.77,179.964 1446,179.17 1433.459,178.67 1420,178.5 1406.541,178.67 1394,179.17 1383.23,179.964 1374.967,181 1369.772,182.206 1368,183.5 1368,183.5" class="chartlet-diagram-shadow"/><polyline points="1368,181 1368,231 1369.772,232.294 1374.967,233.5 1383.23,234.536 1394,235.33 1406.541,235.83 1420,236 1433.459,235.83 1446,235.33 1456.77,234.536 1465.033,233.5 1470.228,232.294 1472,231 1472,181 1470.228,179.706 1465.033,178.5 1456.77,177.464 1446,176.67 1433.459,176.17 1420,176 1406.541,176.17 1394,176.67 1383.23,177.464 1374.967,178.5 1369.772,179.706 1368,181 1368,181" class="chartlet-flow-node chartlet-role-teal"><title>Catalog – Postgres</title></polyline><polyline points="1368,181 1369.772,182.294 1374.967,183.5 1383.23,184.536 1394,185.33 1406.541,185.83 1420,186 1433.459,185.83 1446,185.33 1456.77,184.536 1465.033,183.5 1470.228,182.294 1472,181" class="chartlet-diagram-rim"/><text x="1420" y="206.5" text-anchor="middle" class="chartlet-flow-label">Catalog</text><text x="1420" y="220.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g><g class="chartlet-f chartlet-n-8 chartlet-f-4 chartlet-f-8"><polyline points="1368,359.5 1368,409.5 1369.772,410.794 1374.967,412 1383.23,413.036 1394,413.83 1406.541,414.33 1420,414.5 1433.459,414.33 1446,413.83 1456.77,413.036 1465.033,412 1470.228,410.794 1472,409.5 1472,359.5 1470.228,358.206 1465.033,357 1456.77,355.964 1446,355.17 1433.459,354.67 1420,354.5 1406.541,354.67 1394,355.17 1383.23,355.964 1374.967,357 1369.772,358.206 1368,359.5 1368,359.5" class="chartlet-diagram-shadow"/><polyline points="1368,357 1368,407 1369.772,408.294 1374.967,409.5 1383.23,410.536 1394,411.33 1406.541,411.83 1420,412 1433.459,411.83 1446,411.33 1456.77,410.536 1465.033,409.5 1470.228,408.294 1472,407 1472,357 1470.228,355.706 1465.033,354.5 1456.77,353.464 1446,352.67 1433.459,352.17 1420,352 1406.541,352.17 1394,352.67 1383.23,353.464 1374.967,354.5 1369.772,355.706 1368,357 1368,357" class="chartlet-flow-node chartlet-role-teal"><title>Orders – Postgres</title></polyline><polyline points="1368,357 1369.772,358.294 1374.967,359.5 1383.23,360.536 1394,361.33 1406.541,361.83 1420,362 1433.459,361.83 1446,361.33 1456.77,360.536 1465.033,359.5 1470.228,358.294 1472,357" class="chartlet-diagram-rim"/><text x="1420" y="382.5" text-anchor="middle" class="chartlet-flow-label">Orders</text><text x="1420" y="396.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g><g class="chartlet-f chartlet-n-9 chartlet-f-6 chartlet-f-9"><polyline points="1368,271.5 1368,321.5 1369.772,322.794 1374.967,324 1383.23,325.036 1394,325.83 1406.541,326.33 1420,326.5 1433.459,326.33 1446,325.83 1456.77,325.036 1465.033,324 1470.228,322.794 1472,321.5 1472,271.5 1470.228,270.206 1465.033,269 1456.77,267.964 1446,267.17 1433.459,266.67 1420,266.5 1406.541,266.67 1394,267.17 1383.23,267.964 1374.967,269 1369.772,270.206 1368,271.5 1368,271.5" class="chartlet-diagram-shadow"/><polyline points="1368,269 1368,319 1369.772,320.294 1374.967,321.5 1383.23,322.536 1394,323.33 1406.541,323.83 1420,324 1433.459,323.83 1446,323.33 1456.77,322.536 1465.033,321.5 1470.228,320.294 1472,319 1472,269 1470.228,267.706 1465.033,266.5 1456.77,265.464 1446,264.67 1433.459,264.17 1420,264 1406.541,264.17 1394,264.67 1383.23,265.464 1374.967,266.5 1369.772,267.706 1368,269 1368,269" class="chartlet-flow-node chartlet-role-teal"><title>Invoices – Postgres</title></polyline><polyline points="1368,269 1369.772,270.294 1374.967,271.5 1383.23,272.536 1394,273.33 1406.541,273.83 1420,274 1433.459,273.83 1446,273.33 1456.77,272.536 1465.033,271.5 1470.228,270.294 1472,269" class="chartlet-diagram-rim"/><text x="1420" y="294.5" text-anchor="middle" class="chartlet-flow-label">Invoices</text><text x="1420" y="308.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g></svg><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-0" for="chartlet-c5bbc166624832ea-focus-0"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-1" for="chartlet-c5bbc166624832ea-focus-1"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-2" for="chartlet-c5bbc166624832ea-focus-2"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-3" for="chartlet-c5bbc166624832ea-focus-3"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-4" for="chartlet-c5bbc166624832ea-focus-4"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-5" for="chartlet-c5bbc166624832ea-focus-5"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-6" for="chartlet-c5bbc166624832ea-focus-6"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-7" for="chartlet-c5bbc166624832ea-focus-7"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-8" for="chartlet-c5bbc166624832ea-focus-8"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-9" for="chartlet-c5bbc166624832ea-focus-9"></label></div></div><div class="chartlet-variant-mobile"><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="440" height="1100" viewBox="0 0 440 1100" id="chartlet-c5bbc166624832ea-m" role="img" aria-labelledby="chartlet-c5bbc166624832ea-m-title chartlet-c5bbc166624832ea-m-description" class="chartlet-root"><title id="chartlet-c5bbc166624832ea-m-title">Order platform and its data stores</title><desc id="chartlet-c5bbc166624832ea-m-description">Architecture diagram with 10 components and 9 connections in 2 boundaries. Order platform: API gateway, Catalog service, Order service, Order events, Billing worker, Data tier. Data tier (in Order platform): Catalog, Orders, Invoices. Main path: Shopper → Shop app → API gateway → Order service → Order events → Billing worker. Most connected: API gateway and Order service (3 connections each). Nothing leads into Shopper. Nothing leads out of Catalog, Orders and Invoices. Shopper (person): connects to Shop app (orders). Shop app (frontend): connects to API gateway (via HTTPS). API gateway (service): connects to Catalog service (browse) and Order service (checkout). Catalog service (service): connects to Catalog (via SQL). Order service (service): connects to Orders (via SQL) and Order events (publishes). Order events (queue): connects to Billing worker (delivers). Billing worker (service): connects to Invoices (via SQL). Catalog (database): no outgoing connection. Invoices (database): no outgoing connection. Orders (database): 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-c5bbc166624832ea-m .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea-m .chartlet-label,#chartlet-c5bbc166624832ea-m .chartlet-tick,#chartlet-c5bbc166624832ea-m .chartlet-value,#chartlet-c5bbc166624832ea-m .chartlet-value-inverse,#chartlet-c5bbc166624832ea-m .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-c5bbc166624832ea-m .chartlet-value,#chartlet-c5bbc166624832ea-m .chartlet-value-inverse{font-weight:600}#chartlet-c5bbc166624832ea-m .chartlet-value{fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea-m .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea-m .chartlet-axis-title{font-weight:600}#chartlet-c5bbc166624832ea-m .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-c5bbc166624832ea-m .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-c5bbc166624832ea-m .chartlet-bar,#chartlet-c5bbc166624832ea-m .chartlet-point{fill:var(--chartlet-accent)}#chartlet-c5bbc166624832ea-m .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-c5bbc166624832ea-m .chartlet-background{fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea-m .chartlet-title-small{font-size:18px}.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-c5bbc166624832ea-m .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-c5bbc166624832ea-m .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-c5bbc166624832ea-m .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-c5bbc166624832ea-m .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-c5bbc166624832ea-m .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-c5bbc166624832ea-m .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-c5bbc166624832ea-m .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-c5bbc166624832ea-m .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-c5bbc166624832ea-m .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-c5bbc166624832ea-m .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-c5bbc166624832ea-m .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea-m .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-c5bbc166624832ea-m .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea-m .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-c5bbc166624832ea-m .chartlet-flow-start{stroke-width:2}#chartlet-c5bbc166624832ea-m .chartlet-flow-end{stroke-width:3}#chartlet-c5bbc166624832ea-m .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-c5bbc166624832ea-m .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-c5bbc166624832ea-m .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea-m .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-c5bbc166624832ea-m .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-c5bbc166624832ea-m .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-c5bbc166624832ea-m .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-c5bbc166624832ea-m .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-c5bbc166624832ea-m .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-c5bbc166624832ea-m .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-c5bbc166624832ea-m .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-c5bbc166624832ea-m .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea-m .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-c5bbc166624832ea-m .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-c5bbc166624832ea-m .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-c5bbc166624832ea-m .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-c5bbc166624832ea-m .chartlet-arch-head{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet);stroke-width:1.5}#chartlet-c5bbc166624832ea-m .chartlet-arch-dot{fill:var(--chartlet-role-blue);stroke:none}</style><rect x="64.756" y="309.62" width="310.487" height="774.38" class="chartlet-flow-group"/><text x="72.756" y="322.62" text-anchor="start" class="chartlet-flow-group-label">Order platform</text><rect x="76.756" y="972" width="286.487" height="100" class="chartlet-flow-group"/><text x="84.756" y="985" text-anchor="start" class="chartlet-flow-group-label">Data tier</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="235.291,66 235.291,148.367" class="chartlet-flow-edge chartlet-flow-main"><title>Shopper → Shop app: orders</title></polyline><polyline points="231.791,148.367 235.291,156.367 238.791,148.367 231.791,148.367" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="235.291,204.367 235.291,329.62" class="chartlet-flow-edge chartlet-flow-main"><title>Shop app → API gateway: [HTTPS]</title></polyline><polyline points="231.791,329.62 235.291,337.62 238.791,329.62 231.791,329.62" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><polyline points="211.291,373.62 211.291,442.544 126.001,442.544 126.001,471.304" class="chartlet-flow-edge"><title>API gateway → Catalog service: browse</title></polyline><polyline points="122.501,471.304 126.001,479.304 129.501,471.304 122.501,471.304" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><polyline points="235.291,373.62 235.291,479.304" class="chartlet-flow-edge chartlet-flow-main"><title>API gateway → Order service: checkout</title></polyline><polyline points="231.791,479.304 235.291,487.304 238.791,479.304 231.791,479.304" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-7"><polyline points="126.001,531.304 126.001,992" class="chartlet-flow-edge"><title>Catalog service → Catalog: [SQL]</title></polyline><polyline points="122.501,992 126.001,1000 129.501,992 122.501,992" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-8"><polyline points="259.291,523.304 259.291,636.987 301.193,636.987 301.193,778.671 313.999,778.671 313.999,992" class="chartlet-flow-edge"><title>Order service → Orders: [SQL]</title></polyline><polyline points="310.499,992 313.999,1000 317.499,992 310.499,992" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><polyline points="235.291,523.304 235.291,665.747" class="chartlet-flow-edge chartlet-flow-main"><title>Order service → Order events: publishes</title></polyline><polyline points="231.791,665.747 235.291,673.747 238.791,665.747 231.791,665.747" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-5 chartlet-f-6"><polyline points="235.291,709.747 235.291,807.43" class="chartlet-flow-edge chartlet-flow-main"><title>Order events → Billing worker: delivers</title></polyline><polyline points="231.791,807.43 235.291,815.43 238.791,807.43 231.791,807.43" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-6 chartlet-f-9"><polyline points="235.291,851.43 235.291,920.354 223.014,920.354 223.014,992" class="chartlet-flow-edge"><title>Billing worker → Invoices: [SQL]</title></polyline><polyline points="219.514,992 223.014,1000 226.514,992 219.514,992" 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-3 chartlet-f-4"></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-7"></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-4 chartlet-f-5 chartlet-f-8"></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5 chartlet-f-6"></g><g class="chartlet-f chartlet-n-6 chartlet-f-5 chartlet-f-6 chartlet-f-9"></g><g class="chartlet-f chartlet-n-7 chartlet-f-3 chartlet-f-7"></g><g class="chartlet-f chartlet-n-8 chartlet-f-4 chartlet-f-8"></g><g class="chartlet-f chartlet-n-9 chartlet-f-6 chartlet-f-9"></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><rect x="239.291" y="71" width="50.32" height="21" class="chartlet-diagram-chip"/><text x="244.291" y="85" text-anchor="start" class="chartlet-diagram-chip-text">orders</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><rect x="239.291" y="209.367" width="63.64" height="21" class="chartlet-diagram-chip"/><text x="244.291" y="223.367" text-anchor="start" class="chartlet-diagram-chip-text">[HTTPS]</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><rect x="152.891" y="378.62" width="54.4" height="21" class="chartlet-diagram-chip"/><text x="202.291" y="392.62" text-anchor="end" class="chartlet-diagram-chip-text">browse</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><rect x="239.291" y="378.62" width="63.76" height="21" class="chartlet-diagram-chip"/><text x="244.291" y="392.62" text-anchor="start" class="chartlet-diagram-chip-text">checkout</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-7"><rect x="130.001" y="536.304" width="47.56" height="21" class="chartlet-diagram-chip"/><text x="135.001" y="550.304" text-anchor="start" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-8"><rect x="263.291" y="528.304" width="47.56" height="21" class="chartlet-diagram-chip"/><text x="268.291" y="542.304" text-anchor="start" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><rect x="167.051" y="560.304" width="64.24" height="21" class="chartlet-diagram-chip"/><text x="226.291" y="574.304" text-anchor="end" class="chartlet-diagram-chip-text">publishes</text></g><g class="chartlet-f chartlet-f-5 chartlet-f-6"><rect x="239.291" y="714.747" width="57.52" height="21" class="chartlet-diagram-chip"/><text x="244.291" y="728.747" text-anchor="start" class="chartlet-diagram-chip-text">delivers</text></g><g class="chartlet-f chartlet-f-6 chartlet-f-9"><rect x="239.291" y="856.43" width="47.56" height="21" class="chartlet-diagram-chip"/><text x="244.291" y="870.43" text-anchor="start" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><rect x="197.096" y="14.5" width="76.39" height="54" class="chartlet-diagram-shadow"/><rect x="197.096" y="12" width="76.39" height="54" class="chartlet-flow-node chartlet-role-violet"><title>Shopper</title></rect><circle cx="235.291" cy="23" r="6" class="chartlet-arch-head"/><text x="235.291" y="51.5" text-anchor="middle" class="chartlet-flow-label">Shopper</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"><rect x="195.016" y="158.867" width="80.55" height="48" class="chartlet-diagram-shadow"/><rect x="195.016" y="156.367" width="80.55" height="48" class="chartlet-flow-node chartlet-role-blue"><title>Shop app</title></rect><line x1="195.016" y1="168.367" x2="275.566" y2="168.367" class="chartlet-flow-inner"/><circle cx="203.016" cy="162.367" r="1.8" class="chartlet-arch-dot"/><circle cx="209.016" cy="162.367" r="1.8" class="chartlet-arch-dot"/><circle cx="215.016" cy="162.367" r="1.8" class="chartlet-arch-dot"/><text x="235.291" y="190.867" text-anchor="middle" class="chartlet-flow-label">Shop app</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-4"><rect x="182.861" y="340.12" width="104.86" height="36" class="chartlet-diagram-shadow"/><rect x="182.861" y="337.62" width="104.86" height="36" class="chartlet-flow-node chartlet-role-blue"><title>API gateway</title></rect><text x="235.291" y="360.12" text-anchor="middle" class="chartlet-flow-label">API gateway</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-7"><rect x="89.496" y="481.804" width="73.01" height="52" class="chartlet-diagram-shadow"/><rect x="89.496" y="479.304" width="73.01" height="52" class="chartlet-flow-node chartlet-role-blue"><title>Catalog service</title></rect><text x="126.001" y="501.804" text-anchor="middle" class="chartlet-flow-label">Catalog</text><text x="126.001" y="517.804" text-anchor="middle" class="chartlet-flow-label">service</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-4 chartlet-f-5 chartlet-f-8"><rect x="178.506" y="489.804" width="113.57" height="36" class="chartlet-diagram-shadow"/><rect x="178.506" y="487.304" width="113.57" height="36" class="chartlet-flow-node chartlet-role-blue"><title>Order service</title></rect><text x="235.291" y="509.804" text-anchor="middle" class="chartlet-flow-label">Order service</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5 chartlet-f-6"><rect x="184.456" y="672.247" width="109.67" height="36" class="chartlet-diagram-shadow"/><rect x="184.456" y="669.747" width="109.67" height="36" class="chartlet-flow-node chartlet-role-violet"/><rect x="180.456" y="676.247" width="109.67" height="36" class="chartlet-diagram-shadow"/><rect x="180.456" y="673.747" width="109.67" height="36" class="chartlet-flow-node chartlet-role-violet"><title>Order events</title></rect><text x="235.291" y="696.247" 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-9"><rect x="177.726" y="817.93" width="115.13" height="36" class="chartlet-diagram-shadow"/><rect x="177.726" y="815.43" width="115.13" height="36" class="chartlet-flow-node chartlet-role-blue"><title>Billing worker</title></rect><text x="235.291" y="837.93" text-anchor="middle" class="chartlet-flow-label">Billing worker</text></g><g class="chartlet-f chartlet-n-7 chartlet-f-3 chartlet-f-7"><polyline points="88.756,1007.5 88.756,1057.5 90.025,1058.794 93.746,1060 99.665,1061.036 107.379,1061.83 116.362,1062.33 126.001,1062.5 135.641,1062.33 144.624,1061.83 152.337,1061.036 158.256,1060 161.977,1058.794 163.246,1057.5 163.246,1007.5 161.977,1006.206 158.256,1005 152.337,1003.964 144.624,1003.17 135.641,1002.67 126.001,1002.5 116.362,1002.67 107.379,1003.17 99.665,1003.964 93.746,1005 90.025,1006.206 88.756,1007.5 88.756,1007.5" class="chartlet-diagram-shadow"/><polyline points="88.756,1005 88.756,1055 90.025,1056.294 93.746,1057.5 99.665,1058.536 107.379,1059.33 116.362,1059.83 126.001,1060 135.641,1059.83 144.624,1059.33 152.337,1058.536 158.256,1057.5 161.977,1056.294 163.246,1055 163.246,1005 161.977,1003.706 158.256,1002.5 152.337,1001.464 144.624,1000.67 135.641,1000.17 126.001,1000 116.362,1000.17 107.379,1000.67 99.665,1001.464 93.746,1002.5 90.025,1003.706 88.756,1005 88.756,1005" class="chartlet-flow-node chartlet-role-teal"><title>Catalog – Postgres</title></polyline><polyline points="88.756,1005 90.025,1006.294 93.746,1007.5 99.665,1008.536 107.379,1009.33 116.362,1009.83 126.001,1010 135.641,1009.83 144.624,1009.33 152.337,1008.536 158.256,1007.5 161.977,1006.294 163.246,1005" class="chartlet-diagram-rim"/><text x="126.001" y="1030.5" text-anchor="middle" class="chartlet-flow-label">Catalog</text><text x="126.001" y="1044.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g><g class="chartlet-f chartlet-n-8 chartlet-f-4 chartlet-f-8"><polyline points="276.754,1007.5 276.754,1057.5 278.023,1058.794 281.744,1060 287.663,1061.036 295.376,1061.83 304.359,1062.33 313.999,1062.5 323.638,1062.33 332.621,1061.83 340.335,1061.036 346.254,1060 349.975,1058.794 351.244,1057.5 351.244,1007.5 349.975,1006.206 346.254,1005 340.335,1003.964 332.621,1003.17 323.638,1002.67 313.999,1002.5 304.359,1002.67 295.376,1003.17 287.663,1003.964 281.744,1005 278.023,1006.206 276.754,1007.5 276.754,1007.5" class="chartlet-diagram-shadow"/><polyline points="276.754,1005 276.754,1055 278.023,1056.294 281.744,1057.5 287.663,1058.536 295.376,1059.33 304.359,1059.83 313.999,1060 323.638,1059.83 332.621,1059.33 340.335,1058.536 346.254,1057.5 349.975,1056.294 351.244,1055 351.244,1005 349.975,1003.706 346.254,1002.5 340.335,1001.464 332.621,1000.67 323.638,1000.17 313.999,1000 304.359,1000.17 295.376,1000.67 287.663,1001.464 281.744,1002.5 278.023,1003.706 276.754,1005 276.754,1005" class="chartlet-flow-node chartlet-role-teal"><title>Orders – Postgres</title></polyline><polyline points="276.754,1005 278.023,1006.294 281.744,1007.5 287.663,1008.536 295.376,1009.33 304.359,1009.83 313.999,1010 323.638,1009.83 332.621,1009.33 340.335,1008.536 346.254,1007.5 349.975,1006.294 351.244,1005" class="chartlet-diagram-rim"/><text x="313.999" y="1030.5" text-anchor="middle" class="chartlet-flow-label">Orders</text><text x="313.999" y="1044.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g><g class="chartlet-f chartlet-n-9 chartlet-f-6 chartlet-f-9"><polyline points="185.274,1007.5 185.274,1057.5 186.56,1058.794 190.33,1060 196.328,1061.036 204.144,1061.83 213.246,1062.33 223.014,1062.5 232.782,1062.33 241.884,1061.83 249.7,1061.036 255.698,1060 259.468,1058.794 260.754,1057.5 260.754,1007.5 259.468,1006.206 255.698,1005 249.7,1003.964 241.884,1003.17 232.782,1002.67 223.014,1002.5 213.246,1002.67 204.144,1003.17 196.328,1003.964 190.33,1005 186.56,1006.206 185.274,1007.5 185.274,1007.5" class="chartlet-diagram-shadow"/><polyline points="185.274,1005 185.274,1055 186.56,1056.294 190.33,1057.5 196.328,1058.536 204.144,1059.33 213.246,1059.83 223.014,1060 232.782,1059.83 241.884,1059.33 249.7,1058.536 255.698,1057.5 259.468,1056.294 260.754,1055 260.754,1005 259.468,1003.706 255.698,1002.5 249.7,1001.464 241.884,1000.67 232.782,1000.17 223.014,1000 213.246,1000.17 204.144,1000.67 196.328,1001.464 190.33,1002.5 186.56,1003.706 185.274,1005 185.274,1005" class="chartlet-flow-node chartlet-role-teal"><title>Invoices – Postgres</title></polyline><polyline points="185.274,1005 186.56,1006.294 190.33,1007.5 196.328,1008.536 204.144,1009.33 213.246,1009.83 223.014,1010 232.782,1009.83 241.884,1009.33 249.7,1008.536 255.698,1007.5 259.468,1006.294 260.754,1005" class="chartlet-diagram-rim"/><text x="223.014" y="1030.5" text-anchor="middle" class="chartlet-flow-label">Invoices</text><text x="223.014" y="1044.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g></svg><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-0" for="chartlet-c5bbc166624832ea-focus-0"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-1" for="chartlet-c5bbc166624832ea-focus-1"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-2" for="chartlet-c5bbc166624832ea-focus-2"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-3" for="chartlet-c5bbc166624832ea-focus-3"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-4" for="chartlet-c5bbc166624832ea-focus-4"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-5" for="chartlet-c5bbc166624832ea-focus-5"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-6" for="chartlet-c5bbc166624832ea-focus-6"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-7" for="chartlet-c5bbc166624832ea-focus-7"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-8" for="chartlet-c5bbc166624832ea-focus-8"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-9" for="chartlet-c5bbc166624832ea-focus-9"></label></div></div><p class="chartlet-source">Source: Illustrative reference architecture</p><details class="chartlet-data" data-viz-text><summary>Show chart data</summary><table><caption>Data for Order platform and its data stores</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">Shopper</th><td>person</td><td></td><td>Shop app (orders)</td></tr><tr><th scope="row">Shop app</th><td>frontend</td><td></td><td>API gateway (via HTTPS)</td></tr><tr><th scope="row">API gateway</th><td>service</td><td>Order platform</td><td>Catalog service (browse), Order service (checkout)</td></tr><tr><th scope="row">Catalog service</th><td>service</td><td>Order platform</td><td>Catalog (via SQL)</td></tr><tr><th scope="row">Order service</th><td>service</td><td>Order platform</td><td>Orders (via SQL), Order events (publishes)</td></tr><tr><th scope="row">Order events</th><td>queue</td><td>Order platform</td><td>Billing worker (delivers)</td></tr><tr><th scope="row">Billing worker</th><td>service</td><td>Order platform</td><td>Invoices (via SQL)</td></tr><tr><th scope="row">Catalog</th><td>database</td><td>Order platform › Data tier</td><td></td></tr><tr><th scope="row">Invoices</th><td>database</td><td>Order platform › Data tier</td><td></td></tr><tr><th scope="row">Orders</th><td>database</td><td>Order platform › Data tier</td><td></td></tr></tbody></table></details></figure></div>