<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TinyComputers.io (Posts about bsd)</title><link>https://tinycomputers.io/</link><description></description><atom:link href="https://tinycomputers.io/categories/bsd.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 A.C. Jokela 
&lt;!-- div style="width: 100%" --&gt;
&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;&lt;img alt="" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/80x15.png" /&gt; Creative Commons Attribution-ShareAlike&lt;/a&gt;&amp;nbsp;|&amp;nbsp;
&lt;!-- /div --&gt;
</copyright><lastBuildDate>Mon, 06 Apr 2026 22:12:55 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Building Cross-Platform Rust Binaries: A Multi-Architecture Build Orchestration System</title><link>https://tinycomputers.io/posts/multi-operating-system-and-multi-architecture-build-orchestration-system.html?utm_source=feed&amp;utm_medium=rss&amp;utm_campaign=rss</link><dc:creator>A.C. Jokela</dc:creator><description>&lt;p&gt;When developing &lt;a href="https://baud.rs/QckusG"&gt;ballistics-engine&lt;/a&gt;, a high-performance ballistics calculation library written in Rust, I faced a challenge: how do I efficiently build and distribute binaries for multiple operating systems and architectures? The answer led to the creation of an automated build orchestration system that leverages diverse hardware (from single-board computers to powerful x86_64 servers) to build native binaries for macOS, Linux, FreeBSD, NetBSD, and OpenBSD across both ARM64 and x86_64 architectures.  Now, you are probably wondering why I am bothering to show love for the BSD Trilogy; the answer is simple: because I want to.  Sure they are a bit esoteric, but I ran FreeBSD for years as my mail server.  I still like the BSDs.&lt;/p&gt;
&lt;p&gt;This article explores the architecture, implementation, and lessons learned from building a production-grade multi-platform build system that powers &lt;a href="https://baud.rs/zuncyr"&gt;https://ballistics.zip&lt;/a&gt;, where users can download pre-built binaries for their platform with a simple curl command.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;curl --proto '=https' --tlsv1.2 -sSf https://ballistics.zip/install.sh | sh
&lt;/pre&gt;&lt;/div&gt;

&lt;div class="audio-widget"&gt;
&lt;div class="audio-widget-header"&gt;
&lt;span class="audio-widget-icon"&gt;🎧&lt;/span&gt;
&lt;span class="audio-widget-label"&gt;Listen to this article&lt;/span&gt;
&lt;/div&gt;
&lt;audio controls preload="metadata"&gt;
&lt;source src="https://tinycomputers.io/multi-operating-system-and-multi-architecture-build-orchestration-system_tts.mp3" type="audio/mpeg"&gt;
&lt;/source&gt;&lt;/audio&gt;
&lt;div class="audio-widget-footer"&gt;12 min · AI-generated narration&lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;The Problem: Cross-Platform Distribution&lt;/h3&gt;
&lt;p&gt;Rust's cross-compilation capabilities are impressive, but they have limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-compilation complexity: While Rust supports cross-compilation, getting it working reliably for BSD systems (especially with system dependencies) is challenging&lt;/li&gt;
&lt;li&gt;Native testing: You need to test on actual hardware to ensure binaries work correctly&lt;/li&gt;
&lt;li&gt;Binary compatibility: Different BSD versions and configurations require native builds&lt;/li&gt;
&lt;li&gt;Performance verification: Emulated builds may behave differently than native ones&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The solution? Build natively on each target platform using actual hardware or high-performance emulation.&lt;/p&gt;
&lt;h3&gt;Architecture Overview&lt;/h3&gt;
&lt;p&gt;The build orchestration system consists of three main components:&lt;/p&gt;
&lt;h4&gt;1. Build Nodes (Physical and Virtual Machines)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;macOS systems (x86_64 and aarch64) - Local builds&lt;/li&gt;
&lt;li&gt;Linux x86_64 server - Remote build via SSH&lt;/li&gt;
&lt;li&gt;FreeBSD ARM64 - Single-board computer (Raspberry Pi 4)&lt;/li&gt;
&lt;li&gt;OpenBSD ARM64 - QEMU VM emulated on x86_64 (rig.localnet)&lt;/li&gt;
&lt;li&gt;NetBSD x86_64 and ARM64 - QEMU VMs&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. Orchestrator (Python-based coordinator)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Reads build node configuration from &lt;code&gt;build-nodes.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Executes builds in parallel across all nodes&lt;/li&gt;
&lt;li&gt;Collects artifacts via SSH/SCP&lt;/li&gt;
&lt;li&gt;Generates SHA256 checksums&lt;/li&gt;
&lt;li&gt;Uploads to Google Cloud Storage&lt;/li&gt;
&lt;li&gt;Updates version metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. Distribution (ballistics.zip website)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Serves install script at https://ballistics.zip&lt;/li&gt;
&lt;li&gt;Hosts binaries in GCS bucket (&lt;code&gt;gs://ballistics-releases/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Provides version detection and automatic downloads&lt;/li&gt;
&lt;li&gt;Supports version fallback for platforms with delayed releases&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Hardware Infrastructure&lt;/h3&gt;
&lt;h4&gt;Single-Board Computers&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://baud.rs/1RRLno"&gt;Orange Pi 5 Max (ARM64)&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Role: Host for NetBSD ARM64 VM&lt;/li&gt;
&lt;li&gt;CPU: Rockchip RK3588 (8-core ARM Cortex-A76/A55)&lt;/li&gt;
&lt;li&gt;RAM: 16GB&lt;/li&gt;
&lt;li&gt;Why: Native ARM64 hardware for running QEMU VMs&lt;/li&gt;
&lt;li&gt;Host IP: 10.1.1.10&lt;/li&gt;
&lt;li&gt;VM IPs:&lt;/li&gt;
&lt;li&gt;NetBSD ARM64: 10.1.1.15&lt;/li&gt;
&lt;li&gt;OpenBSD ARM64 (native, disabled): 10.1.1.11&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://baud.rs/zn9Y3Y"&gt;Raspberry Pi 4 (ARM64)&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Role: FreeBSD ARM64 native builds&lt;/li&gt;
&lt;li&gt;CPU: Broadcom BCM2711 (quad-core Cortex-A72)&lt;/li&gt;
&lt;li&gt;RAM: 8GB&lt;/li&gt;
&lt;li&gt;Why: Stable FreeBSD support, reliable ARM64 platform&lt;/li&gt;
&lt;li&gt;IP: 10.1.1.7&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;x86_64 ("rig.localnet")&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Role: Linux builds, BSD VM host, emulated ARM64 builds&lt;/li&gt;
&lt;li&gt;CPU: Intel i9&lt;/li&gt;
&lt;li&gt;RAM: 96GB&lt;/li&gt;
&lt;li&gt;IP: 10.1.1.27 (Linux host), 10.1.1.17 (KVM host)&lt;/li&gt;
&lt;li&gt;VMs Hosted:&lt;/li&gt;
&lt;li&gt;FreeBSD x86_64: 10.1.1.21&lt;/li&gt;
&lt;li&gt;OpenBSD x86_64: 10.1.1.20&lt;/li&gt;
&lt;li&gt;OpenBSD ARM64 (emulated): 10.1.1.23&lt;/li&gt;
&lt;li&gt;NetBSD x86_64: 10.1.1.19&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Local macOS Development Machine&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Role: macOS binary builds (both architectures)&lt;/li&gt;
&lt;li&gt;Build Method: Local cargo builds with target flags&lt;/li&gt;
&lt;li&gt;Architectures:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aarch64-apple-darwin&lt;/code&gt; (Apple Silicon)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x86_64-apple-darwin&lt;/code&gt; (Intel Macs)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;A Surprising Discovery: Emulated ARM64 Performance&lt;/h3&gt;
&lt;p&gt;One of the most interesting findings during development was discovering that emulated ARM64 builds on powerful x86_64 hardware are significantly faster than emulated ARM64 on native ARM64 builds on single-board computers.&lt;/p&gt;
&lt;h4&gt;Performance Comparison&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Emulated ARM64 on ARM64: ~99+ minutes per build&lt;/li&gt;
&lt;li&gt;Emulated ARM64 on x86_64: 15m 37s ⚡&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The emulated build on rig.localnet (running QEMU with KVM acceleration) completed in about 6x less time than the native ARM64 hardware. This is because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The x86_64 server has significantly more powerful CPU cores&lt;/li&gt;
&lt;li&gt;QEMU with KVM provides near-native performance for many workloads&lt;/li&gt;
&lt;li&gt;Rust compilation is primarily CPU-bound and benefits from faster single-core performance&lt;/li&gt;
&lt;li&gt;The x86_64 server has faster storage (NVMe vs eMMC/SD card)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As a result, the native OpenBSD ARM64 node on the Orange Pi is now disabled in favor of the emulated version.&lt;/p&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;h4&gt;SSH Key-Based Authentication&lt;/h4&gt;
&lt;p&gt;Critical: The orchestration system requires passwordless SSH access to all remote build nodes. Here's how to set it up:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Generate SSH key (if you don't have one):&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh-keygen&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;ed25519&lt;span class="w"&gt; &lt;/span&gt;-C&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build-orchestrator"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Copy public key to each build node:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# For each build node&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;user@build-node-ip

&lt;span class="c1"&gt;# Examples:&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;alex@10.1.1.27&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Linux x86_64&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;freebsd@10.1.1.7&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# FreeBSD ARM64&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;root@10.1.1.20&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# OpenBSD x86_64&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;root@10.1.1.23&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# OpenBSD ARM64 emulated&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;root@10.1.1.19&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# NetBSD x86_64&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;root@10.1.1.15&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# NetBSD ARM64&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Test SSH access:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;user@build-node-ip&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uname -a"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Software Requirements&lt;/h4&gt;
&lt;p&gt;On Build Orchestrator Machine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.8+&lt;/li&gt;
&lt;li&gt;pyyaml (&lt;code&gt;pip install pyyaml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Google Cloud SDK (&lt;code&gt;gcloud&lt;/code&gt; command) for GCS uploads&lt;/li&gt;
&lt;li&gt;SSH client&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On Each Build Node:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rust toolchain (&lt;code&gt;cargo&lt;/code&gt;, &lt;code&gt;rustc&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Build essentials (compiler, linker)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;wget&lt;/code&gt;, or &lt;code&gt;ftp&lt;/code&gt; (for downloading source)&lt;/li&gt;
&lt;li&gt;Sufficient disk space (~2GB for build artifacts)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;BSD-Specific Requirements&lt;/h4&gt;
&lt;p&gt;NetBSD: Install curl via pkgsrc (native &lt;code&gt;ftp&lt;/code&gt; doesn't support HTTPS)&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# Bootstrap pkgsrc&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ftp&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;pkgsrc.tar.gz&lt;span class="w"&gt; &lt;/span&gt;http://cdn.netbsd.org/pub/pkgsrc/current/pkgsrc.tar.gz
tar&lt;span class="w"&gt; &lt;/span&gt;-xzf&lt;span class="w"&gt; &lt;/span&gt;pkgsrc.tar.gz
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/pkgsrc/bootstrap&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./bootstrap&lt;span class="w"&gt; &lt;/span&gt;--prefix&lt;span class="o"&gt;=&lt;/span&gt;/usr/pkg

&lt;span class="c1"&gt;# Install curl&lt;/span&gt;
/usr/pkg/bin/pkgin&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;update
/usr/pkg/bin/pkgin&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;curl
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;OpenBSD: Native &lt;code&gt;ftp&lt;/code&gt; supports HTTPS&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;pkg_add&lt;span class="w"&gt; &lt;/span&gt;rust&lt;span class="w"&gt; &lt;/span&gt;git
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;FreeBSD: Use pkg for everything&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;pkg&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;rust&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;curl
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;The ballistics.zip Website and Install Script&lt;/h3&gt;
&lt;h4&gt;How It Works&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://baud.rs/zuncyr"&gt;https://ballistics.zip&lt;/a&gt; serves as the primary distribution point for pre-built ballistics-engine binaries. The system uses:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;GCS Bucket:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gs://ballistics-releases/&lt;/code&gt; - Binary artifacts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CDN: Google Cloud CDN provides global distribution&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install Script: Universal installer that:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Detects OS and architecture&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Downloads appropriate binary&lt;/li&gt;
&lt;li&gt;Verifies SHA256 checksum&lt;/li&gt;
&lt;li&gt;Installs to &lt;code&gt;/usr/local/bin&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Usage&lt;/h4&gt;
&lt;p&gt;Basic installation:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-sSL&lt;span class="w"&gt; &lt;/span&gt;https://ballistics.zip/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bash
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Specific version:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-sSL&lt;span class="w"&gt; &lt;/span&gt;https://ballistics.zip/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bash&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;--version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.13.3
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Different install location:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-sSL&lt;span class="w"&gt; &lt;/span&gt;https://ballistics.zip/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bash&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;--prefix&lt;span class="w"&gt; &lt;/span&gt;~/.local
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Install Script Architecture&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;install.sh&lt;/code&gt; script intelligently handles:&lt;/p&gt;
&lt;p&gt;Platform Detection:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;uname&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'[:upper:]'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'[:lower:]'&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;uname&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ARCH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;x86_64&lt;span class="p"&gt;|&lt;/span&gt;amd64&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"x86_64"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;aarch64&lt;span class="p"&gt;|&lt;/span&gt;arm64&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"aarch64"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;*&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Unsupported architecture: &lt;/span&gt;&lt;span class="nv"&gt;$ARCH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;

&lt;span class="nv"&gt;PLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# e.g., "openbsd-aarch64"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Version Fallback:
If a requested version isn't available for a platform, the script automatically finds the latest available version:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# If openbsd-aarch64 0.13.3 doesn't exist, fall back to 0.13.2&lt;/span&gt;
&lt;span class="nv"&gt;AVAILABLE_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-sL&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$BASE_URL&lt;/span&gt;/versions.txt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^&lt;/span&gt;&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;&lt;span class="s2"&gt;:"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-d:&lt;span class="w"&gt; &lt;/span&gt;-f2&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Checksum Verification:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nv"&gt;EXPECTED_SHA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BINARY&lt;/span&gt;&lt;span class="s2"&gt;.sha256"&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;ACTUAL_SHA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;sha256sum&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BINARY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{print $1}'&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$EXPECTED_SHA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ACTUAL_SHA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Checksum verification failed!"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Build Orchestration System Deep Dive&lt;/h3&gt;
&lt;h4&gt;Configuration: build-nodes.yaml&lt;/h4&gt;
&lt;p&gt;The heart of the system is &lt;code&gt;build-nodes.yaml&lt;/code&gt;, which defines all build targets:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nt"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# macOS builds (local machine)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;macos-aarch64&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;local&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;aarch64-apple-darwin&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build_command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd /tmp &amp;amp;&amp;amp; rm -rf ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;curl -L -o v{version}.tar.gz https://github.com/ajokela/ballistics-engine/archive/refs/tags/v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;tar xzf v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cargo build --release --target {target}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/tmp/ballistics-engine-{version}/target/{target}/release/ballistics&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Linux x86_64 (remote via SSH)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;linux-x86_64&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;alex@10.1.1.27&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;x86_64-unknown-linux-gnu&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build_command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd /tmp &amp;amp;&amp;amp; rm -rf ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;wget -q https://github.com/ajokela/ballistics-engine/archive/refs/tags/v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;tar xzf v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;~/.cargo/bin/cargo build --release --target {target}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/tmp/ballistics-engine-{version}/target/{target}/release/ballistics&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# OpenBSD ARM64 emulated (FASTEST ARM64 BUILD!)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;openbsd-aarch64-emulated&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;root@10.1.1.23&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;aarch64-unknown-openbsd&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build_command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd /tmp &amp;amp;&amp;amp; rm -rf ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;ftp -o v{version}.tar.gz https://github.com/ajokela/ballistics-engine/archive/refs/tags/v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;tar xzf v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cargo build --release&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/tmp/ballistics-engine-{version}/target/release/ballistics&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# NetBSD x86_64 (HTTPS support via pkgsrc curl)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;netbsd-x86_64&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;root@10.1.1.19&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;x86_64-unknown-netbsd&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build_command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd /tmp &amp;amp;&amp;amp; rm -rf ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;/usr/pkg/bin/curl -L -o v{version}.tar.gz https://github.com/ajokela/ballistics-engine/archive/refs/tags/v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;tar xzf v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;/usr/pkg/bin/cargo build --release&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/tmp/ballistics-engine-{version}/target/release/ballistics&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Orchestrator Workflow&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;orchestrator.py&lt;/code&gt; script coordinates the entire build process:&lt;/p&gt;
&lt;p&gt;Step 1: Parallel Build Execution&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;build_on_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'local'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Local build&lt;/span&gt;
        &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;build_command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Remote build via SSH&lt;/span&gt;
        &lt;span class="n"&gt;ssh_command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"ssh &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; '&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;build_command&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;
        &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssh_command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Step 2: Artifact Collection&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;collect_artifacts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;binary_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"ballistics-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'local'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;shutil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'binary_path'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"./&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;binary_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Download via SCP&lt;/span&gt;
        &lt;span class="n"&gt;scp_command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"scp &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'binary_path'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; ./&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;binary_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scp_command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Step 3: Checksum Generation&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;generate_checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'rb'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;sha256&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;binary_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.sha256"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Step 4: Upload to GCS&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;upload_to_gcs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;bucket_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"gs://ballistics-releases/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt;

    &lt;span class="c1"&gt;# Upload binaries and checksums&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"gsutil -m cp ballistics-* &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bucket_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Set public read permissions&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"gsutil -m acl ch -u AllUsers:R &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bucket_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Update latest-version.txt&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'latest-version.txt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"gsutil cp latest-version.txt gs://ballistics-releases/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Running a Build&lt;/h4&gt;
&lt;p&gt;Dry-run (test without uploading):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;build-orchestrator
./build.sh&lt;span class="w"&gt; &lt;/span&gt;--version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.13.4&lt;span class="w"&gt; &lt;/span&gt;--dry-run
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Production build:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;./build.sh&lt;span class="w"&gt; &lt;/span&gt;--version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.13.4
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Output:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;Building&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ballistics&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="mf"&gt;.13.4&lt;/span&gt;
&lt;span class="o"&gt;===========================================&lt;/span&gt;

&lt;span class="n"&gt;Enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;macos&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;macos&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alex&lt;/span&gt;&lt;span class="mf"&gt;@10.1.1.27&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;freebsd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;freebsd&lt;/span&gt;&lt;span class="mf"&gt;@10.1.1.7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;openbsd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;emulated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="mf"&gt;@10.1.1.23&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netbsd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="mf"&gt;@10.1.1.19&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netbsd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="mf"&gt;@10.1.1.15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;Starting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parallel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builds&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;macos&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Building&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PID&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12345&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Building&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PID&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12346&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;macos&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;freebsd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;openbsd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;emulated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;⚡&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FASTEST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ARM64&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;Uploading&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//ballistics-releases/0.13.4/&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Uploaded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;binaries&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Uploaded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;checksums&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Updated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;

&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;complete&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;🎉&lt;/span&gt;
&lt;span class="n"&gt;Total&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Adding New Build Nodes&lt;/h3&gt;
&lt;h4&gt;Interactive Script&lt;/h4&gt;
&lt;p&gt;The easiest way to add a new node is using the interactive script:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;build-orchestrator
./add-node.sh
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This will prompt you for:
- Node name (e.g., &lt;code&gt;openbsd-aarch64-emulated&lt;/code&gt;)
- SSH host (e.g., &lt;code&gt;root@10.1.1.23&lt;/code&gt; or &lt;code&gt;local&lt;/code&gt;)
- Rust target triple (e.g., &lt;code&gt;aarch64-unknown-openbsd&lt;/code&gt;)
- Build commands (how to download and build)
- Binary location (where the compiled binary is located)&lt;/p&gt;
&lt;h4&gt;Manual Configuration&lt;/h4&gt;
&lt;p&gt;Alternatively, edit &lt;code&gt;build-nodes.yaml&lt;/code&gt; directly:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;your-new-platform&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;user@ip-address&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# or 'local' for local builds&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;rust-target-triple&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build_command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;# Commands to download source and build&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd /tmp &amp;amp;&amp;amp; rm -rf ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;curl -L -o v{version}.tar.gz https://github.com/...&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;tar xzf v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cargo build --release&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/path/to/compiled/binary&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Variables:
- &lt;code&gt;{version}&lt;/code&gt;: Replaced with target version (e.g., &lt;code&gt;0.13.4&lt;/code&gt;)
- &lt;code&gt;{target}&lt;/code&gt;: Replaced with Rust target triple&lt;/p&gt;
&lt;h4&gt;Setting Up a New VM&lt;/h4&gt;
&lt;p&gt;Example: OpenBSD ARM64 Emulated&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create VM on host:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;alex@rig.localnet
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/opt/bsd-vms/openbsd-arm64-emulated
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Create boot script:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;boot.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt; 'EOF'&lt;/span&gt;
&lt;span class="s"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="s"&gt;exec qemu-system-aarch64 \&lt;/span&gt;
&lt;span class="s"&gt;  -M virt,highmem=off \&lt;/span&gt;
&lt;span class="s"&gt;  -cpu cortex-a57 \&lt;/span&gt;
&lt;span class="s"&gt;  -smp 4 \&lt;/span&gt;
&lt;span class="s"&gt;  -m 2G \&lt;/span&gt;
&lt;span class="s"&gt;  -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \&lt;/span&gt;
&lt;span class="s"&gt;  -drive file=openbsd.qcow2,if=virtio,format=qcow2 \&lt;/span&gt;
&lt;span class="s"&gt;  -netdev bridge,id=net0,br=br0 \&lt;/span&gt;
&lt;span class="s"&gt;  -device virtio-net-pci,netdev=net0,romfile=,mac=52:54:00:12:34:99 \&lt;/span&gt;
&lt;span class="s"&gt;  -nographic&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
chmod&lt;span class="w"&gt; &lt;/span&gt;+x&lt;span class="w"&gt; &lt;/span&gt;boot.sh
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Create systemd service:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/systemd/system/openbsd-arm64-emulated-vm.service&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt; 'EOF'&lt;/span&gt;
&lt;span class="s"&gt;[Unit]&lt;/span&gt;
&lt;span class="s"&gt;Description=OpenBSD ARM64 VM (Emulated on x86_64)&lt;/span&gt;
&lt;span class="s"&gt;After=network.target&lt;/span&gt;

&lt;span class="s"&gt;[Service]&lt;/span&gt;
&lt;span class="s"&gt;Type=simple&lt;/span&gt;
&lt;span class="s"&gt;User=alex&lt;/span&gt;
&lt;span class="s"&gt;WorkingDirectory=/opt/bsd-vms/openbsd-arm64-emulated&lt;/span&gt;
&lt;span class="s"&gt;ExecStart=/opt/bsd-vms/openbsd-arm64-emulated/boot.sh&lt;/span&gt;
&lt;span class="s"&gt;Restart=always&lt;/span&gt;
&lt;span class="s"&gt;RestartSec=10&lt;/span&gt;

&lt;span class="s"&gt;[Install]&lt;/span&gt;
&lt;span class="s"&gt;WantedBy=multi-user.target&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;openbsd-arm64-emulated-vm.service
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;openbsd-arm64-emulated-vm.service
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Configure networking (assign static IP 10.1.1.23)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install build tools inside VM:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;root@10.1.1.23
pkg_add&lt;span class="w"&gt; &lt;/span&gt;rust&lt;span class="w"&gt; &lt;/span&gt;git
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Test SSH access:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;root@10.1.1.23&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cargo --version"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Add to build-nodes.yaml and test:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;./build.sh&lt;span class="w"&gt; &lt;/span&gt;--version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.13.3&lt;span class="w"&gt; &lt;/span&gt;--dry-run
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;GitHub Webhook Integration (Optional)&lt;/h3&gt;
&lt;p&gt;For fully automated builds triggered by GitHub releases:&lt;/p&gt;
&lt;h4&gt;1. Deploy Webhook Receiver to Cloud Run&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;build-orchestrator
gcloud&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;deploy&lt;span class="w"&gt; &lt;/span&gt;ballistics-build-webhook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--source&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--region&lt;span class="w"&gt; &lt;/span&gt;us-central1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--allow-unauthenticated&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--set-env-vars&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;GITHUB_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-secret-here
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;2. Configure GitHub Webhook&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Go to: https://github.com/yourusername/your-repo/settings/hooks&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add webhook:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Payload URL: &lt;code&gt;https://ballistics-build-webhook-xxx.run.app/webhook&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Content type: &lt;code&gt;application/json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Secret: Your webhook secret&lt;/li&gt;
&lt;li&gt;Events: Select "Releases" only&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;3. Test&lt;/h4&gt;
&lt;p&gt;Create a new release on GitHub, and the webhook will automatically trigger builds for all platforms!&lt;/p&gt;
&lt;h3&gt;Performance Metrics and Insights&lt;/h3&gt;
&lt;p&gt;From real-world builds of ballistics-engine v0.13.3:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Hardware&lt;/th&gt;
&lt;th&gt;Build Time&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;macOS aarch64&lt;/td&gt;
&lt;td&gt;Apple M1/M2&lt;/td&gt;
&lt;td&gt;45s&lt;/td&gt;
&lt;td&gt;Native Apple Silicon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOS x86_64&lt;/td&gt;
&lt;td&gt;Intel i7/i9&lt;/td&gt;
&lt;td&gt;30s&lt;/td&gt;
&lt;td&gt;Cross-compile on Apple Silicon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux x86_64&lt;/td&gt;
&lt;td&gt;Xeon/EPYC&lt;/td&gt;
&lt;td&gt;25s&lt;/td&gt;
&lt;td&gt;Fastest overall ⚡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FreeBSD aarch64&lt;/td&gt;
&lt;td&gt;Raspberry Pi 4&lt;/td&gt;
&lt;td&gt;6m 32s&lt;/td&gt;
&lt;td&gt;Native ARM64 hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenBSD aarch64 (emulated)&lt;/td&gt;
&lt;td&gt;x86_64 QEMU&lt;/td&gt;
&lt;td&gt;15m 37s&lt;/td&gt;
&lt;td&gt;⚡ FASTEST ARM64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenBSD aarch64 (native)&lt;/td&gt;
&lt;td&gt;Orange Pi 5 Max&lt;/td&gt;
&lt;td&gt;99+ min&lt;/td&gt;
&lt;td&gt;Disabled due to slower speed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NetBSD x86_64&lt;/td&gt;
&lt;td&gt;x86_64 VM&lt;/td&gt;
&lt;td&gt;3m 45s&lt;/td&gt;
&lt;td&gt;KVM acceleration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NetBSD aarch64&lt;/td&gt;
&lt;td&gt;Orange Pi VM&lt;/td&gt;
&lt;td&gt;8m 12s&lt;/td&gt;
&lt;td&gt;QEMU on ARM64 host&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Key Insights:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;x86_64 is fastest: Modern x86_64 CPUs dominate for single-threaded compilation&lt;/li&gt;
&lt;li&gt;Emulation wins for ARM64: x86_64 emulating ARM64 beats native ARM64 SBCs&lt;/li&gt;
&lt;li&gt;SBCs are viable: Raspberry Pi and Orange Pi work well for native builds, but slower&lt;/li&gt;
&lt;li&gt;Parallel execution: Running all 7 builds in parallel takes only ~16 minutes (longest pole is FreeBSD ARM64)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Building a custom multi-platform build orchestration system may seem daunting, but the benefits are substantial:&lt;/p&gt;
&lt;p&gt;→ Full control: Own your build infrastructure&lt;/p&gt;
&lt;p&gt;→ Native builds: Real hardware ensures compatibility&lt;/p&gt;
&lt;p&gt;→ Cost-effective: Low operational costs after initial hardware investment&lt;/p&gt;
&lt;p&gt;→ Fast iteration: Parallel builds complete in ~16 minutes&lt;/p&gt;
&lt;p&gt;→ Flexibility: Easy to add new platforms&lt;/p&gt;
&lt;p&gt;→ Learning: Deep understanding of cross-platform development&lt;/p&gt;
&lt;p&gt;The surprising discovery that emulated ARM64 on powerful x86_64 hardware outperforms native ARM64 single-board computers has practical implications: you don't always need native hardware for every architecture. Strategic use of emulation can provide better performance while maintaining compatibility.&lt;/p&gt;
&lt;p&gt;For projects requiring broad platform support (especially BSD systems not well-served by traditional CI/CD), this approach offers a reliable, maintainable, and cost-effective solution.&lt;/p&gt;
&lt;h3&gt;Architecture Diagram&lt;/h3&gt;
&lt;div class="mermaid"&gt;
graph TB
    subgraph "Trigger Sources"
        GH[GitHub Release&lt;br&gt;v0.13.x]
        MANUAL[Manual Execution&lt;br&gt;./build.sh]
    end

    subgraph "Build Orchestrator"
        ORCH[Python Orchestrator&lt;br&gt;orchestrator.py]
        CONFIG[Build Configuration&lt;br&gt;build-nodes.yaml]
    end

    subgraph "Build Nodes - Local"
        MAC_ARM[macOS ARM64&lt;br&gt;Apple Silicon&lt;br&gt;~45s]
        MAC_X86[macOS x86_64&lt;br&gt;Rosetta 2&lt;br&gt;~30s]
    end

    subgraph "Build Nodes - Remote x86_64"
        LINUX_X86[Linux x86_64&lt;br&gt;alex@10.1.1.27&lt;br&gt;~25s]
        FREEBSD_X86[FreeBSD x86_64&lt;br&gt;root@10.1.1.21&lt;br&gt;~4m]
        OPENBSD_X86[OpenBSD x86_64&lt;br&gt;root@10.1.1.20&lt;br&gt;~12m]
        NETBSD_X86[NetBSD x86_64&lt;br&gt;root@10.1.1.19&lt;br&gt;~3m 45s]
    end

    subgraph "Build Nodes - Remote ARM64"
        FREEBSD_ARM[FreeBSD ARM64&lt;br&gt;freebsd@10.1.1.7&lt;br&gt;~6m 32s]
        OPENBSD_ARM_EMU[OpenBSD ARM64&lt;br&gt;root@10.1.1.23&lt;br&gt;Emulated on x86_64&lt;br&gt;~15m 37s ⚡]
        NETBSD_ARM[NetBSD ARM64&lt;br&gt;root@10.1.1.15&lt;br&gt;~8m 12s]
    end

    subgraph "Artifact Collection"
        COLLECT[SCP Collection&lt;br&gt;Pull binaries from nodes]
        CHECKSUM[Generate SHA256&lt;br&gt;checksums]
    end

    subgraph "Distribution"
        GCS[Google Cloud Storage&lt;br&gt;gs://ballistics-releases/]
        WEBSITE[ballistics.zip&lt;br&gt;Install Script]
    end

    GH --&amp;gt;|webhook| ORCH
    MANUAL --&amp;gt;|CLI| ORCH
    CONFIG --&amp;gt;|reads| ORCH

    ORCH --&amp;gt;|SSH parallel builds| MAC_ARM
    ORCH --&amp;gt;|SSH parallel builds| MAC_X86
    ORCH --&amp;gt;|SSH parallel builds| LINUX_X86
    ORCH --&amp;gt;|SSH parallel builds| FREEBSD_X86
    ORCH --&amp;gt;|SSH parallel builds| OPENBSD_X86
    ORCH --&amp;gt;|SSH parallel builds| NETBSD_X86
    ORCH --&amp;gt;|SSH parallel builds| FREEBSD_ARM
    ORCH --&amp;gt;|SSH parallel builds| OPENBSD_ARM_EMU
    ORCH --&amp;gt;|SSH parallel builds| NETBSD_ARM

    MAC_ARM --&amp;gt;|binary| COLLECT
    MAC_X86 --&amp;gt;|binary| COLLECT
    LINUX_X86 --&amp;gt;|binary| COLLECT
    FREEBSD_X86 --&amp;gt;|binary| COLLECT
    OPENBSD_X86 --&amp;gt;|binary| COLLECT
    NETBSD_X86 --&amp;gt;|binary| COLLECT
    FREEBSD_ARM --&amp;gt;|binary| COLLECT
    OPENBSD_ARM_EMU --&amp;gt;|binary| COLLECT
    NETBSD_ARM --&amp;gt;|binary| COLLECT

    COLLECT --&amp;gt; CHECKSUM
    CHECKSUM --&amp;gt; GCS
    GCS --&amp;gt; WEBSITE

    style OPENBSD_ARM_EMU fill:#90EE90
    style LINUX_X86 fill:#87CEEB
    style GCS fill:#FFD700
    style WEBSITE fill:#FFD700
&lt;/div&gt;

&lt;h4&gt;Diagram Legend&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Green: Fastest ARM64 build (emulated on powerful x86_64)&lt;/li&gt;
&lt;li&gt;Blue: Fastest overall build (native Linux x86_64)&lt;/li&gt;
&lt;li&gt;Yellow: Distribution endpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Build Flow&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Trigger: GitHub release webhook or manual execution&lt;/li&gt;
&lt;li&gt;Parallel Execution: All enabled build nodes start simultaneously&lt;/li&gt;
&lt;li&gt;Collection: Orchestrator collects binaries via SCP&lt;/li&gt;
&lt;li&gt;Verification: SHA256 checksums generated for integrity&lt;/li&gt;
&lt;li&gt;Upload: Binaries and checksums uploaded to GCS&lt;/li&gt;
&lt;li&gt;Availability: Install script immediately serves new version&lt;/li&gt;
&lt;/ol&gt;</description><category>aarch64</category><category>arm64</category><category>automation</category><category>binary distribution</category><category>bsd</category><category>build systems</category><category>cargo</category><category>ci cd</category><category>cross platform</category><category>devops</category><category>emulation</category><category>freebsd</category><category>google cloud storage</category><category>kvm</category><category>linux</category><category>macos</category><category>netbsd</category><category>openbsd</category><category>orange pi</category><category>orchestration</category><category>parallel builds</category><category>qemu</category><category>raspberry pi</category><category>rust</category><category>single board computers</category><category>ssh</category><category>x86_64</category><guid>https://tinycomputers.io/posts/multi-operating-system-and-multi-architecture-build-orchestration-system.html</guid><pubDate>Fri, 21 Nov 2025 21:19:35 GMT</pubDate></item><item><title>How BSD's Licensing Issues Paved the Way for Linux's Rise to Prominence</title><link>https://tinycomputers.io/posts/how-bsds-licensing-issues-paved-the-way-for-linuxs-rise-to-prominence.html?utm_source=feed&amp;utm_medium=rss&amp;utm_campaign=rss</link><dc:creator>A.C. Jokela</dc:creator><description>&lt;div class="audio-widget"&gt;
&lt;div class="audio-widget-header"&gt;
&lt;span class="audio-widget-icon"&gt;🎧&lt;/span&gt;
&lt;span class="audio-widget-label"&gt;Listen to this article&lt;/span&gt;
&lt;/div&gt;
&lt;audio controls preload="metadata"&gt;
&lt;source src="https://tinycomputers.io/how-bsds-licensing-issues-paved-the-way-for-linuxs-rise-to-prominence_tts.mp3" type="audio/mpeg"&gt;
&lt;/source&gt;&lt;/audio&gt;
&lt;div class="audio-widget-footer"&gt;19 min · AI-generated narration&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The History of BSD: A Tale of Innovation, Litigation, and Legacy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://tinycomputers.io/images/freebsd_openbsd.webp" style="width: 480px; box-shadow: 0 30px 40px rgba(0,0,0,.1); float: left; padding: 20px 20px 20px 20px;"&gt;The history of Unix begins in the 1960s at Bell Labs, where a team of researchers was working on an operating system called Multics (Multiplexed 
Information and Computing Service). Developed from 1965 to 1969 by a consortium including MIT, General Electric, and Bell Labs, Multics was one of 
the first timesharing systems. Although it never achieved commercial success, it laid the groundwork for future operating systems.&lt;/p&gt;
&lt;p&gt;Ken Thompson, a researcher at Bell Labs, grew frustrated with the limitations of &lt;a href="https://baud.rs/jJ1JWF"&gt;Multics&lt;/a&gt; and began experimenting with his own operating system in 1969. Thompson's efforts led to the development of &lt;a href="https://baud.rs/rAYHwz"&gt;Uniplexed Information and Computing Service&lt;/a&gt; (Unix), initially developed on an old &lt;a href="https://baud.rs/kxzg3M"&gt;PDP-7 minicomputer&lt;/a&gt;. Unix was designed from scratch as a lightweight, efficient, and portable operating system that would be easy to use and maintain.&lt;/p&gt;
&lt;p&gt;In 1971, Dennis Ritchie joined Thompson's team at Bell Labs, bringing with him his expertise in programming languages. Together, they refined the design of Unix, incorporating many innovative features such as pipes for inter-process communication and a hierarchical file system. They also developed the &lt;a href="https://baud.rs/GBKeS7"&gt;C programming language&lt;/a&gt;), which became an integral part of Unix development.&lt;/p&gt;
&lt;p&gt;In 1973, the first public release of Unix was made available to universities and research institutions. The operating system quickly gained popularity due to its flexibility, portability, and robustness. As more researchers and developers began using Unix, a community formed around it, 
contributing modifications and improvements to the codebase.&lt;/p&gt;
&lt;p&gt;The late 1970s saw significant developments in Unix history. In 1977, Bell Labs released &lt;a href="https://baud.rs/G1q6Om"&gt;Version 6&lt;/a&gt; of Unix, which included many enhancements and laid 
the foundation for future versions. In 1979, Bill Joy and his team at the University of California, Berkeley (UCB) began working on their own version 
of Unix, dubbed BSD (&lt;a href="https://baud.rs/OpuqMv"&gt;Berkeley Software Distribution&lt;/a&gt;). The BSD branch would go on to influence many commercial Unix variants.&lt;/p&gt;
&lt;p&gt;Throughout the 1980s, Unix continued to evolve, with various vendors releasing their own versions. AT&amp;amp;T's System V and Sun Microsystems' SunOS were 
two prominent examples. Meanwhile, Richard Stallman launched the GNU Project in 1983, aiming to create a free and open-source operating system 
compatible with Unix. The project laid the groundwork for Linux, which would later become one of the most popular Unix-like systems.&lt;/p&gt;
&lt;p&gt;Unix has come a long way since its inception, with numerous variants emerging over the years. Today, its legacy can be seen in many modern operating 
systems, including Linux, macOS, and various commercial Unixes. Despite the emergence of new technologies, Unix remains an essential part of 
computing history, shaping the development of modern operating systems and inspiring future innovations.&lt;/p&gt;
&lt;p&gt;In 1992, &lt;a href="https://baud.rs/El8b50"&gt;AT&amp;amp;T filed a lawsuit against the University of California, Berkeley (UCB)&lt;/a&gt; (read this, it's prescient), alleging that the university had distributed copyrighted material without permission. The dispute centered around the distribution of the Berkeley Software Distribution (BSD) operating system.&lt;/p&gt;
&lt;p&gt;The controversy began when Bill Joy and his team at UCB modified and extended the original Unix codebase to create their own version, BSD. Although AT&amp;amp;T had released Unix under a permissive license that allowed users to modify and redistribute it, the company claimed that certain portions of the 
code were still proprietary and copyrighted.&lt;/p&gt;
&lt;p&gt;AT&amp;amp;T demanded that UCB cease and desist from further distributions of BSD, arguing that the university had exceeded its licensed rights under the 
original Unix agreement. The company claimed that it owned all rights to the Unix codebase and that any modifications or derivatives were still 
subject to AT&amp;amp;T's copyright.&lt;/p&gt;
&lt;p&gt;UCB responded by arguing that they had been given permission to distribute Unix under the terms of their original agreement with AT&amp;amp;T. They claimed 
that the modifications made to create BSD were transformative and did not infringe on AT&amp;amp;T's copyright. The university also argued that the disputed 
code was largely in the public domain, having been released under a permissive license.&lt;/p&gt;
&lt;p&gt;The lawsuit continued for several years, with both parties presenting extensive evidence and expert testimony. In 1994, Judge William Schwarzer of 
the United States District Court for the Northern Distric California issued a summary judgment ruling in favor of UCB.&lt;/p&gt;
&lt;p&gt;Judge Schwarzer held that AT&amp;amp;T had indeed released most of the disputed code under a permissive license, which allowed users to modify and distribute it without restriction. The court found that UCB's modifications to create BSD were transformative and did not infringe on AT&amp;amp;T's copyright. The 
judge also ruled that AT&amp;amp;T had failed to demonstrate any significant financial losses resulting from UCB's distribution of BSD.&lt;/p&gt;
&lt;p&gt;The ruling effectively ended the lawsuit, allowing UCB to continue distributing BSD without fear of further litigation. Although the decision was a major victory for UCB and the open-source community, it did not entirely settle the matter of Unix ownership rights.&lt;/p&gt;
&lt;p&gt;The rise of Linux as a dominant force in the world of operating systems can be attributed, in part, to the aftermath of AT&amp;amp;T's lawsuit against the University of California, Berkeley (UCB) over the distribution of the Berkeley Software Distribution (BSD). The lawsuit created a power vacuum in the Unix-like operating system market. As a result of the lawsuit, many developers who had been working on BSD projects began to look for alternative platforms.&lt;/p&gt;
&lt;p&gt;In 1991, Torvalds began working on his own operating system kernel, which would eventually become known as Linux. At the time, Torvalds was using &lt;a href="https://baud.rs/ttfY0J"&gt;Minix&lt;/a&gt;, a Unix-like operating system that was designed for educational purposes. However, he became frustrated with the limitations of Minix and decided to create his own operating system.&lt;/p&gt;
&lt;p&gt;As news of AT&amp;amp;T's lawsuit against UCB spread throughout the developer community, many programmers began to take notice of Linux as a potential alternative to BSD. Linux was still in its infancy at this point, but it had already gained a small following among developers who were impressed by 
its simplicity and flexibility. The fact that Linux was not derived from any proprietary codebase made it an attractive option for those who wanted 
to avoid the intellectual property disputes surrounding BSD.&lt;/p&gt;
&lt;p&gt;The turning point for Linux came in 1994, when AT&amp;amp;T's lawsuit against UCB finally settled. As a result of the settlement, many BSD developers began to switch to Linux as their platform of choice. This influx of experienced developers helped to accelerate the development of Linux, and it quickly gained popularity among users who were looking for a free and open-source alternative to commercial Unix operating systems.&lt;/p&gt;
&lt;p&gt;Today, Linux is one of the most widely used operating systems in the world, powering everything from smartphones to supercomputers. Its success can 
be attributed, in part, to the power vacuum created by AT&amp;amp;T's lawsuit against UCB over BSD. The fact that Linux was able to fill this void and become 
a major player in the Unix-like operating system market is a testament to the power of open-source software development.&lt;/p&gt;
&lt;p&gt;In 1993, shortly before the resolution of the AT&amp;amp;T lawsuit against the University of California, Berkeley , a group of developers led by Chris Demetriou, &lt;a href="https://baud.rs/fkEK1a"&gt;Theo de Raadt&lt;/a&gt;, and Charles Hannum announced the launch of NetBSD. The new operating system was born out of the ashes of the disputed BSD 
codebase, which had been at the center of the lawsuit.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://baud.rs/oozD02"&gt;NetBSD&lt;/a&gt; was designed to be a clean-room implementation of the BSD operating system, free from any potential copyright liabilities. The project's founders aimed to create an open-source OS that would not only be compatible with existing BSD systems but also provide a fresh start for the community. By using a new codebase developed entirely by volunteers, NetBSD avoided any potential intellectual property disputes and ensured a clear path forward.&lt;/p&gt;
&lt;p&gt;The initial release of NetBSD 0.8 in April 1993 was met with enthusiasm from the Unix community. The operating system quickly gained popularity due to its portability, stability, and flexibility. NetBSD's modular design allowed it to be easily adapted to run on various hardware platforms, including PC, SPARC, and PowerPC architectures.&lt;/p&gt;
&lt;p&gt;One of the key features that set NetBSD apart was its emphasis on portability and cross-compilation. The project's developers worked hard to ensure 
that the OS could be built and run on multiple architectures without modification. This approach allowed NetBSD to become one of the most widely 
supported operating systems in terms of hardware compatibility, making it an attractive choice for embedded systems, network devices, and other 
specialized applications.&lt;/p&gt;
&lt;p&gt;The launch of NetBSD also marked a turning point in the development of open-source software. The project's success demonstrated that a 
community-driven effort could produce high-quality code without reliance on proprietary or copyrighted material. This realization paved the way for 
future open-source projects, including Linux, which would go on to become one of the most widely used operating systems in the world.&lt;/p&gt;
&lt;p&gt;Throughout its history, NetBSD has continued to evolve and improve, with regular releases featuring new features, performance enhancements, and 
support for additional hardware platforms. Today, NetBSD remains a popular choice among developers and system administrators who value its stability, 
security, and flexibility. The project's legacy as a pioneering open-source operating system serves as a testament to the power of collaboration and 
innovation in software development.&lt;/p&gt;
&lt;p&gt;Since the forking of NetBSD, the major BSDs - &lt;a href="https://baud.rs/jgX4LE"&gt;FreeBSD&lt;/a&gt;, &lt;a href="https://baud.rs/Hnc4dv"&gt;OpenBSD&lt;/a&gt;, and NetBSD - have each carved out their own unique niches in the world of operating systems. One area where they have excelled is in serving as platforms for building network appliances and embedded systems. Their stability, security, and customizability make them ideal choices for developers who need to build reliable and secure devices that can be used in a variety of 
applications.&lt;/p&gt;
&lt;p&gt;FreeBSD, in particular, has become the go-to platform for building high-performance network servers. Its robust networking stack and support for 
advanced features like packet filtering and traffic shaping have made it a popular choice among companies that require fast and reliable data 
transfer. Additionally, FreeBSD's ports system makes it easy to install and manage software packages, which has helped to establish it as a premier 
platform for web hosting and other online applications.&lt;/p&gt;
&lt;p&gt;OpenBSD, on the other hand, has gained a reputation as one of the most secure operating systems available. Its focus on security and its default 
"secure by default" configuration make it an attractive choice for companies that require high levels of protection against cyber threats. 
Additionally, OpenBSD's clean codebase and lack of bloat have made it popular among developers who value simplicity and reliability.&lt;/p&gt;
&lt;p&gt;NetBSD has also found a niche as a platform for building cross-platform applications. Its focus on portability and its support for a wide range of 
architectures make it an ideal choice for developers who need to build software that can run on multiple platforms. Additionally, NetBSD's pkgsrc 
system provides access to over 20,000 packages, making it easy to find and install the software you need.&lt;/p&gt;
&lt;p&gt;Despite their differences, all three major BSDs share a commitment to stability, security, and customizability, which has helped them establish a 
loyal following among developers and users. They have proven themselves to be reliable and flexible platforms that can be used in a wide range of 
applications, from embedded systems to high-performance servers.&lt;/p&gt;
&lt;p&gt;Overall, the major BSDs have been able to fill a niche by providing robust, secure, and customizable platforms for building network appliances, 
embedded systems, and cross-platform applications. Their focus on stability, security, and customizability has made them popular choices among 
developers who value these qualities, and they continue to be relevant in today's computing landscape.&lt;/p&gt;
&lt;p&gt;OpenBSD has made significant contributions to the world of open-source software through its development of 
OpenSSH. Released in 1999, OpenSSH is a suite of secure network connectivity tools that provides encrypted communication sessions over the internet. 
It was originally designed as a replacement for the proprietary SSH (Secure Shell) protocol, which had become a de facto standard for remote access 
and file transfer.&lt;/p&gt;
&lt;p&gt;OpenSSH's popularity can be attributed to its robust security features, ease of use, and flexibility. The software has been widely adopted by system 
administrators and users alike, becoming an essential tool for managing servers, networks, and other computer systems remotely. OpenSSH's secure 
architecture and regular updates have made it a trusted solution for protecting against unauthorized access and data breaches.&lt;/p&gt;
&lt;p&gt;One of the key reasons for OpenSSH's widespread adoption is its open-source nature. By releasing the software under a permissive license (BSD), the 
OpenBSD team enabled developers to freely use, modify, and distribute the code. This allowed other operating systems, including Linux and macOS, to 
incorporate OpenSSH into their distributions, further increasing its reach and popularity.&lt;/p&gt;
&lt;p&gt;The impact of OpenSSH on the world of open-source software cannot be overstated. Its development and release have set a new standard for secure 
communication protocols, inspiring other projects to prioritize security and openness. Moreover, OpenSSH has become a model for collaborative 
open-source development, demonstrating how a small team can create a high-quality, widely adopted solution that benefits the entire community.&lt;/p&gt;
&lt;p&gt;Today, OpenSSH is maintained by a global community of developers, with contributions from numerous individuals and organizations. Its continued 
success serves as a testament to the power of open-source collaboration and the importance of secure communication protocols in modern computing. As 
one of the most widely used open-source software packages, OpenSSH remains an essential tool for system administrators, security professionals, and 
anyone who values secure online interactions.&lt;/p&gt;
&lt;p&gt;FreeBSD has played a significant role in the development of macOS, Apple's proprietary operating system for 
Mac computers. In 2001, Apple announced that it would be transitioning its Mac OS X operating system to a Unix-based platform, which was code-named 
"Darwin." The &lt;a href="https://baud.rs/6X9QNd"&gt;Darwin project&lt;/a&gt; was based on FreeBSD 4.3, with additional components from NetBSD and other open-source projects.&lt;/p&gt;
&lt;p&gt;The decision to use FreeBSD as the foundation for macOS was largely driven by Apple's desire to create a more stable and secure operating system. At 
the time, Mac OS X was struggling with issues related to memory management and process scheduling, which were causing problems for users and 
developers alike. By leveraging the mature and well-tested codebase of FreeBSD, Apple was able to address these issues and create a more robust 
platform for its operating system.&lt;/p&gt;
&lt;p&gt;The use of FreeBSD as the foundation for macOS also enabled Apple to tap into the existing Unix community and leverage the expertise and resources of 
open-source developers. Many of the core components of macOS, including the kernel, file systems, and network stack, are based on FreeBSD code. 
Additionally, Apple has contributed many changes and improvements back to the FreeBSD project over the years, which have benefited not only macOS but 
also other operating systems that use FreeBSD as a foundation.&lt;/p&gt;
&lt;p&gt;Today, macOS is still built on top of a Unix-based platform, with many components derived from FreeBSD. While Apple has made significant 
modifications and additions to the codebase over the years, the underlying foundation of FreeBSD remains an essential part of the operating system. 
This legacy can be seen in the many command-line tools and utilities that are available in macOS, which are similar to those found in FreeBSD and 
other Unix-based systems.&lt;/p&gt;
&lt;p&gt;The use of FreeBSD as a foundation for macOS has also had a broader impact on the world of open-source software. By leveraging an existing 
open-source project, Apple was able to reduce its development costs and focus on adding value through user interface design, application integration, 
and other areas that are unique to macOS. This approach has been emulated by other companies and projects, which have also used FreeBSD or other 
open-source operating systems as a foundation for their own products.&lt;/p&gt;
&lt;p&gt;The Berkeley Software Distribution (BSD) family of operating systems has a rich and storied history that spans over three decades. From its humble 
beginnings as a Unix variant at the University of California, Berkeley to its current status as a robust and reliable platform for various 
applications, BSD has come a long way. Through the development of NetBSD, OpenBSD, and FreeBSD, the BSD community has consistently demonstrated its 
commitment to stability, security, and customizability.&lt;/p&gt;
&lt;p&gt;The history of the BSDs is marked by significant milestones, including the development of OpenSSH and the use of FreeBSD as the foundation for macOS. These achievements have not only showcased the capabilities of the BSD platform but also contributed to the broader world of open-source software. As a result, the BSD family has earned its place alongside other major operating systems, such as Linux and Windows, as a viable option for users seeking reliability, flexibility, and customizability.&lt;/p&gt;
&lt;p&gt;The BSDs have established themselves as a cornerstone of the open-source software community, offering a robust and reliable platform that can be tailored to meet specific needs. As technology continues to evolve, it is likely that the BSD family will continue to play an important role in shaping the future of computing. With their strong focus on stability, security, and customizability, the BSDs are well-positioned to remain a vital part of the computing landscape for years to come.&lt;/p&gt;</description><category>bsd</category><category>computer history</category><category>licensing issues</category><category>linux</category><category>open-source software</category><guid>https://tinycomputers.io/posts/how-bsds-licensing-issues-paved-the-way-for-linuxs-rise-to-prominence.html</guid><pubDate>Sun, 11 Aug 2024 14:33:56 GMT</pubDate></item></channel></rss>