Demo Box
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. What it prints is sys.prefix, which is the point: the interpreter answering is the one from the box.
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.