Box-run demo
Try it now
See how to run a Scrollcase box with our guided scenario, all in a disposable cloud Linux environment. Every Scrollcase command and its result are shown in the terminal.
Start the guided demo
All from your browser, no setup needed
Prefer a real development environment?
Open the demo in GitHub Codespaces to get an instant VM with the repository ready to run and an easy walktrough:
Open in GitHub Codespaces
Runs the Linux x86_64 CPU demo using your GitHub Codespaces account.
Local setup
Building a box needs pixi and conda-pack. But consuming does not:
If you only want to see what a box is, and how to run it, try this public demo.
You can find the demo box GitHub release here.
Downloads
Download the demo for your system:
| macOS (Metal) | Linux (CPU) | Windows (CPU) |
|---|---|---|
macos-aarch64-metal | linux-x86_64-cpu | windows-x86_64-cpu |
NOTE
The file you download (eg. hello-box-1.0.0-macos-aarch64-metal.zip) is NOT the demo box — it is a container, named so you can tell which machine it is for, holding the box together with two ready-to-run examples.
The demo box is the .zip inside it under box/, next to its .release.json. Do not unzip that one: it's ready to run. Leave both named as they are and side by side, because that is how verify finds the box.
Run the box
Once you have downloaded the demo, follow these steps:
- Unpack the demo into a folder of its own:
unzip hello-box-1.0.0-<target>.zip -d scrollcase-demo
cd scrollcase-demobox/ holds 2 files: the demo box
.zipto run, and its matching.release.json. Beside it you already haverun-box.tsandrun_box.py— nothing to retype.
- Download the demo public key, next to the box rather than inside it:
mkdir keys
curl -o keys/example-signing-public.json \
https://raw.githubusercontent.com/suffro/scrollcase/main/examples/keys/example-signing-public.jsonor alternatively here's its GitHub link: example-signing-public.json
Why the key lives outside the box
A signature only proves where something came from if the key does not travel with it. Keeping the key in its own folder — and downloading it from the repository rather than the release — is the habit to carry into a real project, where the key will not be a demo key.
- Verify and run the box:
This path needs the CLI, and nothing else — no pixi, no conda-pack, no build:
npm install -g scrollcasescrollcase verify box/*.release.json --public-key keys/example-signing-public.json
scrollcase run box/*.release.json --public-key keys/example-signing-public.jsonThe
box/*.release.jsonabove is a real shell glob, not a placeholder — your shell replaces it with the one release document in the folder. PowerShell does not expand globs for a command like this, which is why it needsGet-ChildItem. Either way you can always type the file name you see after unzipping. You never name the box archive:verifyfinds it beside the release document, under the hash that document commits to.
What just happened
verify checks the signature, the archive's size and hash, the entry names and manifest agreement, and works on any machine. run extracts the box to a temporary directory and executes its entry point with the interpreter inside it — so it needs a machine matching the box's target. The box output makes that outcome explicit instead of presenting its temporary extraction paths as the demo:
Hello from inside a Scrollcase box!
signed -> verified -> relocated -> running
Success: the box's own Python runtime executed this program.
No dependencies were resolved or installed to make this run.
Runtime Python 3.11.15
Host Linux / x86_64The final two lines reflect the box you downloaded and the matching machine running it.
The demo key is a demo key
Those boxes are signed with a key that exists only for the example. It signs nothing else and no trust chain depends on it. A signature from it means the example is intact — nothing more.
- Check out the results, that's it.
At this point the folder looks like this — the box untouched in its own directory, the key in another, the runnable examples above both:
scrollcase-demo/
├── box/ # from the download, left exactly as it arrived
│ ├── <archive sha256>.zip
│ └── <document sha256>.release.json
├── keys/ # step 2, from the repository — never from the release
│ └── example-signing-public.json
├── run-box.ts # from the download
├── run_box.py # from the download
├── package.json # from the download
└── README.md # from the downloadEverything except keys/ came out of the one file you downloaded. The key is the deliberate exception, and the reason is above.