.nornir/assets/znippy-system.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 920 420" 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="30" font-weight="700" font-size="16">znippy — one archive: all-core, seekable, query-without-the-tool</text>
<!-- input dir -->
<rect x="30" y="70" width="140" height="60" rx="8" fill="#eef3fb" stroke="#2b5fb3" stroke-width="1.5"/>
<text x="100" y="96" text-anchor="middle" font-weight="600">directory</text>
<text x="100" y="115" text-anchor="middle" fill="#555" font-size="12">files (jars, wheels…)</text>
<!-- compress engine -->
<rect x="240" y="55" width="200" height="90" rx="8" fill="#fdf2ec" stroke="#c26a2b" stroke-width="1.5"/>
<text x="340" y="82" text-anchor="middle" font-weight="600">f1 compress</text>
<text x="340" y="102" text-anchor="middle" fill="#555" font-size="12">Gatling no-barrier engine</text>
<text x="340" y="119" text-anchor="middle" fill="#555" font-size="12">1 reader → N workers → 1 writer</text>
<text x="340" y="135" text-anchor="middle" fill="#555" font-size="12">blake3 · compress_into · store-raw</text>
<!-- plugins -->
<rect x="240" y="175" width="200" height="55" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
<text x="340" y="199" text-anchor="middle" font-weight="600">f4 plugins</text>
<text x="340" y="217" text-anchor="middle" fill="#555" font-size="12">maven · python · media → Arrow cols</text>
<!-- the .znippy container -->
<rect x="510" y="55" width="180" height="205" rx="8" fill="#f6f7f9" stroke="#444" stroke-width="1.5"/>
<text x="600" y="80" text-anchor="middle" font-weight="700">.znippy</text>
<rect x="525" y="92" width="150" height="34" rx="5" fill="#eef3fb" stroke="#2b5fb3"/>
<text x="600" y="113" text-anchor="middle" font-size="12">blobs (zstd/lz4/raw)</text>
<rect x="525" y="132" width="150" height="34" rx="5" fill="#eefaf0" stroke="#2f8f4e"/>
<text x="600" y="153" text-anchor="middle" font-size="12">Arrow-IPC sub-indexes</text>
<rect x="525" y="172" width="150" height="34" rx="5" fill="#fff7e6" stroke="#c26a2b"/>
<text x="600" y="193" text-anchor="middle" font-size="12">lookup + fst trie</text>
<rect x="525" y="212" width="150" height="34" rx="5" fill="#f6eefb" stroke="#7a3fb3"/>
<text x="600" y="233" text-anchor="middle" font-size="12">manifest + ZNPYMIDX</text>
<!-- readers -->
<rect x="760" y="55" width="135" height="46" rx="8" fill="#eef3fb" stroke="#2b5fb3" stroke-width="1.5"/>
<text x="827" y="75" text-anchor="middle" font-weight="600" font-size="13">f2 decompress</text>
<text x="827" y="92" text-anchor="middle" fill="#555" font-size="11">N-worker pread</text>
<rect x="760" y="115" width="135" height="46" rx="8" fill="#fff7e6" stroke="#c26a2b" stroke-width="1.5"/>
<text x="827" y="135" text-anchor="middle" font-weight="600" font-size="13">f3 get / seek</text>
<text x="827" y="152" text-anchor="middle" fill="#555" font-size="11">trie → O(key) row</text>
<rect x="760" y="175" width="135" height="46" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
<text x="827" y="195" text-anchor="middle" font-weight="600" font-size="13">DuckDB/Polars</text>
<text x="827" y="212" text-anchor="middle" fill="#555" font-size="11">SQL, no znippy</text>
<!-- iceberg / seal -->
<rect x="510" y="300" width="180" height="60" rx="8" fill="#f6eefb" stroke="#7a3fb3" stroke-width="1.5"/>
<text x="600" y="324" text-anchor="middle" font-weight="600">f6 iceberg ⇆ seal</text>
<text x="600" y="343" text-anchor="middle" fill="#555" font-size="12">dynamic store → static .znippy</text>
<!-- signing -->
<rect x="760" y="300" width="135" height="60" rx="8" fill="#fbeef1" stroke="#b3325a" stroke-width="1.5"/>
<text x="827" y="324" text-anchor="middle" font-weight="600" font-size="13">f7 signing</text>
<text x="827" y="343" text-anchor="middle" fill="#555" font-size="11">merkle-fold CMS</text>
<!-- zoomies -->
<rect x="30" y="300" width="410" height="60" rx="8" fill="#eef9fb" stroke="#2b9bb3" stroke-width="1.5"/>
<text x="235" y="324" text-anchor="middle" font-weight="600">f5 zoomies — parallel decoders on one SIMD inflate core</text>
<text x="235" y="343" text-anchor="middle" fill="#555" font-size="12">ljar · lgz · lbzip2 · lzip-parallel · linflate · gatling · stree</text>
<!-- arrows -->
<path d="M170,100 L238,100" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M340,175 L340,146" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M440,100 L508,120" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M690,88 L758,80" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M690,150 L758,140" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M690,200 L758,198" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M600,300 L600,262" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<text x="612" y="285" fill="#7a3fb3" font-size="11">seal reuses blobs</text>
<text x="452" y="115" fill="#c26a2b" font-size="11">write</text>
<text x="700" y="112" fill="#2b5fb3" font-size="11">read</text>
</svg>