Skip to main content

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_scale settings) is supported in build_svg the same way as the JS version — pass a data URI as logo. 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.js and 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

qrcody-1.11.3.tar.gz (10.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

qrcody-1.11.3-py3-none-any.whl (14.4 kB view details)

Uploaded Python 3

File details

Details for the file qrcody-1.11.3.tar.gz.

File metadata

  • Download URL: qrcody-1.11.3.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

Hashes for qrcody-1.11.3.tar.gz
Algorithm Hash digest
SHA256 e5b62f99d39a1c6d7bf1815294b2f0517f33da7d1fe42e5018d1e1ae4e1e965c
MD5 528b06cced2adf93dde77146e38ade7f
BLAKE2b-256 27aa484268af821aed572b8023987a62f206e573c1c322aef506404988d77d60

See more details on using hashes here.

File details

Details for the file qrcody-1.11.3-py3-none-any.whl.

File metadata

  • Download URL: qrcody-1.11.3-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

Hashes for qrcody-1.11.3-py3-none-any.whl
Algorithm Hash digest
SHA256 ef7f5942a60cb6873c131de686c2cae53b23826a4358be21ad79f47bcb69df91
MD5 d56d653460e1e87593bb5f2533ee58e7
BLAKE2b-256 d8b2402894eb973db10f1fb73dfa3d29ff743d2c2e4f95e5c4c73648a746448c

See more details on using hashes here.

Release history Release notifications | RSS feed

1.12.1

2 files

1.12.0

2 files

This release

1.11.3 This release

2 files

1.11.2

2 files

1.11.1

2 files

1.8.1

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page