qrcody
Standalone Python port of qrcody's styled QR code SVG rendering engine — square/rounded/dots/blob/bars/squircle pixel styles, styled finder eyes and pupils, gradients, and framed export (perimeter / scan-me / scan bands). No browser, no server — pure functions in, SVG string out.
This is a hand-port of src/lib/buildSVG.js from the qrcody web app. The
rendering logic itself has no DOM dependency in the original (it already runs
inside a Cloudflare Worker), so the two implementations produce visually
equivalent output, though exact numeric string formatting may differ slightly
(e.g. 500 vs 500.0) — SVG renderers treat these identically.
Install
uv add qrcody
# or, for PNG export too:
uv add "qrcody[png]"
PNG export uses cairosvg, which needs the native
Cairo library installed on the system (brew install cairo on macOS,
apt install libcairo2 on Debian/Ubuntu).
Library usage
from qrcody import DEFAULT, build_svg, build_framed_svg
settings = {
**DEFAULT,
"text": "https://example.com",
"pixels_style": "dots",
"eyes_style": "circle",
"frame": "scan-me",
"frame_text": "Scan me",
}
qr_svg = build_svg(settings)
framed = build_framed_svg(qr_svg, settings)
svg_string = framed["svg"] # framed["w"] / framed["h"] give the output dimensions
For PNG (requires the png extra):
from qrcody.png import svg_to_png
png_bytes = svg_to_png(svg_string, width=1000)
CLI
qrcody --url "https://example.com" --pixels squircle --frame perimeter -o qr.svg
qrcody --url "https://example.com" --pixels dots --eyes circle -o qr.png
Run qrcody --help for the full flag list — it mirrors the qrcody /api/qr
HTTP API parameters (see the qrcody repo's functions/api/qr.js and
public/openapi.yaml).
Settings dict
All keys from qrcody.DEFAULT (see defaults.py) are recognized;
unspecified keys fall back to their default. Notable ones:
| Key | Values |
|---|---|
pixels_style |
square / rounded / dots / blob / bars-h / bars-v / squircle |
eyes_style |
square / rounded / circle / leaf / squircle |
pupils_style |
square / rounded / circle / squircle |
corners_style |
none / round / extra-round / squircle |
frame |
none / perimeter / scan-me / scan |
correction_level |
L / M / Q / H |
Development
uv sync --extra png
uv run pytest
uv run ruff check .
Known gaps vs. the JS implementation
- Logo embedding (
logo/logo_scalesettings) is supported inbuild_svgthe same way as the JS version — pass a data URI aslogo. There is no server-side "fetch a logo URL" helper here (that lives in the qrcody Cloudflare Worker's SSRF-hardened fetch, which is deployment-specific and out of scope for this package). - No automated JS/Python golden-file parity test yet — the port was done by
hand against
src/lib/buildSVG.jsand verified with a matching unit test suite, but the two aren't diffed against each other in CI. If the JS renderer changes, this package needs a manual re-sync.
Note on the package name
This package is published as qrcody on PyPI, distinct from the qrcody
npm/web app it's ported from — there's no npm/PyPI namespace collision since
they're different registries.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qrcody-1.11.1.tar.gz.
File metadata
- Download URL: qrcody-1.11.1.tar.gz
- Upload date:
- Size: 10.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d072027c5bb0e01ca461fe09f428240d91f9284f15d10f3f4378e58962260b63
|
|
| MD5 |
305193c43cf4cf6a6593f1e3a72d73d0
|
|
| BLAKE2b-256 |
62d0e87f6b42c58c9fd1bc9fbfab91f4c514e6412260c3fd249f61e69e8edb5e
|
File details
Details for the file qrcody-1.11.1-py3-none-any.whl.
File metadata
- Download URL: qrcody-1.11.1-py3-none-any.whl
- Upload date:
- Size: 14.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6694f8d02df0a79324d630b21e3bb4e57bfbcd86f0941eba03096d643d32c46
|
|
| MD5 |
2dbbc14941c2b251ab707e674222bfe6
|
|
| BLAKE2b-256 |
019bf47b8407f561045da8bf97d83d03deeb05572bd7d71005f06893aebf46cc
|