.nornir/assets/nordisk-constellation.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 760" font-family="'DejaVu Sans', 'Segoe UI', sans-serif">
<defs>
<linearGradient id="board" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#0b1c2e"/>
<stop offset="1" stop-color="#06111d"/>
</linearGradient>
<linearGradient id="chip" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#14384f"/>
<stop offset="1" stop-color="#0e2a3e"/>
</linearGradient>
<linearGradient id="rail" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#173d57"/>
<stop offset="1" stop-color="#0c2438"/>
</linearGradient>
<linearGradient id="slot" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#123448"/>
<stop offset="1" stop-color="#0a2032"/>
</linearGradient>
<linearGradient id="core" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#1c5a7a"/>
<stop offset="1" stop-color="#0e3650"/>
</linearGradient>
<linearGradient id="ice" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#e4f5ff" stop-opacity="0.95"/>
<stop offset="0.55" stop-color="#bfe6ff" stop-opacity="0.6"/>
<stop offset="1" stop-color="#bfe6ff" stop-opacity="0.08"/>
</linearGradient>
</defs>
<!-- PCB substrate -->
<rect x="0" y="0" width="1180" height="760" fill="url(#board)"/>
<g stroke="#143a52" stroke-width="1">
<line x1="0" y1="76" x2="1180" y2="76"/>
<line x1="0" y1="712" x2="1180" y2="712"/>
<line x1="0" y1="394" x2="1180" y2="394" stroke-dasharray="2 6"/>
</g>
<g fill="#16415c">
<circle cx="40" cy="40" r="2"/><circle cx="1140" cy="40" r="2"/>
<circle cx="40" cy="732" r="2"/><circle cx="1140" cy="732" r="2"/>
</g>
<!-- title -->
<text x="40" y="44" fill="#eaf6ff" font-size="22" font-weight="700">nordisk constellation</text>
<text x="318" y="44" fill="#9fc9e0" font-size="15">nornir <tspan fill="#bfe6ff" font-weight="700">stands on</tspan> three nordisk crates · and <tspan fill="#bfe6ff" font-weight="700">orchestrates</tspan> the sibling repos</text>
<!-- legend -->
<g font-size="12.5">
<line x1="744" y1="60" x2="784" y2="60" stroke="#6fd3f5" stroke-width="3"/>
<text x="792" y="64" fill="#cfe6f5">crate dep / data flow</text>
<line x1="946" y1="60" x2="986" y2="60" stroke="#7fb0cc" stroke-width="2.5" stroke-dasharray="5 4"/>
<text x="994" y="64" fill="#cfe6f5">poll / read (cheap)</text>
</g>
<!-- band labels -->
<text x="40" y="100" fill="#7fa8c4" font-size="12" font-weight="700" letter-spacing="1.5">▼ CRATE DEPENDENCIES — what nornir is built from</text>
<text x="40" y="424" fill="#7fa8c4" font-size="12" font-weight="700" letter-spacing="1.5">▼ ORCHESTRATOR — nornir over the monitored workspaces</text>
<!-- ===================== nornir CORE chip (top centre) ===================== -->
<rect x="468" y="120" width="244" height="120" rx="12" fill="url(#core)" stroke="#9fe0ff" stroke-width="2.5"/>
<text x="590" y="152" fill="#eaf6ff" font-size="18" font-weight="700" text-anchor="middle">nornir</text>
<text x="590" y="172" fill="#bfe6ff" font-size="10.5" text-anchor="middle">cargo companion · lib + CLI + MCP + server</text>
<text x="590" y="190" fill="#9fc9e0" font-size="10" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">codeberg nordisk/nornir · v0.4.13</text>
<text x="590" y="212" fill="#86b3cc" font-size="10" text-anchor="middle">Urðr warehouse · Verðandi guard · Skuld release</text>
<text x="590" y="228" fill="#7fa8c4" font-size="9.5" text-anchor="middle">pure-Rust: no JVM, no SQL server, no C shellout</text>
<!-- pins -->
<rect x="520" y="240" width="6" height="8" fill="#6fd3f5"/>
<rect x="654" y="240" width="6" height="8" fill="#6fd3f5"/>
<rect x="462" y="176" width="6" height="8" fill="#6fd3f5"/>
<!-- nornir -> three deps (ice traces fanning down) -->
<g stroke="#6fd3f5" stroke-width="3" fill="none">
<path d="M523 248 V270 H180 V300"/>
<path d="M590 240 V310"/>
<path d="M657 248 V272 H1000 V300"/>
</g>
<g fill="#bfecff"><circle cx="180" cy="300" r="4"/><circle cx="590" cy="310" r="4"/><circle cx="1000" cy="300" r="4"/></g>
<!-- DEP 1: znippy-zoomies (left) -->
<rect x="60" y="300" width="240" height="76" rx="10" fill="url(#chip)" stroke="#7fc8ea" stroke-width="2"/>
<text x="180" y="326" fill="#eaf6ff" font-size="14" font-weight="700" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">znippy-zoomies</text>
<text x="180" y="343" fill="#9fc9e0" font-size="9.5" text-anchor="middle">gatling no-barrier worker-pool</text>
<text x="180" y="357" fill="#bfe6ff" font-size="9.5" text-anchor="middle">fans deep-scan syn across all cores</text>
<text x="180" y="370" fill="#7fa8c4" font-size="9" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">= "0.1.8" · the GATLING + zero-copy law</text>
<!-- DEP 2: nornir-testmatrix (centre, owned) -->
<rect x="392" y="300" width="396" height="76" rx="10" fill="url(#chip)" stroke="#7fc8ea" stroke-width="2"/>
<text x="590" y="326" fill="#eaf6ff" font-size="14" font-weight="700" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">nornir-testmatrix</text>
<text x="590" y="343" fill="#9fc9e0" font-size="9.5" text-anchor="middle">multi-aspect test engine — build · unit · doctest · clippy · fmt · audit</text>
<text x="590" y="357" fill="#bfe6ff" font-size="9.5" text-anchor="middle">rows → any TestSink · pure std + serde (no iceberg/arrow/eframe)</text>
<text x="590" y="370" fill="#7fa8c4" font-size="9" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">path = "crates/nornir-testmatrix" · "0.1.0" · nornir's own reusable crate</text>
<!-- DEP 3: skade-katalog + skade (right) -->
<rect x="880" y="300" width="240" height="76" rx="10" fill="url(#chip)" stroke="#7fc8ea" stroke-width="2"/>
<text x="1000" y="326" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">skade-katalog · skade</text>
<text x="1000" y="343" fill="#9fc9e0" font-size="9.5" text-anchor="middle">Iceberg catalog (redb) + writer/reader</text>
<text x="1000" y="357" fill="#bfe6ff" font-size="9.5" text-anchor="middle">the warehouse backend — append · scan</text>
<text x="1000" y="370" fill="#7fa8c4" font-size="9" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">"0.1.7" + "0.4.9" (no-default) · ../skade</text>
<!-- "owns / publishes" note on testmatrix -->
<path d="M712 176 H760 V310 H788" stroke="#7fb0cc" stroke-width="2" fill="none" stroke-dasharray="4 3"/>
<text x="772" y="262" fill="#86b3cc" font-size="9.5" text-anchor="middle" transform="rotate(90 772 262)">owns + publishes</text>
<!-- ===================== ORCHESTRATOR BAND ===================== -->
<!-- registry + descriptor (left) -->
<rect x="36" y="448" width="186" height="150" rx="10" fill="url(#chip)" stroke="#7fc8ea" stroke-width="2.5"/>
<text x="129" y="474" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle">workspace + registry</text>
<text x="129" y="492" fill="#9fc9e0" font-size="9.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">nornir-workspace.toml</text>
<text x="129" y="506" fill="#86b3cc" font-size="9" text-anchor="middle">descriptor = where source comes from</text>
<text x="129" y="520" fill="#86b3cc" font-size="9" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">[repos.x] git=… / path=… / branch</text>
<text x="129" y="540" fill="#9fc9e0" font-size="9.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">registry (redb)</text>
<text x="129" y="554" fill="#bfe6ff" font-size="9" text-anchor="middle">mode: monitored | pushed | external</text>
<text x="129" y="568" fill="#86b3cc" font-size="9" text-anchor="middle">poll interval · per-member sync state</text>
<text x="129" y="586" fill="#7fa8c4" font-size="9" text-anchor="middle">server-global · $NORNIR_ROOT</text>
<rect x="222" y="478" width="6" height="8" fill="#6fd3f5"/>
<rect x="222" y="540" width="6" height="8" fill="#7fb0cc"/>
<!-- registry -> clone -->
<g stroke="#6fd3f5" stroke-width="3" fill="none"><path d="M222 482 H280"/></g>
<circle cx="280" cy="482" r="4" fill="#bfecff"/>
<!-- poll (dashed) loop hint -->
<path d="M222 544 H262 V610 H300" stroke="#7fb0cc" stroke-width="2.5" fill="none" stroke-dasharray="6 4"/>
<text x="280" y="604" fill="#86b3cc" font-size="9.5" text-anchor="middle">ls-remote poll — HEAD changed?</text>
<!-- git clone/fetch chip -->
<rect x="280" y="448" width="170" height="104" rx="10" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="365" y="474" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle">git clone / fetch</text>
<text x="365" y="492" fill="#9fc9e0" font-size="9.5" text-anchor="middle">pure-Rust gix + russh</text>
<text x="365" y="506" fill="#86b3cc" font-size="9" text-anchor="middle">HTTPS (rustls) · SSH (deploy key)</text>
<text x="365" y="520" fill="#86b3cc" font-size="9" text-anchor="middle">no git/ssh subprocess, no libgit2</text>
<text x="365" y="538" fill="#7fa8c4" font-size="9" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">→ <root>/<ws>/git/<member></text>
<rect x="274" y="478" width="6" height="8" fill="#6fd3f5"/>
<rect x="450" y="478" width="6" height="8" fill="#6fd3f5"/>
<!-- clone -> republish -->
<g stroke="#6fd3f5" stroke-width="3" fill="none"><path d="M450 482 H508"/></g>
<circle cx="508" cy="482" r="4" fill="#bfecff"/>
<!-- republish (knowledge scan) chip -->
<rect x="508" y="448" width="186" height="104" rx="10" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="601" y="474" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle">republish hook</text>
<text x="601" y="492" fill="#9fc9e0" font-size="9.5" text-anchor="middle">knowledge scan · dep-graph</text>
<text x="601" y="506" fill="#86b3cc" font-size="9" text-anchor="middle">syn fanned by znippy gatling</text>
<text x="601" y="520" fill="#bfe6ff" font-size="9" text-anchor="middle">opt-in deep-scan: whole dep closure</text>
<text x="601" y="538" fill="#7fa8c4" font-size="9" text-anchor="middle">through the server's single warehouse handle</text>
<rect x="502" y="478" width="6" height="8" fill="#6fd3f5"/>
<rect x="694" y="478" width="6" height="8" fill="#6fd3f5"/>
<!-- republish -> warehouse -->
<g stroke="#6fd3f5" stroke-width="3" fill="none"><path d="M694 482 H752"/></g>
<circle cx="752" cy="482" r="4" fill="#bfecff"/>
<!-- per-workspace warehouse chip -->
<rect x="752" y="448" width="186" height="104" rx="11" fill="url(#rail)" stroke="#7fc8ea" stroke-width="2.5"/>
<text x="845" y="474" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle">per-workspace warehouse</text>
<text x="845" y="492" fill="#9fc9e0" font-size="9.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace"><root>/<ws>/builds</text>
<text x="845" y="506" fill="#bfe6ff" font-size="9" text-anchor="middle">Iceberg tables via skade + skade-katalog</text>
<text x="845" y="520" fill="#86b3cc" font-size="9" text-anchor="middle">single-writer redb · append-only</text>
<text x="845" y="538" fill="#7fa8c4" font-size="9" text-anchor="middle">release_events · dep_graph · test_results · …</text>
<rect x="746" y="478" width="6" height="8" fill="#6fd3f5"/>
<rect x="938" y="478" width="6" height="8" fill="#7fb0cc"/>
<!-- warehouse -> viz (dashed read) -->
<path d="M938 482 H996" stroke="#7fb0cc" stroke-width="2.5" fill="none" stroke-dasharray="6 4"/>
<circle cx="996" cy="482" r="4" fill="#bfecff"/>
<!-- viz chip -->
<rect x="996" y="448" width="148" height="104" rx="10" fill="url(#chip)" stroke="#7fc8ea" stroke-width="2"/>
<text x="1070" y="474" fill="#eaf6ff" font-size="13" font-weight="700" text-anchor="middle">viz + MCP</text>
<text x="1070" y="491" fill="#9fc9e0" font-size="9" text-anchor="middle">urdr-threads</text>
<text x="1070" y="505" fill="#86b3cc" font-size="8.5" text-anchor="middle">swim-lane / member</text>
<text x="1070" y="518" fill="#bfe6ff" font-size="8.5" text-anchor="middle">woven dep-graph threads</text>
<text x="1070" y="534" fill="#7fa8c4" font-size="8.5" text-anchor="middle">gRPC thin clients (read)</text>
<!-- ===================== GROUND RAIL: the constellation members ===================== -->
<rect x="36" y="632" width="1108" height="56" rx="10" fill="url(#rail)" stroke="#7fc8ea" stroke-width="2"/>
<g fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5">
<circle cx="76" cy="660" r="4"/><circle cx="1108" cy="660" r="4"/>
</g>
<text x="98" y="659" fill="#dff1ff" font-size="14" font-weight="700">monitored repos</text>
<g font-family="'DejaVu Sans Mono', monospace" font-size="11.5" fill="#bfe6ff">
<text x="260" y="659">holger</text>
<text x="350" y="659" fill="#9fe0ff">skade</text>
<text x="430" y="659" fill="#9fe0ff">znippy</text>
<text x="528" y="659">knut</text>
<text x="600" y="659" fill="#9fe0ff">facett</text>
<text x="688" y="659">korp</text>
<text x="752" y="659">njord</text>
</g>
<text x="98" y="678" fill="#7fa8c4" font-size="10" font-family="'DejaVu Sans Mono', monospace">each cloned + built into its own warehouse · skade/znippy/facett are also crate deps (above)</text>
<text x="852" y="659" fill="#86b3cc" font-size="10.5" text-anchor="start">git@codeberg.org:nordisk/…</text>
</svg>