.nornir/assets/holger-tiers.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 860 430" font-family="-apple-system,Segoe UI,Roboto,sans-serif" font-size="14">
<defs>
<marker id="a" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto">
<path d="M0,0 L7,3 L0,6 Z" fill="#555"/>
</marker>
</defs>
<text x="30" y="28" font-weight="700" font-size="16">Holger — one engine, three build variants (crate boundary, not #[cfg])</text>
<!-- three variant boxes across the top -->
<!-- embedded -->
<rect x="30" y="60" width="240" height="92" rx="8" fill="#eef3fb" stroke="#2b5fb3" stroke-width="1.5"/>
<text x="150" y="86" text-anchor="middle" font-weight="600">embedded (library)</text>
<text x="150" y="106" text-anchor="middle" fill="#555" font-size="12">no process — linked in-process</text>
<text x="150" y="124" text-anchor="middle" fill="#555" font-size="12">by a host (nornir embed-holger)</text>
<text x="150" y="142" text-anchor="middle" fill="#2b5fb3" font-size="12">✅ built · direct Rust, no socket</text>
<!-- mini -->
<rect x="310" y="60" width="240" height="92" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
<text x="430" y="86" text-anchor="middle" font-weight="600">mini (static-holger)</text>
<text x="430" y="106" text-anchor="middle" fill="#555" font-size="12">stripped, read-only, zero egress</text>
<text x="430" y="124" text-anchor="middle" fill="#555" font-size="12">airgap / red-zone SBC</text>
<text x="430" y="142" text-anchor="middle" fill="#c26a2b" font-size="12">🧭 design · crate-split refactor</text>
<!-- full -->
<rect x="590" y="60" width="240" height="92" rx="8" fill="#fdf2ec" stroke="#c26a2b" stroke-width="1.5"/>
<text x="710" y="86" text-anchor="middle" font-weight="600">full (holger-server)</text>
<text x="710" y="106" text-anchor="middle" fill="#555" font-size="12">writable + proxy + remote + RON</text>
<text x="710" y="124" text-anchor="middle" fill="#555" font-size="12">developer / build side default</text>
<text x="710" y="142" text-anchor="middle" fill="#2b5fb3" font-size="12">✅ built · un-split binary</text>
<!-- arrows down to the shared engine -->
<path d="M150,152 L150,196" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M430,152 L430,196" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M710,152 L710,196" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<!-- shared serve engine -->
<rect x="30" y="200" width="800" height="72" rx="8" fill="#f6eefb" stroke="#7a3fb3" stroke-width="1.5"/>
<text x="430" y="226" text-anchor="middle" font-weight="600">holger-server-lib — wire_holger() · FastRoutes O(1) dispatch · gRPC + native-HTTP doors</text>
<text x="430" y="250" text-anchor="middle" fill="#555" font-size="12">the serve engine never names a concrete backend — it dispatches through Arc<dyn RepositoryBackendTrait></text>
<!-- backends row -->
<rect x="30" y="298" width="380" height="60" rx="8" fill="#eef3fb" stroke="#2b5fb3" stroke-width="1.5"/>
<text x="220" y="322" text-anchor="middle" font-weight="600">read-only znippy backends (13 ecosystems)</text>
<text x="220" y="342" text-anchor="middle" fill="#555" font-size="12">maven·python·rust·npm·nuget·go·gem·deb·rpm·helm·docker·conda·composer·package</text>
<rect x="450" y="298" width="380" height="60" rx="8" fill="#fdf2ec" stroke="#c26a2b" stroke-width="1.5"/>
<text x="640" y="322" text-anchor="middle" font-weight="600">writable + egress (full only)</text>
<text x="640" y="342" text-anchor="middle" fill="#555" font-size="12">file-rust · file-oci · ProxyBackend · RemoteUpstream (Nexus/Artifactory)</text>
<path d="M220,272 L220,296" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M640,272 L640,296" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<!-- traits floor -->
<rect x="30" y="382" width="800" height="34" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
<text x="430" y="404" text-anchor="middle" font-weight="600" font-size="13">traits/ — RepositoryBackendTrait · ConnectorTrait · HolgerObject · ArtifactFormat (shared by all variants)</text>
</svg>