Gunnar

mikronova/draupnir

.nornir/assets/build-thing-launch.svg

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 860" 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="hub" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#1c5170"/>
      <stop offset="1" stop-color="#0f3247"/>
    </linearGradient>
    <linearGradient id="muscle" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#173d57"/>
      <stop offset="1" stop-color="#0c2438"/>
    </linearGradient>
    <linearGradient id="spectrum" x1="0" y1="0" x2="1" y2="0">
      <stop offset="0" stop-color="#35c6f4"/>
      <stop offset="0.5" stop-color="#5b8fd6"/>
      <stop offset="1" stop-color="#e08a3c"/>
    </linearGradient>
    <linearGradient id="ice" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#e4f5ff" stop-opacity="0.95"/>
      <stop offset="1" stop-color="#bfe6ff" stop-opacity="0.10"/>
    </linearGradient>
    <marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto">
      <path d="M0,0 L8,3 L0,6 Z" fill="#7fe3ff"/>
    </marker>
    <marker id="arroww" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto">
      <path d="M0,0 L8,3 L0,6 Z" fill="#9fb7c8"/>
    </marker>
  </defs>

  <rect x="0" y="0" width="1200" height="860" fill="url(#board)"/>
  <g stroke="#143a52" stroke-width="1" opacity="0.6">
    <line x1="0" y1="70" x2="1200" y2="70"/>
    <line x1="0" y1="828" x2="1200" y2="828"/>
  </g>

  <text x="40" y="46" fill="#e4f5ff" font-size="26" font-weight="700">build-thing · the two axes and the machine spine</text>
  <text x="1160" y="46" fill="#5f86a0" font-size="14" text-anchor="end">nordisk · draupnir/.nornir</text>

  <!-- ================= TWO AXES PANEL ================= -->
  <text x="40" y="112" fill="#7fe3ff" font-size="16" font-weight="700">AXIS 1 — BUILD  (what comes out)</text>
  <text x="640" y="112" fill="#e08a3c" font-size="16" font-weight="700">AXIS 2 — LAUNCH  (how you run it · kind-aware)</text>

  <!-- build kinds column -->
  <g font-size="14">
    <!-- rows -->
    <g>
      <rect x="40" y="132" width="150" height="46" rx="8" fill="url(#chip)" stroke="#2b6f93"/>
      <text x="115" y="153" fill="#dff1ff" text-anchor="middle" font-weight="700">exe</text>
      <text x="115" y="170" fill="#89b6cf" text-anchor="middle" font-size="11">cargo build</text>

      <line x1="190" y1="155" x2="636" y2="155" stroke="#2c5b76" stroke-width="1.5" marker-end="url(#arrow)"/>
      <rect x="640" y="132" width="520" height="46" rx="8" fill="url(#muscle)" stroke="#2b6f93"/>
      <text x="660" y="153" fill="#dff1ff" font-weight="700">run</text>
      <text x="660" y="170" fill="#89b6cf" font-size="11">spawn the binary · exit code + stdout</text>
    </g>
    <g>
      <rect x="40" y="188" width="150" height="46" rx="8" fill="url(#chip)" stroke="#2b6f93"/>
      <text x="115" y="209" fill="#dff1ff" text-anchor="middle" font-weight="700">container</text>
      <text x="115" y="226" fill="#89b6cf" text-anchor="middle" font-size="11">ContainerBuild · bollard</text>

      <line x1="190" y1="211" x2="636" y2="211" stroke="#2c5b76" stroke-width="1.5" marker-end="url(#arrow)"/>
      <rect x="640" y="188" width="520" height="46" rx="8" fill="url(#muscle)" stroke="#3f8a5a"/>
      <text x="660" y="209" fill="#bff0d0" font-weight="700">DEPLOY</text>
      <text x="742" y="209" fill="#dff1ff">+ logs pane</text>
      <text x="660" y="226" fill="#89b6cf" font-size="11">podman run (bollard) · stream container stdout</text>
    </g>
    <g>
      <rect x="40" y="244" width="150" height="46" rx="8" fill="url(#chip)" stroke="#2b6f93"/>
      <text x="115" y="265" fill="#dff1ff" text-anchor="middle" font-weight="700">vm</text>
      <text x="115" y="282" fill="#89b6cf" text-anchor="middle" font-size="11">VmBuild · kernel+rootfs</text>

      <line x1="190" y1="267" x2="636" y2="267" stroke="#2c5b76" stroke-width="1.5" marker-end="url(#arrow)"/>
      <rect x="640" y="244" width="520" height="46" rx="8" fill="url(#muscle)" stroke="#c98a3c"/>
      <text x="660" y="265" fill="#ffd9a8" font-weight="700">BOOT CONSOLE</text>
      <text x="792" y="265" fill="#dff1ff">+ serial pane</text>
      <text x="660" y="282" fill="#89b6cf" font-size="11">tunnr_vm::boot_test · captured serial · contract markers</text>
    </g>
    <g>
      <rect x="40" y="300" width="150" height="46" rx="8" fill="url(#chip)" stroke="#5a4a2b" stroke-dasharray="4 3"/>
      <text x="115" y="321" fill="#e8cfa0" text-anchor="middle" font-weight="700">iso</text>
      <text x="115" y="338" fill="#b79a6a" text-anchor="middle" font-size="11">bootloader-in-disk (new)</text>

      <line x1="190" y1="323" x2="636" y2="323" stroke="#2c5b76" stroke-width="1.5" stroke-dasharray="4 3" marker-end="url(#arrow)"/>
      <rect x="640" y="300" width="520" height="46" rx="8" fill="url(#muscle)" stroke="#c98a3c" stroke-dasharray="4 3"/>
      <text x="660" y="321" fill="#ffd9a8" font-weight="700">BOOT CONSOLE</text>
      <text x="792" y="321" fill="#dff1ff">· or → USB → bare metal</text>
      <text x="660" y="338" fill="#89b6cf" font-size="11">same boot_test path (*.iso → -cdrom) · fattest-dist end</text>
    </g>
  </g>

  <text x="40" y="372" fill="#6f97b1" font-size="12">kvm is NOT an output — it is a launch target. one artifact, declares which targets it supports.</text>

  <line x1="40" y1="392" x2="1160" y2="392" stroke="#143a52" stroke-width="1"/>

  <!-- ================= MACHINE SPINE ================= -->
  <text x="40" y="424" fill="#9fd4f0" font-size="16" font-weight="700">THE MACHINE SPINE — who owns what</text>

  <!-- apps band -->
  <rect x="40" y="444" width="1120" height="92" rx="12" fill="none" stroke="#244b63" stroke-dasharray="3 4"/>
  <text x="56" y="464" fill="#5f86a0" font-size="12">APPLICATIONS  (the tier you can't explain to mom)</text>

  <rect x="70" y="474" width="330" height="50" rx="9" fill="url(#chip)" stroke="#2b6f93"/>
  <text x="235" y="497" fill="#dff1ff" text-anchor="middle" font-weight="700">dwarves</text>
  <text x="235" y="514" fill="#89b6cf" text-anchor="middle" font-size="11">CI/CD forge · orchestrates · never boots a VM itself</text>

  <rect x="430" y="474" width="330" height="50" rx="9" fill="url(#chip)" stroke="#2b6f93"/>
  <text x="595" y="497" fill="#dff1ff" text-anchor="middle" font-weight="700">Skidbladnir</text>
  <text x="595" y="514" fill="#89b6cf" text-anchor="middle" font-size="11">airgap install · MachineController (deletes own qemu)</text>

  <rect x="790" y="474" width="340" height="50" rx="9" fill="url(#chip)" stroke="#2b6f93"/>
  <text x="960" y="497" fill="#dff1ff" text-anchor="middle" font-weight="700">build-thing UI</text>
  <text x="960" y="514" fill="#89b6cf" text-anchor="middle" font-size="11">build + launch buttons · deploy / console / logs</text>

  <!-- hub band: draupnir with spectrum -->
  <rect x="40" y="560" width="1120" height="112" rx="12" fill="url(#hub)" stroke="#3aa0cf"/>
  <text x="60" y="588" fill="#e4f5ff" font-size="18" font-weight="700">draupnir</text>
  <text x="60" y="608" fill="#bfe6ff" font-size="12">the boot / provisioning library — the THIN SEAM everything leans on. one BootSpec, fleet fan-out, seed, 3 backends.</text>

  <!-- spectrum ruler -->
  <rect x="60" y="624" width="1040" height="12" rx="6" fill="url(#spectrum)"/>
  <circle cx="60" cy="630" r="7" fill="#35c6f4" stroke="#e4f5ff"/>
  <circle cx="1100" cy="630" r="7" fill="#e08a3c" stroke="#ffe9cf"/>
  <text x="60" y="658" fill="#8fe0ff" font-size="12" font-weight="700">TUNNR — thinnest</text>
  <text x="60" y="672" fill="#6f97b1" font-size="10.5">OS-less · you own the kernel · direct-kernel boot (-kernel+-initrd)</text>
  <text x="1100" y="658" fill="#f0b878" font-size="12" font-weight="700" text-anchor="end">FAT DIST — fattest</text>
  <text x="1100" y="672" fill="#b79a6a" font-size="10.5" text-anchor="end">full distro · boots itself · bootloader-in-disk (no -kernel)</text>
  <text x="580" y="658" fill="#cfe7f5" font-size="11" text-anchor="middle">one ruler · same axis as direct-kernel ↔ bootloader-in-disk</text>

  <!-- muscle band: tunnr -->
  <rect x="40" y="696" width="1120" height="66" rx="12" fill="url(#muscle)" stroke="#2b6f93"/>
  <text x="60" y="724" fill="#e4f5ff" font-size="16" font-weight="700">tunnr</text>
  <text x="60" y="744" fill="#89b6cf" font-size="12">the muscle: QEMU/OVMF/KVM primitive (boot_test) + OS-less appliance semantics. already does BOTH boot models.</text>

  <!-- edges -->
  <g stroke-width="2" fill="none">
    <path d="M235,524 L235,558" stroke="#7fe3ff" marker-end="url(#arrow)"/>
    <path d="M595,524 L595,558" stroke="#7fe3ff" marker-end="url(#arrow)"/>
    <path d="M960,524 L960,558" stroke="#7fe3ff" marker-end="url(#arrow)"/>
    <path d="M600,672 L600,694" stroke="#7fe3ff" marker-end="url(#arrow)"/>
  </g>
  <text x="250" y="547" fill="#6f97b1" font-size="10">via jera</text>
  <text x="610" y="690" fill="#6f97b1" font-size="10">backend-tunnr</text>

  <text x="40" y="800" fill="#5f86a0" font-size="12">no cycle: draupnir→tunnr is one-way; tunnr→draupnir lives only in leaf crates (tunnr-demo, payloads). clean DAG.</text>
  <text x="40" y="818" fill="#5f86a0" font-size="12">all Rust · no shell · container=bollard · kvm=boot_test · holger caches artifacts · znippy seals (optional).</text>
</svg>