kaicorplabs.com / projects / qr-forge

project open source · self-hosted

One printed QR. Any destination, forever.

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.

QR-Forge showing a dynamic QR code and its destination

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.

Who it is for

Menus, posters, events

Anyone who prints codes and wants to know if they get scanned — without buying a subscription that holds the codes hostage.

Your data

Scans, minimized on arrival

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

The redirect is public by design

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.

Run your own copy

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.