MakeQR
Generate QR codes for links, WiFi networks, contacts, calendar events, one-time-password keys, geo points, e-mail, SMS and plain text — from the command line or from Python.
Installation
pip install makeqr -U
Or, with uv:
uv tool install makeqr
To run it without installing anything:
uvx makeqr --help
Commands
| Command | Encodes | Example |
|---|---|---|
link |
A URL | makeqr link https://example.com |
wifi |
WiFi network access | makeqr wifi -s wpa -p s3cret HomeWiFi |
geo |
Geographic coordinates | makeqr geo -lat 55.75 -long 37.61 |
mailto |
A pre-filled e-mail | makeqr mailto -s Hello to@example.com |
sms |
A pre-filled SMS | makeqr sms -r +79876543210 -b 'on my way' |
tel |
A phone number | makeqr tel +79876543210 |
text |
Arbitrary text | makeqr text 'hello world' |
vcard |
A vCard 3.0 contact | makeqr vcard -f John -t +79876543210 Doe |
mecard |
A MeCard contact | makeqr mecard -f John -t +79876543210 Doe |
event |
A calendar event | makeqr event -s Standup -st 2026-09-01T12:00 |
otp |
A TOTP/HOTP key | makeqr otp -l alice@example.com -s BASE32SECRET |
The scheme may be omitted from a link — makeqr link example.com encodes
https://example.com.
Run makeqr <command> --help for the options of a single command.
Global options
Global options go before the command name:
makeqr -o code.png -e high wifi --security wpa --password s3cret HomeWiFi
| Option | Default | Description |
|---|---|---|
-o, --output |
— | Write the image here; the extension picks the format |
-e, --error-correction |
medium |
low, medium, quartile or high |
-s, --box-size |
8 |
Pixel size of a single QR module |
-b, --border |
1 |
Width of the quiet zone, in modules |
-v, --verbose |
off | Print the model and the encoded payload |
-q, --quiet |
off | Do not print the QR code to the terminal |
-V, --version |
— | Show the version and exit |
Without --output the code is only printed to the terminal. Passwords are
masked in verbose output.
Usage example
makeqr -v wifi --password TopSecret --security wpa HomeWiFi
__ __ _______ ___ _ _______ _______ ______
| |_| || _ || | | || || || _ |
| || |_| || |_| || ___|| _ || | ||
| || || _|| |___ | | | || |_||_
| || || |_ | ___|| |_| || __ |
| ||_|| || _ || _ || |___ | | | | | |
|_| |_||__| |__||___| |_||_______||____||_||___| |_|
Model: {"ssid":"HomeWiFi","security":"wpa","password":"**********","hidden":false}
Encoded: WIFI:S:HomeWiFi;P:***;T:WPA;;
██████████████ ████ ██████ ██ ██ ██████████████
██ ██ ██████████████ ██ ██ ██
██ ██████ ██ ██ ██ ██████ ██ ██████ ██
██ ██████ ██ ██████ ██ ██ ██ ██ ██████ ██
██ ██████ ██ ██ ████ ████ ██ ██████ ██
██ ██ ██ ████ ██████████ ██ ██
██████████████ ██ ██ ██ ██ ██ ██ ██ ██████████████
████ ██████ ██████
██ ██ ██████████ ██ ██████ ██ ██████████ ██
██ ██ ██ ████ ██████ ████████
██████████████ ████ ██ ████ ████ ██
██ ██ ████ ██ ██ ████ ████ ██ ██
██████ ██ ██ ██████████ ████ ████ ██
██ ██ ████ ██ ██ ██ ██████
████████ ████ ████████████ ████ ██ ██ ██
██ ██ ██ ██ ████████ ████ ██ ██
██ ██ ██ ████ ██ ██ ██ ██ ██
██ ██ ██ ████████ ██ ██ ██████████
██ ████ ████ ██ ████████ ██ ████ ██
██████ ████████████ ████████ ██ ██ ██
████ ██ ██ ██ ██████ ██████ ██████████ ██
██████ ██ ████ ██ ████ ██
██████████████ ██ ██████ ████ ██ ██ ██ ██
██ ██ ██ ██ ████ ██ ████
██ ██████ ██ ██ ██ ████ ██ ████████████████
██ ██████ ██ ██ ██ ████ ██ ██
██ ██████ ██ ██ ████████ ████
██ ██ ████ ████ ██ ██ ████ ████
██████████████ ████████ ██████████ ████████ ██ ██
Docker
docker run --rm ghcr.io/shpaker/makeqr:latest link https://t.me/shpaker
To keep the generated file, mount a directory and write into it:
docker run --rm -v "$PWD:/out" ghcr.io/shpaker/makeqr:latest -o /out/code.png link https://example.com
As a Python module
from makeqr import MakeQR, QRMailToModel
qr = MakeQR(
QRMailToModel(
to="foo@bar.baz",
subject="Awesome subject!",
)
)
data: bytes = qr.make_image_data() # PNG bytes
qr.save("mail.png") # or straight to a file
Every model exposes the payload it encodes:
>>> from makeqr import QRWiFiModel
>>> QRWiFiModel(ssid="HomeWiFi", security="wpa", password="TopSecret").qr_data
'WIFI:S:HomeWiFi;P:TopSecret;T:WPA;;'
Development
uv sync # create the environment
just lint # ruff, formatting and ty
just test # pytest with coverage
just fix # auto-fix and format
Optionally, install the git hooks with prek:
uv tool install prek
just hooks
License
Metadata
Release files for makeqr 5.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| makeqr-5.0.0.tar.gz | 14.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| makeqr-5.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 29.9 kB
Release files / makeqr-5.0.0.tar.gz
| Download URL | makeqr-5.0.0.tar.gz |
|---|---|
| Size | 14.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8c8ff5660bede62931dca5004ba660b5f99ebfa2dec34fbc356bbe83d7cba412
|
|
BLAKE2b-256 checksum How to use checksums |
fd6c7e565ea6beb568ed6e8e1dbf3fd8e8403280b0abe8d0aaacd4f7b98af129
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / makeqr-5.0.0-py3-none-any.whl
| Download URL | makeqr-5.0.0-py3-none-any.whl |
|---|---|
| Size | 15.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bedfa69ee417b14d511117a6029e471887039b6081bde6e661aff28892e3f884
|
|
BLAKE2b-256 checksum How to use checksums |
24a5547fb50bc7724a596d51c5c143ec256791799bd15d10bc7a425b21abb34f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|