Virtual computer museum streamed into your browser. 90+ operating systems ready for your interaction instantly, spanning from 1970 to modern times — with highly optimized round-trip latency.
- Instant machines. Every guest launches from a full machine-state
checkpoint — RAM, devices and disk together — and waits paused; the first
visitor resumes it. A 1999 Alpha workstation is on screen in seconds.
(
docs/GUEST-TIERS.md) - A latency-first pipeline, end to end. Input rides WebTransport over
QUIC/UDP: pointer moves as unreliable datagrams, keys and clicks on their
own reliable streams, so no class ever blocks another. The whole host-side
critical path is Rust — one daemon per machine pulls a frame only when the
emulator reports damage, encodes it in-process with libx264 tuned for zero
latency, and ships one access unit per QUIC stream straight into
WebCodecs in the browser. Measured LAN click-to-photon: ~20–25 ms,
down from ~200 ms on the WebRTC stack it replaced.
(
docs/INPUT-LATENCY.md,docs/ARCHITECTURE.md) - Headless, low-overhead emulators. On the host-native path there is no X
server and no virtual display: QEMU, MAME, VICE, FS-UAE and es40 publish
their framebuffer straight into shared memory and take input over a control
socket. An idle desktop costs nothing to stream, and an unwatched machine is
paused outright. (
streamhost/docs/DESIGN.md,streamhost/docs/IDLE-PAUSE.md) - Absolute cursor positioning, on every kind of guest. Machines that only
understand relative mouse motion still put the cursor exactly under yours:
closed-loop readback from the graphics chip's registers (AIX, HP-UX), the
coordinate written into the place the OS keeps its own pointer (classic Mac
OS, BeOS, Rhapsody, DOS GUIs), or the guest's own X server warped from
outside (Amiga UNIX, the Linux and BSD fleet).
(
docs/lab/INPUT-DEBUGGING.md) - Patched emulators. MAME, QEMU, VICE, FS-UAE and es40 are all forked for shared-memory scanout, control-socket input, savestates and the device models these machines needed — see Emulator forks.
- A private 1990s internet. Period browsers reach an archived 1998 web;
ICQ, AIM and IRC connect the machines to each other and to a chatbot. No
route to today. (
docs/lab/RETRONET-BRIEF.md) - Walk in before signing up. A stranger gets five minutes at the controls
with no account at all. Register with a passkey to get a private clone of
Windows 3.11, OS/2 Warp or Rhapsody, reaped after the visit.
(
docs/lab/WALKIN-BRIEF.md)
No invitation or account is required to start: the front door puts a running
machine in front of you and gives you five minutes at the controls. Register
with a passkey for a private Windows 3.11, OS/2 Warp or Rhapsody clone.
An invited account opens the whole floor: every live machine, its write-up,
photographs of the real hardware, and the private 1990s internet. Sign-in uses
passkeys; there is no password. The public path — edge, gates, media plane — is
docs/PUBLIC-GALLERY.md.
Every machine on the floor, by the decade it came from. Each one is a link straight into the running system.
![]() DEC PDP-11 — RT-11, RSX-11M, RSTS/E · 1970 |
![]() Xerox Alto II · 1973 |
![]() DEC GT40 · 1973 |
![]() DEC PDP-11/70 — 2.11BSD · 1975 |
![]() Commodore PET 2001 · 1977 |
Rhapsody DR2. OmniWeb on the retronet's archived apple.com, May 1998.
The collection, grouped by decade. Every thumbnail is the machine's live framebuffer.
Exhibit notes. Each machine carries its lineage, hardware, period software and a caption for what is on screen.
The 3D museum (early access). A walkable floor where every monitor is a live machine.
One Rust daemon per machine: damage-gated capture from shared memory, QMP or an
in-guest agent; in-process x264 + Opus; WebTransport to the browser; input
injected back by whichever channel the guest supports. Behind it, a patched
emulator restored from a checkpoint. docs/ARCHITECTURE.md
is the map into the rest.
Every emulator behind the museum is forked and patched for headless, low-overhead streaming: a shared-memory framebuffer instead of a window, a control socket for paced input with an absolute mouse, savestates that actually restore, and the device models the guests needed. One commit per patch, on the pinned branch.
| Fork | Machines | What we patched | ≈ our diff |
|---|---|---|---|
Wnt/mame (irix, mpf2) |
SGI Indy, Microprofessor II | R4600 DRC cache, GIO64/Newport shared-memory framebuffer, a control-socket OSD module for headless input, PS/2 mouse and DMA/RTC fixes | 3.5k lines, 16 commits |
Wnt/qemu (kernel-hive, aix432-s3) |
Rhapsody, Mac OS 7.5.3, AIX, and the x86 fleet's patch set | dbus console fast-poll, a low-latency gallery-hid input device, Cirrus VGA vmstate and ROP fixes, PPC timebase migration, absolute pointer by writing guest RAM, closed-loop 1:1 pointer over the hardware cursor; AIX carries forward-ported S3 Trio and Matrox MGA models |
3.4k lines, 14 commits |
Wnt/vice (kernel-hive/integrated) |
C64, C128, CBM-II, PET, Plus/4, VIC-20 | headless control-socket input with keymap, shared-memory framebuffer, CRTC restore fixes, raw-PCM audio FIFO, in-process save/load state via a CPU trap | 4.4k lines, 14 commits |
Wnt/es40 (main) |
Windows 2000 Alpha, Tru64 UNIX | JIT chain-exit and compile fixes, working savestate and instant resume, paced absolute pointer with per-guest gain, live checkpoint verb, host-freeze absorption | 1.6k lines, 19 commits |
Wnt/fs-uae (kernel-hive/integrated) |
Amiga 1000, Amiga 3000, AmigaOS 3.5, Amiga UNIX | headless native entry (no window, GL or X), shared-memory framebuffer, control socket with mousehack re-arm after restore, 48 kHz PCM FIFO, clean SIGTERM | 1.5k lines, 11 commits |
Wnt/previous (kernel-hive) |
NeXTSTEP | shared-memory framebuffer, control-socket input paced to the keyboard floor, framebuffer republish and network down/up around checkpoints, raw-PCM audio FIFO | 1.7k lines, 12 commits |
Line counts are additions plus deletions in our own commits, measured against
each fork's merge base on 2026-09-09; upstream history the branches carry is not
counted. Design notes: docs/lab/ES40-FORK-BRIEF.md,
docs/lab/FSUAE-NATIVE-BRIEF.md,
the irix branch README,
streamhost/qemu-patches/.
The museum keeps a written account of every week. The latest one:
![]() Nokia 9300 Communicator |
![]() Multics |
![]() MIT ITS |
![]() 4.3BSD |
![]() IBM MVS 3.8j |
![]() Visi On 1.0 |
![]() Macintosh System 1.0 |
![]() PERQ POS G.7 |
The museum has its first phone: a Nokia 9300 Communicator from 2005, running its own firmware, opens on the page as a drawing of the open clamshell whose every key you can press. Type a letter in Documents, fill in a Sheet, or open Web and let its Opera browse the museum's archived web. Twenty more machines arrived in the same two weeks. The timesharing giants: Multics, ITS, Berkeley's 4.3BSD on a VAX-11/780, and IBM's MVS 3.8j on a 3270 terminal already logged into ISPF. Desktops from Pittsburgh to Tokyo: Visi On, the 1984 Macintosh System 1.0, the PERQ, the Apple IIGS, OS/2 1.3, Fujitsu's FM TOWNS, RISC OS 3.11, Native Oberon and General Magic's Magic Cap. Unix comes to the PC three ways, in Linux 0.12, Minix 2.0.4 and SCO Xenix; CP/M 2.2 and the MSX2 bring home computing, and a PalmPilot and Mac OS X 10.3 Panther carry the story into the 2000s.
Read weeks 7–8 in full, and every earlier week, in the full archive.
Every machine named here is live at kernelhive.madekivi.fi.
Five documents worth reading even if you never run any of this.
docs/ARCHITECTURE.md— the whole system in one sitting, including the awkward truth that for a large part of the collection the thing being captured is not the machine you came to see, but a bare Linux screen with a period emulator filling it edge to edge.docs/INPUT-LATENCY.md— where every millisecond between a key press and the pixel changing actually goes, stage by stage, measured rather than assumed, with what is left to win.docs/lab/nt4-cirrus-vmstate-trace-fix.md— a detective story: Windows NT 4 cold-boots to a clean desktop but always restores a blue-lavender one, and the culprit is a struct being read at the wrong offset. The before-and-after screenshots are indocs/lab/nt4-cirrus-vmstate-proofs/.docs/lab/RETRONET-BRIEF.md— the design for an internet that only goes backwards: what a 1997 browser needs, why every service is offline by construction, and what it costs to put a real machine on it without breaking it.docs/guests/irix.md— one machine, at length. An SGI Indy with no window, no virtual machine and no display at all, publishing frames into shared memory, and the long list of performance angles that were measured and closed — including the one closed in error and reopened.
If a word in any of these is unfamiliar,
docs/GLOSSARY.md is the whole vocabulary on one page.
Status — a home lab, not a product
Personal home-lab project. Everything here is built against one specific machine ("the lab box"), a single Proxmox host. The code is published for reading, reuse and reference; reproducing the full gallery is real work, and the docs describe that work rather than hiding it behind an installer.
The public gallery is reachable over the internet, but every session is authenticated — by passkey, on an invited account or a self-registered one.
Building the pieces
SPA (works on any machine with Node.js and npm):
cd spa
npm ci
npm run build # a placeholder src/data/credentials.ts is created
# automatically from credentials.example.ts
npm run dev # local dev serverstreamhost (Linux; links the system libx264):
sudo apt-get install libx264-dev libopus-dev libclang-dev pkg-config cmake
cd streamhost
cargo build --release
cargo testEverything else — station launchers, seed-image builders, labctl — assumes
the Proxmox lab host and its VM inventory. Follow the
reproduction quickstart for the required
external inputs and the ordered full-box runbook chain.
Hardware and scope
This assumes a single Linux host (Proxmox VE in production) with enough CPU and
RAM to run the fleet plus a per-station encoder. The kernelhive.madekivi.fi host
is a 6+ years old Supermicro server with no GPU. There is no cloud deployment path and no installer: the
reproduction quickstart separates what builds on
any machine (the SPA, the streamhost daemon) from what only makes sense
against the Proxmox host and its VM inventory (station launchers, seed-image
builders, labctl).
Repository layout
| Path | What lives there |
|---|---|
streamhost/ |
Rust streaming daemon (WebTransport + in-process libx264/Opus), per-station launchers, in-guest agents, crate docs in streamhost/docs/ — GPL-2.0-or-later |
spa/ |
The gallery front-end: Vite + React + TypeScript, WebCodecs decode |
tests/e2e-live/ |
Playwright suite that drives the live lab box — not run in CI |
scripts/ |
Ops tooling: labctl (unified box CLI), build-guests/ (per-OS seed-image builders), serve/ (HTTPS server for the SPA), dev/ (build-and-deploy loop) — indexed in scripts/README.md |
registry/ |
The station registry (source of truth for the roster) and per-station poster prose |
docs/ |
lab/ runbooks and hardware notes, guests/ per-OS notes, catalog/ media and software catalogs, history/ retired status docs — indexed in docs/README.md |
.github/workflows/ |
CI: Rust fmt/clippy/test, SPA lint/build, shell + Python + workflow lint |
Addresses and hostnames in these docs are placeholders
Every IP, hostname and domain shown in this repository (192.0.2.10,
labhost.lan, example.com, and similar RFC 5737 / .example values) is a
stand-in for the operator's real lab box, substituted throughout before this
repo was published. The one deliberate exception is the gallery's own public
address, kernelhive.madekivi.fi.
Placeholders are not wrong values to fix, and they will not resolve —
reproducing the stack means supplying your own via registry/local.env (see
registry/local.env.example and registry/README.md) and
the other gitignored, operator-local files listed in .gitignore. A deployment
left on the placeholders builds but is unreachable. Please don't submit patches
that put real addresses, hostnames or credentials back into the repo.
Contributing
See CONTRIBUTING.md: what can be built and verified
without lab hardware, the CI quality gate, and PR expectations.
License
The repository is MIT-licensed (see LICENSE), with two exceptions:
streamhost/is GPL-2.0-or-later (seestreamhost/LICENSE) because the daemon links the system libx264, which is GPL. The two trees are independent — nothing outsidestreamhost/links against it.- The historical photographs under
spa/public/posters/*/gallery/are third-party works reused under free licenses (public domain, CC0, CC BY, CC BY-SA) and remain their authors' property. Every image's author, license and source page is listed indocs/IMAGE-CREDITS.md; the licenses are enforced mechanically against the Wikimedia Commons API byscripts/tools/fetch-poster-gallery.py(re-check withmake poster-gallery-verify). CC BY-SA images carry share-alike obligations on modified redistribution.




































































































