.nornir/assets/docbook-pipeline.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 560" 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>
<linearGradient id="slot" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#123448"/><stop offset="1" stop-color="#0a2032"/>
</linearGradient>
<marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M0 0 L10 5 L0 10 z" fill="#6fd3f5"/>
</marker>
<marker id="arrg" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M0 0 L10 5 L0 10 z" fill="#7CFFB2"/>
</marker>
</defs>
<rect x="0" y="0" width="1180" height="560" fill="url(#board)"/>
<g stroke="#143a52" stroke-width="1"><line x1="0" y1="74" x2="1180" y2="74"/><line x1="0" y1="516" x2="1180" y2="516"/></g>
<g fill="#16415c"><circle cx="40" cy="38" r="2"/><circle cx="1140" cy="38" r="2"/><circle cx="40" cy="536" r="2"/><circle cx="1140" cy="536" r="2"/></g>
<text x="40" y="38" fill="#eaf6ff" font-size="22" font-weight="700">the docbook pipeline</text>
<text x="40" y="60" fill="#9fc9e0" font-size="14"><tspan font-family="'DejaVu Sans Mono', monospace" fill="#bfe6ff">.nornir/*.md</tspan> sources → marker expansion → one typst engine → README + three class-routed books</text>
<g font-size="12.5">
<line x1="820" y1="54" x2="860" y2="54" stroke="#7CFFB2" stroke-width="3" marker-end="url(#arrg)"/>
<text x="868" y="58" fill="#cfe6f5">render / build</text>
<line x1="990" y1="54" x2="1030" y2="54" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arr)"/>
<text x="1038" y="58" fill="#cfe6f5">index / observe</text>
</g>
<!-- 1. sources -->
<rect x="30" y="104" width="212" height="330" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="136" y="130" fill="#eaf6ff" font-size="14.5" font-weight="700" text-anchor="middle">1 · sources</text>
<text x="136" y="148" fill="#9fc9e0" font-size="10" text-anchor="middle">you edit these (SOURCE OF TRUTH)</text>
<g font-family="'DejaVu Sans Mono', monospace">
<rect x="48" y="162" width="176" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="136" y="178" fill="#bfe6ff" font-size="10" text-anchor="middle">README.md</text>
<rect x="48" y="190" width="176" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="136" y="206" fill="#bfe6ff" font-size="10" text-anchor="middle">CHANGELOG.md</text>
<rect x="48" y="218" width="176" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="136" y="234" fill="#7CFFB2" font-size="10" text-anchor="middle">*-design.md</text>
<rect x="48" y="246" width="176" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="136" y="262" fill="#7CFFB2" font-size="10" text-anchor="middle">*-guide.md</text>
<rect x="48" y="274" width="176" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="136" y="290" fill="#7CFFB2" font-size="10" text-anchor="middle">*-reasoning.md</text>
<rect x="48" y="302" width="176" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="136" y="318" fill="#bfe6ff" font-size="10" text-anchor="middle">*-for-idiots.md</text>
</g>
<text x="136" y="352" fill="#86b3cc" font-size="9.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">assets/ · docs.toml (routing)</text>
<text x="136" y="374" fill="#a9d8ee" font-size="9.5" text-anchor="middle">each carries marker regions:</text>
<text x="136" y="392" fill="#7fa8c4" font-size="9" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace"><!-- nornir:gen:start:X --></text>
<text x="136" y="406" fill="#7fa8c4" font-size="9" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace"><!-- nornir:gen:end:X --></text>
<text x="136" y="424" fill="#86b3cc" font-size="9.5" text-anchor="middle">filename suffix = class</text>
<line x1="242" y1="270" x2="306" y2="270" stroke="#7CFFB2" stroke-width="3" marker-end="url(#arrg)"/>
<!-- 2. markers -->
<rect x="312" y="150" width="222" height="240" rx="12" fill="url(#rail)" stroke="#7CFFB2" stroke-width="2.4"/>
<text x="423" y="176" fill="#eaf6ff" font-size="14.5" font-weight="700" text-anchor="middle">2 · marker expansion</text>
<text x="423" y="194" fill="#9fc9e0" font-size="10" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">sections::rewrite</text>
<g font-family="'DejaVu Sans Mono', monospace">
<rect x="330" y="208" width="186" height="22" rx="5" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.2"/><text x="423" y="223" fill="#bfe6ff" font-size="9.5" text-anchor="middle">bench / benches / mashup</text>
<rect x="330" y="234" width="186" height="22" rx="5" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.2"/><text x="423" y="249" fill="#bfe6ff" font-size="9.5" text-anchor="middle">tests / coverage</text>
<rect x="330" y="260" width="186" height="22" rx="5" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.2"/><text x="423" y="275" fill="#bfe6ff" font-size="9.5" text-anchor="middle">depgraph / bench_chart</text>
<rect x="330" y="286" width="186" height="22" rx="5" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.2"/><text x="423" y="301" fill="#bfe6ff" font-size="9.5" text-anchor="middle">symbols / callgraph</text>
</g>
<text x="423" y="330" fill="#86b3cc" font-size="9.5" text-anchor="middle">renderers read pre-fetched Ctx</text>
<text x="423" y="346" fill="#7fa8c4" font-size="9" text-anchor="middle">(warehouse: bench, coverage;</text>
<text x="423" y="360" fill="#7fa8c4" font-size="9" text-anchor="middle">cargo metadata: depgraph; DWARF: symbols)</text>
<text x="423" y="378" fill="#86b3cc" font-size="9.5" text-anchor="middle">body re-emitted with sorted args</text>
<line x1="534" y1="270" x2="598" y2="270" stroke="#7CFFB2" stroke-width="3" marker-end="url(#arrg)"/>
<!-- 3. typst -->
<rect x="604" y="182" width="150" height="176" rx="12" fill="url(#chip)" stroke="#7fc8ea" stroke-width="2.5"/>
<text x="679" y="212" fill="#eaf6ff" font-size="15" font-weight="700" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">typst</text>
<text x="679" y="232" fill="#9fc9e0" font-size="10" text-anchor="middle">one engine</text>
<text x="679" y="248" fill="#9fc9e0" font-size="10" text-anchor="middle">no JS · no Mermaid</text>
<text x="679" y="272" fill="#bfe6ff" font-size="9.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">export::export</text>
<text x="679" y="288" fill="#7fa8c4" font-size="9" text-anchor="middle">report.typ (PDF/MD)</text>
<text x="679" y="302" fill="#7fa8c4" font-size="9" text-anchor="middle">web.typ (HTML)</text>
<text x="679" y="326" fill="#86b3cc" font-size="9" text-anchor="middle">SVG depgraph +</text>
<text x="679" y="340" fill="#86b3cc" font-size="9" text-anchor="middle">bench charts inline</text>
<line x1="754" y1="270" x2="818" y2="270" stroke="#7CFFB2" stroke-width="3" marker-end="url(#arrg)"/>
<!-- 4. outputs -->
<rect x="824" y="98" width="326" height="360" rx="12" fill="url(#rail)" stroke="#7CFFB2" stroke-width="2.4"/>
<text x="987" y="124" fill="#eaf6ff" font-size="14.5" font-weight="700" text-anchor="middle">4 · outputs</text>
<text x="987" y="142" fill="#9fc9e0" font-size="10" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">book::build_books (routing = docs.toml)</text>
<rect x="844" y="156" width="286" height="40" rx="7" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/>
<text x="987" y="174" fill="#bfe6ff" font-size="11" text-anchor="middle" font-weight="700">README.md · CHANGELOG.md</text>
<text x="987" y="189" fill="#86b3cc" font-size="9" text-anchor="middle">repo root, GENERATED, chmod -w</text>
<rect x="844" y="204" width="286" height="42" rx="7" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.6"/>
<text x="987" y="222" fill="#7CFFB2" font-size="11" text-anchor="middle" font-weight="700">manual.pdf</text>
<text x="987" y="237" fill="#86b3cc" font-size="9" text-anchor="middle">readme + design + guide + benchmarks</text>
<rect x="844" y="254" width="286" height="42" rx="7" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.6"/>
<text x="987" y="272" fill="#7CFFB2" font-size="11" text-anchor="middle" font-weight="700">idiot_guide.pdf</text>
<text x="987" y="287" fill="#86b3cc" font-size="9" text-anchor="middle">every idiot section</text>
<rect x="844" y="304" width="286" height="42" rx="7" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.6"/>
<text x="987" y="322" fill="#7CFFB2" font-size="11" text-anchor="middle" font-weight="700">unsorted.pdf</text>
<text x="987" y="337" fill="#86b3cc" font-size="9" text-anchor="middle">reasoning + history + unsorted</text>
<rect x="844" y="354" width="286" height="38" rx="7" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/>
<text x="987" y="371" fill="#bfe6ff" font-size="10.5" text-anchor="middle">docs index + BM25 search</text>
<text x="987" y="385" fill="#86b3cc" font-size="9" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">docs_index_snapshots</text>
<line x1="987" y1="392" x2="987" y2="418" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arr)"/>
<rect x="844" y="420" width="286" height="26" rx="7" fill="url(#chip)" stroke="#5aa6cf" stroke-width="1.4"/>
<text x="987" y="437" fill="#cfe6f5" font-size="10" text-anchor="middle">Codeberg Pages · nordisk.codeberg.page/<repo></text>
<!-- ground -->
<rect x="30" y="464" width="1120" height="40" rx="10" fill="url(#rail)" stroke="#7fc8ea" stroke-width="2"/>
<text x="52" y="489" fill="#bcd9ec" font-size="11.5">One typst engine, no JS. A source's class (filename suffix) is the routing key: it decides which of the three PDFs a chapter lands in — split by AUDIENCE, never thrown away.</text>
</svg>