Compatibility
What CI actually proves, per engine — and what still needs a human with two phones.
Every claim in the first table is exercised by CI on every commit: an offer created in one browser context must decode to identical state in a fresh one, per engine.
| Feature | Chromium | Firefox | WebKit |
|---|---|---|---|
| URL-fragment transfer across contexts | Tested in CI | Tested in CI | Tested in CI |
| deflate-raw compression | Tested in CI | Tested in CI | Tested in CI |
| Compression Streams are Baseline since May 2023. Without them, encoding degrades to uncompressed artifacts — tested too. | |||
| Adversarial decoding (bombs, bad flags, bad versions) | Tested in CI | Tested in CI | Tested in CI |
| Fragment scrubbed from history after receive | Tested in CI | Tested in CI | Tested in CI |
Server runtimes
encodeHandoff / decodeHandoff run anywhere with TextEncoder and
Compression Streams — Node 18+, Deno, Bun, and edge workers all qualify.
The browser conveniences no-op gracefully where location and history
do not exist.
Real devices — the honest gap
QR scanning lives in physical reality: cameras, glare, cracked screens. CI cannot prove it, so this matrix ships as pending until measured against the live demo:
| Path | Status |
|---|---|
| Laptop → phone | pending manual verification |
| Phone → laptop | pending manual verification |
| iPhone → Android | pending manual verification |
| Android → iPhone | pending manual verification |
The qrFriendly threshold (1,000 artifact characters) encodes published
scanning research; the measured device numbers will replace it here when
the matrix is run.