<?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 mips)</title><link>https://tinycomputers.io/</link><description></description><atom:link href="https://tinycomputers.io/categories/mips.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>Sun, 02 Aug 2026 00:48:16 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>What the Shelf of SBCs Actually Builds</title><link>https://tinycomputers.io/posts/what-the-shelf-of-sbcs-actually-builds.html?utm_source=feed&amp;utm_medium=rss&amp;utm_campaign=rss</link><dc:creator>A.C. Jokela</dc:creator><description>&lt;p&gt;A few weeks ago I wrote about &lt;a href="https://tinycomputers.io/posts/nothing-was-using-the-cores-three-idle-arm64-boards-one-ha-k3s-cluster.html"&gt;turning three idle Arm64 boards into a high-availability k3s cluster&lt;/a&gt;, and about the real reason the cluster existed at all: those boards had quietly been compiling native BSD binaries for a couple of projects that care, past all reason, about running on operating systems almost nobody uses. I named the projects in a single sentence and moved on. One was a small programming language. The other, I said, was "a ballistics engine written in Rust with the same ambition."&lt;/p&gt;
&lt;p&gt;A few people wrote to ask what that was. This is the answer — and a good excuse to show what the shelf actually builds now that it has grown.&lt;/p&gt;
&lt;h3&gt;The thing itself&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ballistics-engine&lt;/code&gt; is an external-ballistics library written in Rust. &lt;em&gt;External&lt;/em&gt; ballistics is the physics of a bullet after it leaves the muzzle and before it hits something: gravity pulling it down, air dragging on it, wind pushing it sideways, its own spin steering it in ways that surprise people. Mathematically it is an initial-value problem — you know the bullet's state at the muzzle and you integrate its equations of motion forward through the air — and the engine solves it with a fourth-order Runge–Kutta integrator, the same workhorse method you would reach for to march any well-behaved system of ODEs through time.&lt;/p&gt;
&lt;p&gt;The interesting part is not the integrator; it is everything the derivative function has to account for once you want the answer to match reality at eight hundred yards. Real drag is not a constant — it depends on the bullet's speed relative to the speed of sound, and it does something rude right around the transonic region where a supersonic bullet slows back through Mach 1. A spinning bullet does not simply fall; it drifts sideways, because gyroscopic precession tips its nose and the airflow answers. The Earth rotates underneath a shot that spends two full seconds in the air, so the Coriolis effect is real and, at distance, measurable. There is a Magnus force, an aerodynamic jump on the first instant of a crosswind, a slow decay of the spin itself. The engine models these as individually switchable pieces of physics, off by default because most of them matter only when you have already accounted for the ones that matter more.&lt;/p&gt;
&lt;p&gt;None of that is behind a wall. The library is on crates.io: &lt;code&gt;cargo add ballistics-engine&lt;/code&gt; and it is yours. &lt;code&gt;cargo install ballistics-engine&lt;/code&gt; gives you a command-line tool called &lt;code&gt;ballistics&lt;/code&gt; that will solve a single trajectory, run a Monte Carlo dispersion, find the sight-in that zeroes your rifle, back out a true muzzle velocity from drops you measured at the range, and build reticle and BDC hold tables for a scope. It compiles to WebAssembly, which is what drives the browser calculators at &lt;a href="https://ballistics.rs/"&gt;ballistics.rs&lt;/a&gt;. There are Python and Ruby bindings for people who would rather not touch Rust. It is free and open, and if you build something with it I would honestly like to hear about it.&lt;/p&gt;
&lt;h3&gt;The fleet has a day job, and the fleet has grown&lt;/h3&gt;
&lt;p&gt;In the cluster post, &lt;code&gt;kubectl get nodes&lt;/code&gt; returned three lines — three Arm boards, all of them serving as the control plane, all of them Arm64:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;NAME              STATUS   ROLES                VERSION
orangepi5-max     Ready    control-plane,etcd   v1.36.2+k3s1
raspberrypi-cm5   Ready    control-plane,etcd   v1.36.2+k3s1
rpi5              Ready    control-plane,etcd   v1.36.2+k3s1
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That was four weeks ago. Here is the same command today:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;NAME                STATUS                     ROLES                ARCH
orangepi5-max       Ready                      control-plane,etcd   arm64
raspberrypi-cm5     Ready                      &amp;lt;none&amp;gt;               arm64
rpi5                Ready                      control-plane,etcd   arm64
rpi5-2              Ready                      control-plane,etcd   arm64
nanopct6            Ready                      &amp;lt;none&amp;gt;               arm64
plebian-quartz64b   Ready,SchedulingDisabled   &amp;lt;none&amp;gt;               arm64
bosgame             Ready                      &amp;lt;none&amp;gt;               amd64
fileserver          Ready                      &amp;lt;none&amp;gt;               amd64
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The three originals are still there. What joined them tells the story. &lt;code&gt;rpi5-2&lt;/code&gt; is a second Raspberry Pi 5, and it took over an etcd seat: the quorum is still three voting members, but the Compute Module handed its vote to the new Pi and dropped back to being a plain worker, which is exactly the kind of quiet reshuffle a cluster should let you do without ceremony. &lt;code&gt;bosgame&lt;/code&gt; and &lt;code&gt;fileserver&lt;/code&gt; are &lt;code&gt;amd64&lt;/code&gt; — two x86-64 boxes — so the cluster stopped being an Arm monoculture and became mixed-architecture, which matters more than it sounds like when the whole point is building software for lots of machines. And &lt;code&gt;nanopct6&lt;/code&gt; is one regular readers will recognize, because I &lt;a href="https://tinycomputers.io/posts/friendlyelec-nanopc-t6n-review.html"&gt;reviewed that exact board&lt;/a&gt; — the FriendlyELEC NanoPC-T6N — a couple of weeks ago. The review unit did not go back on the shelf. It went into the rack.&lt;/p&gt;
&lt;p&gt;Underneath, the storage grew up too. The first cluster leaned on each node's local NVMe: gloriously fast, but it pins a stateful pod to one board, and if that board goes away, so does the pod's data. The cluster now runs Longhorn, which replicates block volumes across nodes, so a volume outlives the machine it happened to be sitting on. It is the difference between "the metrics live on the CM5" and "the metrics live on the cluster."&lt;/p&gt;
&lt;p&gt;And what all of this builds, for the ballistics engine specifically, is a thirteen-target release. The current version ships native binaries for Linux on x86-64, Arm64, RISC-V, and 64-bit MIPS; macOS on Intel and Apple Silicon; Windows; and FreeBSD, OpenBSD, and NetBSD, each on both x86-64 and Arm64. That is thirteen distinct platforms, plus a WebAssembly build for the browser.&lt;/p&gt;
&lt;p&gt;There is no single machine that can produce all thirteen, which is the whole reason a fleet earns its keep here. The Arm64 BSD binaries are built precisely the way the cluster post described: a privileged pod boots a real FreeBSD, OpenBSD, or NetBSD Arm64 guest under QEMU with KVM acceleration, compiles the engine inside it over SSH, copies the binary out, and powers the guest down — a whole operating system spun up for the length of one build and then gone. Those three Arm64-BSD artifacts even carry a provenance record now, a small signed note of what built them. The x86-64 BSDs are the same trick run against the VMs on the fileserver. RISC-V builds on an actual RISC-V board, because emulating it is slow enough to feel like a penalty. And 64-bit big-endian MIPS — a target the rest of the world has cheerfully forgotten — cross-compiles and then boots just far enough under emulation to prove the binary actually runs. A tag pushed to the release repository sets the whole fan-out going; some time later, thirteen binaries and their checksums are sitting on the release page.&lt;/p&gt;
&lt;h3&gt;Solving it backwards&lt;/h3&gt;
&lt;p&gt;Everything above is what I would call &lt;em&gt;forward&lt;/em&gt; ballistics: you give the engine a bullet, a velocity, an atmosphere, and a wind, and it tells you where the bullet goes. That is the well-understood direction, the initial-value problem you march forward in time.&lt;/p&gt;
&lt;p&gt;It is also not the question anyone actually asks at the loading bench. Nobody stands there wondering, given this precise load, where will it land? They stand there wondering the other way around. &lt;em&gt;I want it to land here — what gets me there?&lt;/em&gt; What powder, and how much of it, reaches this velocity? What barrel twist will stabilize this bullet? What overall length should I seat to? What is this bullet's ballistic coefficient, really, derived from its actual dimensions rather than a number on a box?&lt;/p&gt;
&lt;p&gt;Those are inverse problems, and inverse problems are the hard, interesting ones, because they rarely have a closed-form answer. You cannot solve them directly; you search — you run the forward model over and over, hunting for the input that produces the output you asked for. The engine has four of them, and they are the four questions above, in order: recommend a powder and charge for a target velocity, recommend an optimal twist rate, recommend a cartridge overall length, and calibrate a ballistic coefficient from a bullet's geometry.&lt;/p&gt;
&lt;p&gt;What keeps them honest rather than a plausible-looking toy is the drag model the search leans on. Instead of assuming every bullet behaves like the century-old standard projectile the classic drag tables were built around, the model is calibrated against Doppler-radar-measured drag curves — the actual deceleration of actual bullets, including the transonic region where the simple assumptions fall apart. A backward solver is only as trustworthy as the forward model inside its loop, and this is where that trust has to come from.&lt;/p&gt;
&lt;h3&gt;The split, stated plainly&lt;/h3&gt;
&lt;p&gt;So here is the arrangement, and I would rather just tell you than have you reverse-engineer it. The engine is free and open — the library, the command-line tool, the WebAssembly build, the Python and Ruby bindings, the whole forward solver and everything built on it. &lt;code&gt;cargo add ballistics-engine&lt;/code&gt; and you can compute trajectories, run Monte Carlo dispersions, true your velocity, and build hold tables until the sun burns out, no account required. That is &lt;a href="https://ballistics.rs/"&gt;ballistics.rs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The four inverse solvers are the one piece I put behind a subscription, &lt;a href="https://ballisticsinsight.com/"&gt;Ballistics Insight&lt;/a&gt;. They run as a service — in the browser, or from the very same CLI once you have logged in with a token from your account:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ballistics login
ballistics recommend-powder --cartridge "308 Winchester" --bullet-weight 175 --desired-velocity 2600
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Why those four and not the rest? Because they are the ones with real ongoing cost behind them — the calibrated data, the compute to run the searches — and because, candidly, someone has to pay for the shelf of single-board computers. If you shoot, it may be worth it to you. If you are here for the build and not the bullets, the engine is free and the fleet does not mind in the least.&lt;/p&gt;
&lt;p&gt;One honest word if you do use the powder solver: it gives you a &lt;em&gt;starting&lt;/em&gt; point, not a recipe. Every number it hands back is a place to begin working a load up carefully, against published data, over a chronograph, the slow and boring and safe way. The physics is good. The physics is not your reloading manual, and it will not pretend to be.&lt;/p&gt;
&lt;p&gt;The cluster post ended on the idea that the capacity had been there all along — it simply had not been told what to do. This is the other half of that thought. Those boards do not only run the fuzzers and hold the metrics and answer the occasional language model. A few times a month, they turn a single git tag into thirteen binaries of a real piece of software, for thirteen kinds of computer, most of which no sane person would build for by hand. That is the day job. The shelf earns its keep.&lt;/p&gt;</description><category>aarch64</category><category>ballistics</category><category>cli</category><category>cross-compilation</category><category>freebsd</category><category>homelab</category><category>k3s</category><category>mips</category><category>netbsd</category><category>openbsd</category><category>risc v</category><category>rust</category><category>wasm</category><guid>https://tinycomputers.io/posts/what-the-shelf-of-sbcs-actually-builds.html</guid><pubDate>Sat, 01 Aug 2026 17:00:00 GMT</pubDate></item></channel></rss>