.nornir/assets/knut-fabric.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 440" 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">knut — one Arrow pipe: columnar lake → live queryable graph</text>
<!-- The Arrow spine (left → right) -->
<!-- graphar -->
<rect x="30" y="150" width="150" height="66" rx="8" fill="#eef3fb" stroke="#2b5fb3" stroke-width="1.5"/>
<text x="105" y="178" text-anchor="middle" font-weight="600">graphar</text>
<text x="105" y="197" text-anchor="middle" fill="#555" font-size="12">gar/v1 chunk files</text>
<text x="105" y="211" text-anchor="middle" fill="#555" font-size="11">ChunkStore · object_store</text>
<!-- falkordb -->
<rect x="240" y="150" width="150" height="66" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
<text x="315" y="178" text-anchor="middle" font-weight="600">falkordb load</text>
<text x="315" y="197" text-anchor="middle" fill="#555" font-size="12">UNWIND CREATE/MERGE</text>
<text x="315" y="211" text-anchor="middle" fill="#555" font-size="11">Arrow → Cypher</text>
<!-- FalkorDB store -->
<rect x="450" y="150" width="120" height="66" rx="8" fill="#fbeeee" stroke="#b33b3b" stroke-width="1.5"/>
<text x="510" y="182" text-anchor="middle" font-weight="600">FalkorDB</text>
<text x="510" y="201" text-anchor="middle" fill="#555" font-size="12">property graph</text>
<!-- flight -->
<rect x="630" y="150" width="150" height="66" rx="8" fill="#fdf2ec" stroke="#c26a2b" stroke-width="1.5"/>
<text x="705" y="178" text-anchor="middle" font-weight="600">flight SQL</text>
<text x="705" y="197" text-anchor="middle" fill="#555" font-size="12">Cypher in · Arrow out</text>
<text x="705" y="211" text-anchor="middle" fill="#555" font-size="11">export → Iceberg</text>
<!-- clients -->
<rect x="820" y="150" width="60" height="66" rx="8" fill="#f6eefb" stroke="#7a3fb3" stroke-width="1.5"/>
<text x="850" y="178" text-anchor="middle" font-weight="600" font-size="12">ADBC</text>
<text x="850" y="195" text-anchor="middle" fill="#555" font-size="11">Power</text>
<text x="850" y="208" text-anchor="middle" fill="#555" font-size="11">BI</text>
<!-- spine arrows -->
<path d="M180,183 L238,183" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M390,183 L448,183" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M570,183 L628,183" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M780,183 L818,183" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<text x="205" y="176" text-anchor="middle" fill="#888" font-size="10">Arrow</text>
<!-- Bifröst feeds the graph (lakehouse → graphar/falkordb) -->
<rect x="240" y="300" width="200" height="70" rx="8" fill="#eef3fb" stroke="#2b5fb3" stroke-width="1.5"/>
<text x="340" y="328" text-anchor="middle" font-weight="600">Bifröst 🌈 — table→graph</text>
<text x="340" y="347" text-anchor="middle" fill="#555" font-size="12">Iceberg/file source → CDC MERGE</text>
<text x="340" y="361" text-anchor="middle" fill="#555" font-size="11">state-after-sink · AIP-82 events</text>
<path d="M315,300 L315,218" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<text x="322" y="262" fill="#2f8f4e" font-size="11">materialise</text>
<!-- Þund engine authors/runs pipelines -->
<rect x="30" y="300" width="180" height="70" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
<text x="120" y="328" text-anchor="middle" font-weight="600">Þund 🌊 — engine</text>
<text x="120" y="347" text-anchor="middle" fill="#555" font-size="12">one IR → ExecBackend</text>
<text x="120" y="361" text-anchor="middle" fill="#555" font-size="11">native or Spark-SDP</text>
<!-- pipelines viewer -->
<rect x="470" y="300" width="200" height="70" rx="8" fill="#fdf2ec" stroke="#c26a2b" stroke-width="1.5"/>
<text x="570" y="328" text-anchor="middle" font-weight="600">pipelines — viewer</text>
<text x="570" y="347" text-anchor="middle" fill="#555" font-size="12">Spark Connect · knutpipe</text>
<text x="570" y="361" text-anchor="middle" fill="#555" font-size="11">one model, many frontends</text>
<path d="M310,300 C360,270 430,270 470,300" fill="none" stroke="#999" stroke-width="1.2" stroke-dasharray="4 3" marker-end="url(#a)"/>
<path d="M210,335 L468,335" fill="none" stroke="#999" stroke-width="1.2" stroke-dasharray="4 3" marker-end="url(#a)"/>
<text x="360" y="292" text-anchor="middle" fill="#888" font-size="10">lowers onto</text>
<!-- popviz loader -->
<rect x="700" y="300" width="180" height="70" rx="8" fill="#f6eefb" stroke="#7a3fb3" stroke-width="1.5"/>
<text x="790" y="328" text-anchor="middle" font-weight="600">popviz — loader</text>
<text x="790" y="347" text-anchor="middle" fill="#555" font-size="12">popsim → Arrow → load</text>
<text x="790" y="361" text-anchor="middle" fill="#555" font-size="11">headless-introspectable GUI</text>
<path d="M700,320 C560,300 430,240 390,196" fill="none" stroke="#999" stroke-width="1.2" stroke-dasharray="4 3" marker-end="url(#a)"/>
<text x="30" y="418" fill="#888" font-size="12" font-style="italic">Reuse graph: falkordb → graphar · flight → {falkordb, graphar} · bifrost → {falkordb, graphar} · thund → pipelines · popviz → {falkordb, graphar, popsim}</text>
</svg>