The B-QR
One of our codes, drawn inside the B-Emblem™.
Every code on this page is drawn live by
qr/bqr.ts, the file a consumer vendors, and
every one of them opens this page.
Two versions
Full and Open
The real code fills the emblem's square body, with its own quiet zone clear. The two lobes either carry decorative modules on the code's own grid, or stay white inside a thick outline. The person chooses, and the choice is a fact about their phone, kept by the app.
Dark mode · v1.5.0
Two grounds
On a light page the B-QR is drawn on paper: the whole square is white, and it all but disappears. On a dark page that square becomes a white tile. The heart ground paints only the silhouette white and leaves the square around it transparent, so on a dark page the B-QR reads as a white heart.
- The code does not change between the two. It stays dark on white inside the body, quiet zone included, which is all a camera reads. Only what lies outside the silhouette changes.
- Never inverted. Light modules on a dark ground is the obvious dark-mode QR, and many phone scanners never try one. A dark ground is why the heart exists; it is never a reason to invert the code.
- The heart is for the screen only. A download, a print and the card stay on paper. A transparent PNG sent to another app may be flattened onto black, and the picture a person saves must look the same wherever they send it.
Decoded before it shipped. The test was
written down before it ran: the heart on
#0a0a0f must decode within 2 of 90
distorted cases of paper on white, in two decoders that
share no code. On 2026-10-06 it matched or beat paper in
every column (Full 82·86 against 81·85;
Open 86·87 against 86·87). The control,
the dark ground pressed up to the code so that no quiet
zone is left, failed all 90 cases in both decoders. That
failure is why the body sits inside the silhouette.
npm run bqr:test, §dark-ground.
Geometry
Measured, not eyeballed
The mark fills only 75.34% of its own viewBox and sits
high and right in it, so a B-QR centers the
painted box, never the viewBox. The body is the
largest square inside the silhouette, less the outline's
inner half. The diagrams and their numbers are drawn
from the constants bqr.ts
exports, and the decode matrix measures them again on
every run.
The rules
- Ours only. A B-QR opens one of our pages: a shop's Order here, a check-in, a referral, and every H3QR shown or downloaded. The H3QR names whom you thank; a B-QR is how that code is drawn.
- A bank's code is never a B-QR. KHQR and every EMVCo code stay plain. They are the bank's rail under the bank's own design standard, and a bank app's scan-from-gallery is the payment.
-
One color, at one darkness. The
code, the decoration and the outline are always one
color. In the apps it is
#14532d, chosen by a rule written before the sweep ran: the lightest green that prints at ISO/IEC 15415 grade A and decodes within 2 of 90 cases of near-black. The prediction was wrong, and the rule's pick was kept. -
A hue, never a darkness. A caller
may change the hue and never the darkness:
huedraws any color at that green's luminance, so a light hue comes out deep. That is why the B-QRs on this page can follow the mark's color and still print and scan like the green. Ink right now:. - Scanning outranks beauty. The code is sized for the standard four-module quiet zone. The Full B-QR lets its decoration in to one clear module, never zero, and never draws three dark decorative modules in a row, so the decoration cannot imitate a finder pattern.
- Deterministic. The decoration is seeded from the text, so the same address always draws the same picture, and the preview a person sees is the card they download.
- A drawing style, not a mark. B-QR is a public name for how a code is drawn, and it carries no ™.
The printable card
A title, the code large, one line saying what it is for, and the address in words. The code is drawn fresh at print size and is never a screen image stretched. The card is always on paper, in either theme.
What a consuming site takes
| File | What it supplies |
|---|---|
| qr/bqr.ts |
the drawing: the layout (pure), the
paint into any 2D context, and
bqrDataUrl for an
<img>
|
| qr/bqr-card.ts | the printable card around it |
| qrcode | the module matrix, from npm. The consumer installs it; the recipe loads it only when a code is drawn |
The call site
// on screen: follow the theme
img.src = await bqrDataUrl(url, { style, ground: dark ? "heart" : "paper" });
// a download or a print: always paper (the default)
const png = await bqrDataUrl(url, { style });
// another color family, at the green's darkness (this page passes the mark's color)
img.src = await bqrDataUrl(url, { style, hue: "#c8102e" });
ground is new in v1.5.0.
A consumer whose lock predates it draws paper
everywhere, which is still correct: a white tile on a
dark page scans exactly as well. The heart is the better
picture, not a fix.
hue is new in v1.6.0, and the apps
pass none. With no hue the drawing is the green,
byte for byte, so a consumer that never passes one never
changes.
Who draws it
HeartBank® Shops
(thank.heartbank.ceo) and the
Treasury app
(thank.heartbank.org), each vendoring the
recipe behind the same brand.lock guard as
the rest of this layer.