Observed since 20 Oct, 19:42 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
AdmitiQ: signed, expiring QR/URL tokens with verify_pass, admit_daily, and admit_once. By LogicLitz — https://admitiq.logiclitz.org
Signed, expiring, revocable tokens for QR codes and ticket links.
A LogicLitz open-source project · Site: admitiq.logiclitz.org
| Website & tutorial | https://admitiq.logiclitz.org |
| Admission policies | https://admitiq.logiclitz.org/guides/admission-policies |
| Token playground | https://admitiq.logiclitz.org/debugger |
| Organization | https://logiclitz.org |
| Source | https://github.com/HyperXfury1873/admitiq |
| JavaScript twin | npm install admitiq |
A QR code is just text with better marketing. AdmitiQ puts an HMAC-signed (or ES256) token under the QR or inside a URL so a scan can prove: we issued it, it hasn’t expired, and — when you choose — how many times it may be admitted.
| Policy | Python | JavaScript | Typical use |
|---|---|---|---|
| Unlimited while valid | verify_pass | verifyPass | Halls, workshops, staff badges |
| Once per calendar day | admit_daily | admitDaily | Main gate; go home, return tomorrow |
| Once ever | admit_once | admitOnce | Coupons, single-session tickets |
Same QR for a multi-day event: halls call verify_pass; the main gate calls admit_daily.
Tokens are cross-language: issue in Python, verify in Node (and the reverse) with the same secret.
pip install admitiq
# optional extras
pip install "admitiq[qr]" # QR images (qrcode + Pillow)
pip install "admitiq[ec]" # ES256 / cryptography
pip install "admitiq[redis]" # Redis single-use / revoke store
from admitiq import issue, verify, issue_url, issue_qr
import os
SECRET = os.environ["ADMITIQ_SECRET"] # keep on the server only
token = issue({"ticket_id": "T-1001", "seat": "A12"}, ttl_seconds=3600, secret=SECRET)
url = issue_url(
"https://events.example/scan",
{"ticket_id": "T-1001"},
ttl_seconds=3600,
secret=SECRET,
)
# issue_qr(..., output_path="ticket.png") # needs admitiq[qr]
payload = verify(token, secret=SECRET)
print(payload["data"]) # {"ticket_id": ..., "seat": ...}
from admitiq.frameworks import fastapi_dependency, flask_require_token
See the Python guide and the Flask attendance example.
from admitiq import verify_with_secrets
payload = verify_with_secrets(token, secrets=[NEW_SECRET, OLD_SECRET])
from admitiq import issue, verify_pass, admit_daily
from admitiq.stores import MemoryRevocationStore # or Redis / Hosted
token = issue({"attendee_id": "A42"}, ttl_seconds=2 * 86400, secret=SECRET)
store = MemoryRevocationStore()
verify_pass(token, SECRET) # halls: unlimited
admit_daily(token, SECRET, store) # main gate: once per day
from admitiq.ec import generate_keypair, issue, verify
private_pem, public_pem = generate_keypair()
token = issue({"ticket_id": "T-1001"}, ttl_seconds=3600, private_key_pem=private_pem)
verify(token, public_key_pem=public_pem) # scanner holds public key only
| Resource | URL |
|---|---|
| Interactive tutorial | https://admitiq.logiclitz.org/tutorial |
| Admission policies (pass / daily / once) | https://admitiq.logiclitz.org/guides/admission-policies |
| Issue & verify playground | https://admitiq.logiclitz.org/debugger |
| Getting started | https://admitiq.logiclitz.org/getting-started |
| Python guide | https://github.com/HyperXfury1873/admitiq/blob/main/docs/python.md |
| Delivering tokens (QR / URL) | https://github.com/HyperXfury1873/admitiq/blob/main/docs/delivering-tokens.md |
| Key rotation | https://github.com/HyperXfury1873/admitiq/blob/main/docs/key-rotation.md |
| Security model | https://github.com/HyperXfury1873/admitiq/blob/main/SECURITY.md |
| Flask example | https://github.com/HyperXfury1873/admitiq/tree/main/examples/flask-attendance |
| What is AdmitiQ? | https://github.com/HyperXfury1873/admitiq/blob/main/docs/what-is-admitiq.md |
These also appear in the PyPI sidebar:
MIT © LogicLitz
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.4.0 | 20 Aug 2026 | 7 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 19:42 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:0a5b9f2dd23a73d3eae2bc98cf82a1313557a2ba1e7caccc8d835d607fd024c0