StarshipOS in a browser: each visitor gets a StarshipOS machine of their own, logged in as a Zuse
minted for the demo, at its prompt 0.2 s after the page connects, gone when they leave. Captain
Bob, 2026-11-06: a terminal with QEMU amd64 for people to play with; "Mint Zuse for demo
console" (#111); "Make the most recent of builds that's green the demo"; a Try-it XWiki page
with the console embedded.
demo/ -- its README says how the pieces fit: the demo's own Zuse (mint-zuse.sh), the ISO, the
saved machine (make-snapshot.sh), the session (start-session.sh, console.py), the ttyd
service, an example Apache vhost and the XWiki page.
The Acceptance check runs on this PR by itself. The demo does not change the build: it only
uses what the build makes.
Logs from runs made by hand are committed in logs/: the demo Zuse's two minting boots, logs/20261106-192626 (genesis minted) and -192739 (identity confirmed)
Tested in a container (demo/README.md, Tested): the saved machine at POST 538/538 and [zuse@Hera] ok>; a session through ttyd's websocket, 3 4 + . -> 7 ok; QEMU gone at once on
hang-up, close and time-out
Not tested here: Apache (#115), several sessions at once (#116), the XWiki page (#117)
The record
docs/fabric/FABRIC-3.md -- the demo is not yet in the record
## What and why
StarshipOS in a browser: each visitor gets a StarshipOS machine of their own, logged in as a Zuse
minted for the demo, at its prompt 0.2 s after the page connects, gone when they leave. Captain
Bob, 2026-11-06: a terminal with QEMU amd64 for people to play with; *"Mint Zuse for demo
console"* (#111); *"Make the most recent of builds that's green the demo"*; a Try-it XWiki page
with the console embedded.
`demo/` -- its README says how the pieces fit: the demo's own Zuse (`mint-zuse.sh`), the ISO, the
saved machine (`make-snapshot.sh`), the session (`start-session.sh`, `console.py`), the ttyd
service, an example Apache vhost and the XWiki page.
Closes #112, #113, #114
## Acceptance
The **Acceptance** check runs on this PR by itself. The demo does not change the build: it only
uses what the build makes.
- [x] Logs from runs made by hand are committed in `logs/`: the demo Zuse's two minting boots,
`logs/20261106-192626` (genesis minted) and `-192739` (identity confirmed)
- [x] Tested in a container (`demo/README.md`, *Tested*): the saved machine at POST 538/538 and
`[zuse@Hera] ok>`; a session through ttyd's websocket, `3 4 + .` -> `7 ok`; QEMU gone at once on
hang-up, close and time-out
- [ ] Not tested here: Apache (#115), several sessions at once (#116), the XWiki page (#117)
## The record
- [ ] `docs/fabric/FABRIC-3.md` -- the demo is not yet in the record
- [ ] `CHANGELOG.md`, when the demo is live
- [x] Nothing in this PR is a fix nobody asked for
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Captain Bob, 2026-11-06: a terminal with QEMU amd64 for people to play
with; "Mint Zuse for demo console" (#111); "Make the most recent of
builds that's green the demo"; a Try-it XWiki page with the console
embedded.
demo/ -- see its README:
mint-zuse.sh a Zuse of the demo's own, as a stick: blank pair,
system=v3 genesis, a second boot to confirm, make
zusestick. Never anyone's real Zuse
build-iso.sh the amd64 ISO, packed as make qemu packs it
make-snapshot.sh boot once to [zuse@Hera] ok>, save the machine
start-session.sh one visitor: the saved machine resumed, ended on
hang-up, close or time-out
console.py joins the visitor's terminal only once the machine
runs; keys typed while it loads are discarded
qemu-args.sh the machine, shared by save and resume
starshipos-demo.service, apache-demo.conf, xwiki-try-it.xwiki
Every session is a copy: no network, read-only image, the Zuse stick's
writes discarded, QEMU's seccomp sandbox, an unprivileged user, a
fenced systemd unit, 30 minutes at most.
Tested here, from the sources master accepted (run 153): the Zuse
minted (logs/20261106-192626, -192739); the saved machine at POST
538/538 and [zuse@Hera] ok>; a session through ttyd's websocket ready
in 0.2 s, 3 4 + . -> 7 ok, 7 SQUARE . -> 49 ok; QEMU gone at once on
hang-up, close and time-out. Found and fixed on the way: a machine
saved stopped resumes stopped; a prompt matched as a regex; QEMU left
behind by a hang-up; keys lost while the machine loads. Not tested
here: Apache, several sessions at once (#116).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Captain Bob, 2026-11-06: a terminal with QEMU amd64 for people to play
with; "Mint Zuse for demo console" (#111); "Make the most recent of
builds that's green the demo"; a Try-it XWiki page with the console
embedded.
demo/ -- see its README:
mint-zuse.sh a Zuse of the demo's own, as a stick: blank pair,
system=v3 genesis, a second boot to confirm, make
zusestick. Never anyone's real Zuse
build-iso.sh the amd64 ISO, packed as make qemu packs it
make-snapshot.sh boot once to [zuse@Hera] ok>, save the machine
start-session.sh one visitor: the saved machine resumed, ended on
hang-up, close or time-out
console.py joins the visitor's terminal only once the machine
runs; keys typed while it loads are discarded
qemu-args.sh the machine, shared by save and resume
starshipos-demo.service, apache-demo.conf, xwiki-try-it.xwiki
Every session is a copy: no network, read-only image, the Zuse stick's
writes discarded, QEMU's seccomp sandbox, an unprivileged user, a
fenced systemd unit, 30 minutes at most.
Tested here, from the sources master accepted (run 153): the Zuse
minted (logs/20261106-192626, -192739); the saved machine at POST
538/538 and [zuse@Hera] ok>; a session through ttyd's websocket ready
in 0.2 s, 3 4 + . -> 7 ok, 7 SQUARE . -> 49 ok; QEMU gone at once on
hang-up, close and time-out. Found and fixed on the way: a machine
saved stopped resumes stopped; a prompt matched as a regex; QEMU left
behind by a hang-up; keys lost while the machine loads. Not tested
here: Apache, several sessions at once (#116).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What and why
StarshipOS in a browser: each visitor gets a StarshipOS machine of their own, logged in as a Zuse
minted for the demo, at its prompt 0.2 s after the page connects, gone when they leave. Captain
Bob, 2026-11-06: a terminal with QEMU amd64 for people to play with; "Mint Zuse for demo
console" (#111); "Make the most recent of builds that's green the demo"; a Try-it XWiki page
with the console embedded.
demo/-- its README says how the pieces fit: the demo's own Zuse (mint-zuse.sh), the ISO, thesaved machine (
make-snapshot.sh), the session (start-session.sh,console.py), the ttydservice, an example Apache vhost and the XWiki page.
Closes #112, #113, #114
Acceptance
The Acceptance check runs on this PR by itself. The demo does not change the build: it only
uses what the build makes.
logs/: the demo Zuse's two minting boots,logs/20261106-192626(genesis minted) and-192739(identity confirmed)demo/README.md, Tested): the saved machine at POST 538/538 and[zuse@Hera] ok>; a session through ttyd's websocket,3 4 + .->7 ok; QEMU gone at once onhang-up, close and time-out
The record
docs/fabric/FABRIC-3.md-- the demo is not yet in the recordCHANGELOG.md, when the demo is live🤖 Generated with Claude Code
https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2