# QR heading: random-address edition

33 new full-field letter designs open exactly
`https://tpofgo4e1fzht23d4a667qa7u0iq2jc3.jdt.engineering`.
Open [the gallery](gallery.html) to browse all three variations of every glyph.
The old `heading-qr` and `heading-qr-v2` editions remain unchanged.

The URL is 56 bytes, 30 more than the former hub address. Version 3-L cannot
hold it. Version 5-L provides 50 bytes of adjustable post-terminator padding,
close to the previous version 4 design's 52 bytes. All payload bytes remain
fixed; the solver changes padding and computes exact Reed-Solomon parity.
The new solver explicitly validates capacity before constructing any matrix.

Version 5 has 37 modules and a four-module quiet zone: 45 modules per tile.
Display letters at **90px**, and the leading **QR at 135px**. These are exactly
two and three pixels per module. There is no interior alignment square, no
image cutout and no intentionally damaged module. Smooth uses 90%-width data
cells over the Panton letter target; structural cells remain full size.

All 176 candidates and validation results are retained in
[`archives/candidates.zip`](archives/candidates.zip). The selected 33 distinct
matrices all match independent Nayuki reconstruction. Both ZXing and OpenCV
decode all 33 at 90px, 135px and 360px, and at 90px with Gaussian blur of
0.35px and 0.5px. ZXing also reads all 33 after resizing to 81px and 99px;
OpenCV reads 0/33 and 4/33 respectively. Keep the intended integer module
sizes. These are digital checks, not a physical-phone guarantee.

The hub preserves the existing animation: one random title position changes
each second, excluding the previous position, with reduced motion respected.
`manifest.json` supplies the glyphs, variants, layout and validation evidence.

## Reproduce

Use the existing activated Python virtual environment. Work on the WSL native
filesystem for generation, then copy finished outputs into this repository.

```sh
source ../.venv/bin/activate
python src/prepare.py
esbuild src/generate.ts --bundle --platform=node --format=esm --outfile=src/generate.mjs
node src/generate.mjs
python src/validate.py
node src/gallery.mjs
```

`node src/browser-check.mjs` additionally tests the real heading module and CSS,
all 39 heading/brand images, mobile wrapping and random letter updates in an
isolated Chrome process. It uses the existing Playwright and zxing-wasm packages
in `../animated-full-field/node_modules`; `QR_BROWSER_DEPS` and `CHROME_PATH`
override those local tool locations. Results are in `browser-validation.json`.

Dependencies: Pillow, NumPy, OpenCV, zxing-cpp, CairoSVG and qrcodegen. The
existing Panton fonts are referenced from `../patterns/fonts/` and retain
their separate license. QR arithmetic provenance and MIT license are in
`src/core/`; the original whole-field solver is MIT.
