demo: StarshipOS in a browser -- a throwaway machine per visitor, as Zuse #118

Merged
rajames merged 2 commits from StarForth-v4.0.0 into master 2026-11-06 21:44:02 +00:00
Owner

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.

  • 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
  • CHANGELOG.md, when the demo is live
  • Nothing in this PR is a fix nobody asked for

🤖 Generated with Claude Code

https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2

## 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
rajames added 2 commits 2026-11-06 20:34:29 +00:00
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
Merge master into StarForth-v4.0.0: #110's merge commit, so the demo's PR is up to date
Build / Image RASPI (push) Successful in 4m57s
Build / Image PC (push) Successful in 4m43s
Build / Image MILKV (push) Successful in 4m28s
Build / v4 tests (32- and 64-bit cells) (push) Successful in 12m15s
Acceptance / Acceptance (pull_request) Successful in 16m5s
4f6a267be4
master's only commit not on the branch is 82804f27, the merge of #110, whose tree is the
branch's own 810d02eb.
rajames added 2 commits 2026-11-06 20:34:29 +00:00
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
Merge master into StarForth-v4.0.0: #110's merge commit, so the demo's PR is up to date
Build / Image RASPI (push) Successful in 4m57s
Build / Image PC (push) Successful in 4m43s
Build / Image MILKV (push) Successful in 4m28s
Build / v4 tests (32- and 64-bit cells) (push) Successful in 12m15s
Acceptance / Acceptance (pull_request) Successful in 16m5s
4f6a267be4
master's only commit not on the branch is 82804f27, the merge of #110, whose tree is the
branch's own 810d02eb.
rajames merged commit 0332a2e11e into master 2026-11-06 21:44:02 +00:00
Sign in to join this conversation.