Skip to main content

Zero-dependency QR code generator optimized for URLs

Project description

url2qr

Zero-dependency QR code generator optimized for URLs. Parallel implementations in Python and Rust, verified to produce bit-exact identical output.

Features

  • Byte mode encoding (required for URLs with lowercase letters)
  • EC-L error correction (7% recovery, optimized for clean screen display)
  • Versions 1-6 (up to 134 characters)
  • Fixed mask pattern (no scoring overhead)
  • Terminal output with Unicode half-blocks

Installation

Python (pip)

pip install url2qr

Python (conda)

conda install -c mcg url2qr

Rust (cargo)

cargo install url2qr

Or add to your Cargo.toml:

[dependencies]
url2qr = "0.1"

Usage

Python

from url2qr import generate_qr, qr_to_terminal

# Display in terminal
print(qr_to_terminal("https://example.com"))

# Get raw matrix (list of lists, 1=dark, 0=light)
matrix = generate_qr("https://example.com")

Rust

use url2qr::{generate_qr, qr_to_terminal};

let matrix = generate_qr("https://example.com").unwrap();
let output = qr_to_terminal("https://example.com", 4, false).unwrap();
println!("{output}");

CLI

# Python
python url2qr.py "https://example.com"

# Rust
cargo run -- "https://example.com"

Vendoring

The Python module (url2qr.py) is designed to be vendored directly into larger projects. Simply copy the single file into your project. It is licensed under BSD 3-Clause and may be freely vendored into any other BSD 3-Clause software without credit or attribution.

Development

Prerequisites

  • Python 3.9+ with pytest and qrcode (test dependency)
  • Rust 1.70+ (MSRV)

Setup

# Python
pip install -e ".[test]"
pre-commit install

# Rust
cd rust && cargo build

Running Tests

# Python tests (validates against qrcode reference package)
pytest test_url2qr.py -v

# Rust tests (unit + integration with embedded reference matrices)
cd rust && cargo test

# Cross-language validation (regenerate vectors and compare)
python test-vectors/generate.py
cd rust && cargo run --bin dump_vectors > /tmp/rust_vectors.json
# Compare the two JSON files

Linting

# Python
pre-commit run --all-files

# Rust
cd rust && cargo fmt --check && cargo clippy -- -D warnings

Cross-Language Verification

Both implementations are verified to produce bit-exact identical QR matrices for all test URLs. The test-vectors/ directory contains shared test vectors generated from the Python implementation (which is itself validated against the qrcode reference package). CI runs cross-validation on every push.

Constraints

  • Maximum URL length: 134 characters
  • Only supports byte mode (URLs with lowercase require this)
  • Fixed to EC-L and mask pattern 0

Acknowledgment

This module was developed by Michael Grant from scratch using Claude. There are quite a few more capable QR code libraries in existence, most notably the qrcode module used to drive our unit tests. This module does not fork these other libraries; instead it was constructed from first principles with significantly reduced functionality in order to support a particular embedded use case.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

url2qr-0.1.0.tar.gz (6.3 kB view details)

Uploaded Source

Built Distribution

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

url2qr-0.1.0-py3-none-any.whl (6.6 kB view details)

Uploaded Python 3

File details

Details for the file url2qr-0.1.0.tar.gz.

File metadata

  • Download URL: url2qr-0.1.0.tar.gz
  • Upload date:
  • Size: 6.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for url2qr-0.1.0.tar.gz
Algorithm Hash digest
SHA256 100d0094c3963c8b36b3cb9e4d6ad366d7897515cfd8b7a9e319147d383e9753
MD5 ed31983de9d4330de2ac2fa10bd65151
BLAKE2b-256 2883833ff6b5fea06646c18ba43076098497d072c824b0049d6ce817c4058861

See more details on using hashes here.

Provenance

The following attestation bundles were made for url2qr-0.1.0.tar.gz:

Publisher: release-python.yml on Anaconda-Sandbox/url2qr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file url2qr-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: url2qr-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 6.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for url2qr-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2020ff0ffd50ce1905c6cb30f13376b751dc324cda063e997bee949803be2f29
MD5 15d3616e1911b4b827683fa555f9e665
BLAKE2b-256 f27999666d9a9d4ae76fc9f169cd6ad51cd6d40b314e2da242bf51d1ce995192

See more details on using hashes here.

Provenance

The following attestation bundles were made for url2qr-0.1.0-py3-none-any.whl:

Publisher: release-python.yml on Anaconda-Sandbox/url2qr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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