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