Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/holger

.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>