Factorio Closed an Eleven-Year-Old Request With a VR Headset

Someone asked Wube for an ARM build in August 2015. Friday Facts #446 shipped one for the Steam Frame, and the simulation turned out to be the easy part.

Share

The Deep Dive

On Friday, the day Valve's Steam Frame launched, Wube Software posted Friday Facts #446 and shipped an ARM64 Linux build of Factorio. Steam users get it on the 2.1 experimental branch; everyone else gets a standalone download, headless server included.

Near the end of that post is a link to a forum thread dated August 18, 2015. It is three sentences long. Someone with a Raspberry Pi 2 wanted to know whether they could host a Factorio server on it. Eleven years and one month later, the answer is yes.

The request never got cheaper. The hardware did.

Sanqui's closing section is the honest one. Wube re-evaluated the port regularly, and the most recent wall was not code. It was that "supporting each new platform doesn't come for free in terms of development time, testing, and long term support", and for ARM they could not get a machine to run that testing on. Their hardware provider failed to source an Ampere Altra server. Hetzner's ARM64 virtual servers were constantly out of stock. They gave up on buying one, settled for cross-compiling from x86-64, and made a Raspberry Pi 5 the dedicated test runner.

That is the whole argument. The cost of a platform is not the compile. It is the box that runs your test suite against that platform every night for the next decade, and the person who reads the results. When you cannot buy that box, the correct answer is no, and Wube said no for eleven years rather than ship a build they could not stand behind. The Steam Frame is what changed. It is, in raiguard's phrase, "a Linux PC in disguise", Valve sent Wube two development kits, and suddenly there was both a machine to test on and a reason for the build to exist beyond a few hobbyists.

What was already paid

The part of a port you would expect to hurt is making the simulation agree, tick for tick, on two instruction sets. Factorio is lockstep multiplayer: every machine runs the identical simulation and only inputs cross the wire, so any place two chips disagree about a number becomes a desync in someone's game. A third architecture should have reopened all of that. It does not appear in Friday Facts #446 as a problem at all, and the reason is dated.

In September 2022, Friday Facts #370 covered the Nintendo Switch port, and Twinsen wrote that it was "the first time we had to make sure the game is deterministic between ARM and x86." His example is the kind that makes you wince: casting a double to an integer that does not fit is undefined behaviour in C++, and ARM and x86 hand back different values. He did not try to purge undefined behaviour from the codebase, which he called a fool's errand. He compared the game-state CRC on every tick of all 2,417 tests between the two architectures and fixed the ones that actually diverged.

Two months later, Friday Facts #371 announced native Apple Silicon support in 1.1.71, and StrangePan's write-up opens with "the first problem to solve was multiplayer determinism", followed immediately by the admission that he did not have to solve it, because Twinsen already had.

So in May, before 2.1 shipped, raiguard connected a Steam Frame devkit to the office LAN party and played most of a full playthrough on it alongside the x86 machines. His words: "largely thanks to prior efforts on the Nintendo Switch and Apple Silicon ports, we never experienced an ARM64 vs. x86 related desync." He later hosted a server from his Raspberry Pi, joined from the headset, and let strangers wander in as unwitting test subjects. Nothing desynced there either.

In the last Conveyor Belt I wrote about Captain of Industry moving its entire simulation to integer arithmetic so that results are bit-identical on every machine, and I called it a bigger fix than anything else in that patch. This is the receipt for that kind of work, four years out. A third architecture, and the simulation is a footnote. The hard part of the 2026 port was getting OpenSSL's Perl-driven build system to produce ARM64 static libraries.

Three numbers, and the small one is the interesting one

Wube ran one benchmark map, Klonan's 4k trains megagrid at 10k science per minute, on all three new targets. On the Steam Frame, native ARM64 is about 11% faster on the CPU than the x86 build running through FEX, Valve's translation layer. On a Raspberry Pi 5, native is 28% faster than x86 through box64. On an M1 Pro MacBook running Asahi Linux, which nobody at Wube owns and which works by "happy accident", native is 35% faster than FEX.

The 11% is the number to sit with. A translation layer that gets an x86 binary to within about nine tenths of native speed is the reason native ARM ports are rare: for most games the translated build is good enough and the port is a luxury. Factorio is not most games. Its ceiling is updates per second, the whole game is CPU-bound by the time anyone is building a megagrid, and 11% is the difference between a base that holds 60 UPS and one that has started to slide. FEX would have carried Factorio on the Frame without a port. Wube built one anyway, and for this game, 11% is not a rounding error.

The bill landed on people who will never own a Frame

Valve paved the Frame's lane for Windows games through Proton plus FEX and Android games through Lepton. Native ARM64 Linux games were further down the list, so Wube and Valve agreed on a workaround: ship both binaries to every Linux player and let a shell script pick one at launch. Linux players on experimental noticed the extra binary before the announcement did.

Factorio had targeted Steam Linux Runtime 1.0, which has no ARM64 version. Only 4.0 does, and the runtime version is a global switch, so every Linux Factorio player on Steam was moved to 4.0 to make one headset work. And the Steamworks SDK had to be updated to link against the ARM64 library. That update went out in 2.1.15 on August 24, and that evening a player with over 250 hours on experimental reported that their Steam achievements had stopped unlocking. 2.1.17 fixed it two days later.

I listed that hotfix in the last Conveyor Belt without knowing why the SDK had been touched. Now I do. A port for a device released on Friday broke achievements for x86 players in August. That is what a new platform costs, and it is why the number of platforms a studio can honestly support is smaller than the number it can compile for.

The version of this bill I pay

I build an idle RPG, Tideward, so read this last part knowing that.

Tideward runs on six Apple platforms: iPhone, iPad, Mac, Apple Watch, Apple TV and Apple Vision Pro. One architecture, one codebase, one save that follows you between them. On paper that is six platforms for the price of one compile, and the compile really is close to free. Everything Sanqui listed after the compile is not, starting with six operating systems shipping point releases on their own schedules, any one of which can take the app down on a device I was not holding that week.

The Mac build crashed on launch on macOS 26.6, twice in App Review, over a framework the app never names in its code. The same build ran clean on macOS 26.5. No compiler was ever going to find it. Only a machine on 26.6 could, which is exactly Wube's point about the Ampere server they could not buy. The platform is not the binary. The platform is the box.

So what I take from Friday Facts #446 is not the port. It is the eleven years of no. Wube did not ship a build they could not test just because people kept asking, and when they finally did, they wrote down what it cost and who paid. The Raspberry Pi owner from 2015 wanted to host a server. That is exactly what a Pi can do with this build, and nothing more, and they said that too.

Friday Facts #446, An ARM and a Frame | Friday Facts #370, The journey to Nintendo Switch | Friday Facts #371, Apple Silicon | The 2015 forum thread | 2.1.15 achievements report

P.S. Tideward is up for pre-order on the App Store for iPhone, iPad, Mac, Apple TV and Apple Vision Pro. Free to download, one $9.99 unlock. It launches February 11, 2027, and you can pre-order it now.


The Assembly Line is a free twice-weekly newsletter on factory builders and idle games. Read on the web at blog.manugames.com. Brought to you by Manu Games, makers of Tideward, a premium idle RPG for iPhone, iPad & Mac.