blumeops/utils/qart
..
.gitignore
go.mod
go.sum
main.go
mise.toml
README.md

QArt Tuner

Generate QR codes whose data modules form a recognizable image.

This implements the QArt technique invented by Russ Cox. The trick: QR error correction gives some freedom in choosing bit values. By picking bits that satisfy the Reed-Solomon constraints and match a target image's brightness, the QR modules themselves draw a picture — no logo overlay, no center cutout.

This tool uses the rsc.io/qr library (BSD 3-clause) for QR layout, data encoding, and GF(256) arithmetic. The image-targeting algorithm — contrast-priority bit selection via GF(2) Gaussian elimination — is an original implementation based on the technique description in Russ Cox's blog post.

Quick start

# Launch the interactive web UI
QART_IMAGE=~/path/to/photo.png mise run serve

# Or with a custom URL and port
QART_URL=https://example.com QART_IMAGE=photo.png QART_PORT=9090 mise run serve

The web UI lets you adjust version, mask, rotation, x/y offset, and scale with live preview. Keyboard shortcuts: arrow keys (dx/dy), [/] (mask), -/= (version), r (rotate).

CLI usage

# Single image
mise x go -- go run . -url "https://docs.eblu.me" -image photo.png -out qart.png \
  -version 6 -mask 4 -dx 6 -dy 4 -scale 8

# All 8 mask variants
mise x go -- go run . -url "https://docs.eblu.me" -image photo.png -out qart.png -all-masks

Flags

Flag Default Description
-url (required) URL to encode in the QR code
-image (required) Source photo (PNG or JPEG)
-out qart.png Output file path
-version 6 QR version (1-8, higher = more modules = more detail)
-mask 0 QR mask pattern (0-7, affects visual texture)
-scale 8 Pixels per QR module
-rotation 0 Quarter turns (0-3)
-dx 0 Horizontal image offset (-15 to 15)
-dy 0 Vertical image offset (-15 to 15)
-dither false Enable Floyd-Steinberg dithering
-seed (random) RNG seed for reproducible output
-all-masks false Generate all 8 mask variants
-serve false Launch web UI instead of writing a file
-port 8088 Web UI port

Tips

  • Version controls QR density. Higher = more modules = finer image detail, but the code becomes harder to scan at small sizes.
  • Mask dramatically affects which pixels the algorithm can control. Try all 8 — the best one varies per image.
  • dx/dy offsets shift the image relative to the QR structure. Use this to avoid the central alignment dot landing on an eye (it makes you look unhinged).
  • The QR code uses error correction level L (lowest) to maximize the number of bits available for image rendering.

Credits

The QArt technique was invented by Russ Cox and described in his 2012 blog post QArt Codes. The rsc.io/qr library provides the QR code primitives this tool builds on. Thank you, Russ.

This tool was written by Claude Code (Opus 4.6) with direction from Erich Blume. The image-targeting algorithm is an original implementation based on the technique description — not a copy of rsc's reference implementation.