The badge is the key
Every badge carries a vault: a 32-byte key written at the booth and a label saying which batch it belongs to. The stages that matter are sealed under keys derived from it, so a page opens them only with a badge plugged in — and a crawler, a script or a model reading this site gets ciphertext. The key never leaves the badge except into the page that asked.
This page reads a badge's vault and, for the booth, writes one. It needs WebHID — Chrome or Edge on a computer. A badge that already has a key only takes a new one, or an erase, while SELECT is physically held on it.
Provision — the booth
One key per event, the same on every badge: it is what the sealed stages are sealed
under (software/tools/seal-stage.mjs reads it from ALICE_STAGE_KEY).
Generate it once, keep it where the organisers keep secrets, and paste it here for each badge.
The label is free text, fifteen bytes, shown on the gate when the badge passes.
A blank badge takes its first key as it is. To re-key or erase one, hold SELECT on the badge while pressing the button — the state above says SELECT held when the badge sees it. The badge erases its sector after the transfer ends, so the read-back waits a moment.
The beacon — phones and other browsers
Where there is no WebHID the badge spells its vault on the stick axes. Hold SELECT + Y on the badge; the bar fills over about two seconds and the decoded serial and key appear below. This is what the gate on the stages and the range does on a phone, so it is the thing to try after a flash.
Notes
The vault is HID feature report 0xF1, one of the vendor reports the
DualShock 4 descriptor already declares, so the descriptor the badge presents is unchanged and
iOS keeps binding it. A real DualShock 4 answers the same report with zeros, and this page says
so. Wire formats: software/controller/src/vault.h; the browser side is
src/vault.js, proven against a model of the firmware by
software/tools/verify-badge.mjs.
On Linux, Chrome needs read/write access to the badge's /dev/hidraw*
node; a udev rule for 054c:09cc (the one Steam ships) is enough. The key lives in
the last 4 KB sector of the flash, which no firmware image reaches, so it survives reflashing.