The problem
Paper outlives URLs
A printed QR is permanent; the page behind it rarely is. Dynamic codes route through a short link you keep control of, so reprinting is never the fix.
kaicorplabs.com / projects / qr-forge
project open source · self-hosted
The code on the poster never changes; you change where it points. Every scan counted by day and country, and nothing more personal than that.

The problem
A printed QR is permanent; the page behind it rarely is. Dynamic codes route through a short link you keep control of, so reprinting is never the fix.
Who it is for
Anyone who prints codes and wants to know if they get scanned — without buying a subscription that holds the codes hostage.
Your data
A scan stores the date, a validated country and a truncated user-agent — never the IP, never the referrer. Analytics are retained 365 days by default and then removed.
Honest limits
A printed code has to work for anyone, always, without a session — so /r/ links are public and stay that way. Creating and managing codes requires an account; a single instance runs it all.
Set QRFORGE_PUBLIC_URL before generating anything — that origin gets physically printed into every code. Any standard OIDC provider handles sign-in.
docker pull ghcr.io/ulzuhan/qr-forge:latest # or: clone the repo and `docker compose up -d --build` # DEPLOYMENT.md in the repository covers the rest.
The image is built from a tagged commit by CI, scanned for known vulnerabilities before release, and published with provenance and an SBOM. Or use ours: open qr.kaicorplabs.com and ask for an account — a person approves it.