Local demonstration: simulated QKD supply and simulated hybrid key exchange. Both endpoints run in this browser, the key bank is accounting, and the hybrid's ML-KEM secret is random bytes standing in for a real exchange. Do not enter sensitive information.
Try it: messages are encrypted in your browser (Web Crypto AES-256-GCM, or a one-time pad with a Wegman–Carter tag), spend key from the simulated bank, and arrive after the light time; the sender's status changes only when the recipient's authenticated acknowledgment comes back.
Alice
Key bank:
Bob
Receives after the light time, then decrypts and checks the tag
Terminal: the messenger's key budget, line by line
Same arithmetic as qll/link/keyed_messaging.py (tests/test_lab_js.py).