Nothing but NeXTSTEP
The emulator takes the first console at boot and keeps it. There is no desktop underneath and no console login to step past, so the machine is the thing it is pretending to be.
It starts straight into a NeXT machine under the Previous emulator. No desktop behind it, no login to get past, and nothing on the screen but the grey NeXT panel.
Run it as the user the machine will belong to, not under
sudo. It asks for your password once and says when it is done where
the admin answers.
What it is
The Pi disappears into the NeXT. Everything you would otherwise do at a keyboard happens in a browser on another machine.
The emulator takes the first console at boot and keeps it. There is no desktop underneath and no console login to step past, so the machine is the thing it is pretending to be.
Machines, disks and screens are things you pick up rather than values you type. It answers on the network, so the Pi never needs a keyboard of its own.
Each step records how to undo exactly what it changed, and an interrupt walks that record backwards. What was already on the machine is left where it was.
The admin
Nothing in it is redrawn. The icons come out of a NeXTSTEP 3.3 disk image, and the window furniture is cut pixel for pixel from a screenshot of the running system.
Install
You need a Raspberry Pi 5 and a card imaged with Raspberry Pi OS Lite, 64 bit, based on Debian 13. The script refuses anywhere else, because Previous needs SDL3 and no earlier release carries it.
Over SSH is the comfortable way, and it stays the way in afterwards: the emulator owns the screen once this is done.
It installs the emulator from its own signed archive, fetches a preinstalled NeXTSTEP 3.3 disk image, writes the configuration, installs the admin tool and hands the first console over.
curl -fsSL https://previous.li/install.sh | bash
It answers at http://<your-pi>.local:2342
and asks once for a token, which the script tells you how to read.
Before you run it
The script reads no file beside itself, so the one file on
GitHub is all of it. Nothing runs until the last line calls main,
which means a download cut short runs nothing at all.
An existing disk image, an existing configuration and a
startup entry that is already there are all left alone. Your own NeXTSTEP image
in ~/nextstep is found and used instead of a download.
An interrupt and a failing step both walk the record of changes backwards. Only this run's own changes are reversed, and a step that skipped itself has nothing to take back.