Skip to main content

Headless QR decoder + TOTP authenticator Flask mini-service

Project description

qr-pypass logo

qr-pypass

qr-pypass is a lightweight, headless QR decoding and TOTP authentication service built for offline-first security workflows.

It is designed for air-gapped labs, red-team and blue-team tooling, automation pipelines, and environments where QR codes and 2FA need to be processed locally, without mobile devices or cloud dependencies.

Homepage: https://ginkorea.one Source: https://github.com/ginkorea/qr-pypass PyPI: https://pypi.org/project/qrpypass/


What It Does

With qr-pypass, you can:

  • Decode QR codes from screenshots or images
  • Detect and classify QR payloads (URL, text, otpauth)
  • Generate QR codes programmatically
  • Generate, import, store, and verify TOTP (RFC 6238) secrets
  • Run everything locally with no outbound network access

The project exposes both:

  • A Python API for direct integration
  • A Flask-based HTTP service with a minimal web UI

Core Features

QR Decoding

  • Detects multiple QR codes anywhere in an image
  • Uses OpenCV with multi-pass detection and tiling fallback
  • Returns bounding boxes, corner points, and decode method
  • Robust against screenshots, partial QRs, and large images

Payload Classification

Automatically classifies decoded payloads as:

  • url (with normalization)
  • text
  • otpauth (TOTP provisioning URIs)

TOTP / OTPAuth

  • Generate RFC-compliant otpauth://totp URIs
  • Import existing provisioning URIs
  • Secure local storage (optional encryption at rest)
  • Generate current TOTP codes
  • Verify TOTP codes with configurable time window

QR Generation

  • Generate QR codes for:

    • URLs
    • Arbitrary text
    • TOTP provisioning URIs
  • Control box size and border

  • Outputs PNG images

Service and Web UI

  • Flask-based HTTP API

  • Minimal web UI for:

    • Uploading screenshots or images
    • Viewing decoded QR payloads
    • Generating QR codes
    • Managing stored TOTP accounts

No JavaScript frameworks. No external assets.


Installation

From PyPI

pip install qrpypass

Python 3.9+ is required.


From Source (Development)

git clone https://github.com/ginkorea/qr-pypass.git
cd qr-pypass

python -m venv .qr-env
source .qr-env/bin/activate

pip install -r requirements.txt
pip install -e .

Running the Service

python -m qrpypass.service.run

By default, the service runs at:

http://127.0.0.1:5000

Configuration

The service can be configured using environment variables:

Variable Default Description
QRPYPASS_HOST 127.0.0.1 Bind address
QRPYPASS_PORT 5000 Port
QRPYPASS_DEBUG 0 Enable Flask debug mode
QRPYPASS_STORE_DIR ~/.qrpypass Local account storage directory

Web UI Routes

  • / – QR scan UI (upload screenshots or images)
  • /gen – QR payload and TOTP generator
  • /vault – Stored TOTP account management

API Overview

Health Check

GET /health

Scan QR Codes

POST /scan
Content-Type: multipart/form-data

Form fields

  • file (required) – image file
  • max_results (optional, default: 8)

Generate Payload

POST /gen/payload
Content-Type: application/json
{
  "kind": "url | text | totp",
  "params": { },
  "import": false,
  "passphrase": null
}

Generate QR Image

POST /gen/qr
Content-Type: application/json
{
  "payload": "...",
  "box_size": 8,
  "border": 2
}

Returns image/png.


TOTP Endpoints

Endpoint Description
POST /auth/import Import otpauth URI
GET /auth/list List stored accounts
GET /auth/code Get current TOTP code
POST /auth/verify Verify TOTP code

An optional passphrase encrypts the TOTP store at rest.


Python API Example

from qrpypass.qr import scan_and_classify

hits = scan_and_classify("screenshot.png")
for hit in hits:
    print(hit.classification.kind, hit.qr.payload)

Testing

End-to-end tests are included:

python test/api-test.py
python test/full_api_smoke.py
python test/test_totp_verify_flow.py

These cover:

  • QR generation → scan → classification
  • TOTP generation, import, code generation, and verification

Security Notes

  • Secrets are never logged
  • TOTP storage can be encrypted at rest
  • No outbound network access
  • Suitable for air-gapped or lab environments

Common Use Cases

  • QR extraction from screenshots (2FA enrollment, phishing analysis)
  • Headless TOTP verification in security tooling
  • Red-team and blue-team labs
  • Offline QR decoding pipelines
  • Local alternatives to mobile authenticator apps

License

MIT


Author

Josh Gompert https://ginkorea.one

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

qrpypass-0.2.0.tar.gz (15.7 kB view details)

Uploaded Source

Built Distribution

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

qrpypass-0.2.0-py3-none-any.whl (17.0 kB view details)

Uploaded Python 3

File details

Details for the file qrpypass-0.2.0.tar.gz.

File metadata

  • Download URL: qrpypass-0.2.0.tar.gz
  • Upload date:
  • Size: 15.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for qrpypass-0.2.0.tar.gz
Algorithm Hash digest
SHA256 1d7b361f6550ae595085e98972dd060d0c798c922a60d4d8eedc6c85d903c14d
MD5 654edeeb7e66e72d7e9d9f30962ea26b
BLAKE2b-256 5391431f55614dd0a89a676bf63f9f479411e43ccacc0b6a39ddf951abda1a60

See more details on using hashes here.

File details

Details for the file qrpypass-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: qrpypass-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 17.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for qrpypass-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 48614991f67fae9e0943a014e76f857efa57a44c70a034de7885380e56b5384d
MD5 ce57cfcc780659138d85fa8800b54956
BLAKE2b-256 f15aed75636db882819de491329c8f434bb483fe1c7da103795666843a205046

See more details on using hashes here.

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