.nornir/assets/holger-architecture.svg
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="540" viewBox="0 0 900 540" font-family="ui-monospace,Menlo,Consolas,monospace">
<defs>
<marker id="arr" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto">
<path d="M0,0 L7,3 L0,6 Z" fill="#7fbfff"/>
</marker>
<style>
.bg{fill:#0e1116}
.box{rx:10; ry:10; stroke-width:1.4; filter:drop-shadow(0 2px 6px #0008)}
.lbl{fill:#e7edf5; font-size:13px; font-weight:600}
.sub{fill:#9fb0c3; font-size:10.5px}
.edge{stroke:#7fbfff; stroke-width:1.6; fill:none}
.title{fill:#f2f6fb; font-size:18px; font-weight:700}
.tag{fill:#6f8196; font-size:10px}
</style>
</defs>
<rect class="bg" x="0" y="0" width="900" height="540"/>
<text class="title" x="28" y="40">holger — airgap artifact server (znippy-backed)</text>
<text class="tag" x="28" y="58">clients → two doors → one backend → immutable storage · ** = being implemented</text>
<!-- clients -->
<rect class="box" x="28" y="90" width="180" height="120" fill="#16202c" stroke="#2b3a4d"/>
<text class="lbl" x="44" y="116">package clients</text>
<text class="sub" x="44" y="138">cargo · pip · npm</text>
<text class="sub" x="44" y="154">docker · helm · go</text>
<text class="sub" x="44" y="170">gem · nuget · conda</text>
<text class="sub" x="44" y="194">holger-server-ui · holger-agent</text>
<!-- doors -->
<rect class="box" x="290" y="80" width="210" height="66" fill="#152a22" stroke="#2f5a45"/>
<text class="lbl" x="306" y="106">native-HTTP door</text>
<text class="sub" x="306" y="126">stock protocols (handle_http2)</text>
<rect class="box" x="290" y="162" width="210" height="66" fill="#1a2536" stroke="#35507a"/>
<text class="lbl" x="306" y="188">gRPC door</text>
<text class="sub" x="306" y="208">Repository · Archive · Admin</text>
<!-- fast routes -->
<rect class="box" x="560" y="120" width="150" height="70" fill="#221a2e" stroke="#4a3a63"/>
<text class="lbl" x="576" y="146">FastRoutes</text>
<text class="sub" x="576" y="166">O(1) dispatch</text>
<text class="sub" x="576" y="182">(wire_holger, RON)</text>
<!-- repositories -->
<rect class="box" x="560" y="232" width="310" height="74" fill="#16202c" stroke="#2b3a4d"/>
<text class="lbl" x="576" y="258">repository backends</text>
<text class="sub" x="576" y="278">znippy-{maven,python,rust,npm,…} · file-rust</text>
<text class="sub" x="576" y="294">file-oci · proxy (cache write-back)</text>
<!-- storage -->
<rect class="box" x="560" y="332" width="310" height="74" fill="#2a2118" stroke="#5a4630"/>
<text class="lbl" x="576" y="358">storage — immutable znippy archives</text>
<text class="sub" x="576" y="378">Arrow-IPC index · blake3 per-chunk verify</text>
<text class="sub" x="576" y="394">content-addressed · random-access</text>
<!-- tools / profiles strip -->
<rect class="box" x="28" y="332" width="480" height="120" fill="#10171f" stroke="#243140"/>
<text class="lbl" x="44" y="356">Tools (CLI ⇄ UI symmetric)</text>
<text class="sub" x="44" y="378">1 · holger-ds — delivery benchmark over the package protocol **</text>
<text class="sub" x="44" y="396">2 · migrate — "suck" Nexus/Artifactory → znippy (agent) **</text>
<text class="sub" x="44" y="414">3 · security — Móðguðr (vuln + SCIP world-delta) **</text>
<text class="sub" x="44" y="432">4 · deploy — to test target via Skíðblaðnir **</text>
<text class="tag" x="28" y="486">profile: static (sealed, zero-egress, read-only) ↔ dynamic (writable, proxy, OIDC) — crate boundary, not #[cfg] **</text>
<text class="tag" x="28" y="504">install: dual-scope systemd via skidbladnir (user/system) · embedded in nornir-server (embed-holger)</text>
<!-- edges -->
<path class="edge" d="M208,150 L290,113" marker-end="url(#arr)"/>
<path class="edge" d="M208,160 L290,195" marker-end="url(#arr)"/>
<path class="edge" d="M500,120 L560,150" marker-end="url(#arr)"/>
<path class="edge" d="M500,196 L560,160" marker-end="url(#arr)"/>
<path class="edge" d="M635,190 L635,232" marker-end="url(#arr)"/>
<path class="edge" d="M715,269 L715,332" marker-end="url(#arr)"/>
</svg>