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-ds-journey.svg

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 640" 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>
    <marker id="arr" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto">
      <path d="M0 0 L7 3 L0 6 Z" fill="#6fd3f5"/>
    </marker>
  </defs>

  <rect x="0" y="0" width="1180" height="640" fill="url(#board)"/>
  <text x="40" y="46" fill="#bfe6f7" font-size="24" font-weight="700">holger-ds — the real Python journey (uv / Airflow ⇄ Holger), end to end</text>
  <text x="40" y="72" fill="#6f9bb5" font-size="14">One znippy archive → a PEP 503 / PEP 691 simple index → uv installs + an Airflow DAG hydrates each task env. Additive; measured over HTTP.</text>

  <!-- Part 1: ingest (world → znippy) -->
  <text x="40" y="118" fill="#8fd0ea" font-size="16" font-weight="700">1 · ingest — pull the world into an immutable archive</text>
  <rect x="40" y="134" width="200" height="70" rx="8" fill="url(#chip)" stroke="#2f6d8f"/>
  <text x="60" y="166" fill="#dff1fb" font-size="14" font-weight="700">requirements.txt</text>
  <text x="60" y="188" fill="#8fb8cf" font-size="12">/ uv.lock (agent world)</text>
  <line x1="240" y1="169" x2="330" y2="169" stroke="#6fd3f5" stroke-width="2" marker-end="url(#arr)"/>
  <rect x="330" y="134" width="220" height="70" rx="8" fill="url(#chip)" stroke="#2f6d8f"/>
  <text x="350" y="166" fill="#dff1fb" font-size="14" font-weight="700">resolve @ PyPI JSON</text>
  <text x="350" y="188" fill="#8fb8cf" font-size="12">wheels + sha256 digests</text>
  <line x1="550" y1="169" x2="640" y2="169" stroke="#6fd3f5" stroke-width="2" marker-end="url(#arr)"/>
  <rect x="640" y="134" width="240" height="70" rx="8" fill="url(#rail)" stroke="#3a86ad"/>
  <text x="660" y="166" fill="#dff1fb" font-size="14" font-weight="700">.znippy archive</text>
  <text x="660" y="188" fill="#8fb8cf" font-size="12">packages/{name}/{file}, blake3</text>

  <!-- Part 2: serve (PEP 503 / 691) -->
  <text x="40" y="256" fill="#8fd0ea" font-size="16" font-weight="700">2 · serve — Holger's native HTTP door as a Python index (PipRepoZnippy)</text>
  <rect x="640" y="272" width="240" height="120" rx="8" fill="url(#rail)" stroke="#3a86ad"/>
  <text x="660" y="300" fill="#dff1fb" font-size="14" font-weight="700">handle_http2_request</text>
  <text x="660" y="324" fill="#9fe0c2" font-size="12.5">GET /simple/            → root index</text>
  <text x="660" y="344" fill="#9fe0c2" font-size="12.5">GET /simple/{name}/     → links #sha256=</text>
  <text x="660" y="364" fill="#9fe0c2" font-size="12.5">GET /simple/{name}/json → PEP 691</text>
  <text x="660" y="384" fill="#9fe0c2" font-size="12.5">GET /packages/{n}/{f}   → wheel bytes</text>
  <line x1="880" y1="204" x2="760" y2="272" stroke="#6fd3f5" stroke-width="2" marker-end="url(#arr)"/>

  <!-- Part 3: consumers -->
  <text x="40" y="440" fill="#8fd0ea" font-size="16" font-weight="700">3 · install — real consumers over the protocol (pure-Rust client in tests)</text>
  <rect x="40" y="456" width="260" height="120" rx="8" fill="url(#chip)" stroke="#2f6d8f"/>
  <text x="60" y="484" fill="#dff1fb" font-size="14" font-weight="700">uv / pip install</text>
  <text x="60" y="508" fill="#8fb8cf" font-size="12.5">index → pick wheel → download</text>
  <text x="60" y="528" fill="#8fb8cf" font-size="12.5">→ recompute sha256 → verify</text>
  <text x="60" y="552" fill="#8fb8cf" font-size="12.5">content-addressed, aborts on mismatch</text>
  <line x1="640" y1="332" x2="300" y2="500" stroke="#6fd3f5" stroke-width="2" marker-end="url(#arr)"/>

  <rect x="330" y="456" width="290" height="120" rx="8" fill="url(#chip)" stroke="#2f6d8f"/>
  <text x="350" y="484" fill="#dff1fb" font-size="14" font-weight="700">Airflow DAG worker</text>
  <text x="350" y="508" fill="#8fb8cf" font-size="12.5">extract → transform → load</text>
  <text x="350" y="528" fill="#8fb8cf" font-size="12.5">each task hydrates its env from Holger,</text>
  <text x="350" y="552" fill="#8fb8cf" font-size="12.5">topological order, all wheels verified</text>
  <line x1="640" y1="352" x2="620" y2="500" stroke="#6fd3f5" stroke-width="2" marker-end="url(#arr)"/>

  <!-- Part 4: bench -->
  <rect x="660" y="456" width="480" height="120" rx="8" fill="url(#rail)" stroke="#3a86ad"/>
  <text x="680" y="484" fill="#dff1fb" font-size="14" font-weight="700">HEAVY bench arm · holger.pip_index_serve</text>
  <text x="680" y="508" fill="#9fe0c2" font-size="12.5">gatling GET pool over the wheel-download path (MB/s + ops/s),</text>
  <text x="680" y="528" fill="#9fe0c2" font-size="12.5">plus the /simple/{name}/ resolve rate (index ops/s),</text>
  <text x="680" y="548" fill="#9fe0c2" font-size="12.5">records host cores + mem — sibling of nexus_load / artifactory_load.</text>
  <line x1="880" y1="392" x2="900" y2="456" stroke="#6fd3f5" stroke-width="2" marker-end="url(#arr)"/>
</svg>