The modernQR platform
The full stack behind a printed code: brand studio, links that never die, scan analytics, and an API. Open source, MIT.
01How it works
Create codes that work forever
01Design your style
Pick your ink, module shape and corner style once. That kit becomes your look.
02Create new codes
Every code you make inherits the kit. Export SVG or PNG, no watermark, no limits on static codes.
03Update links anytime
Repoint a code after it is printed. The code on the wall never changes, only where it sends people.
04Track scan analytics
Every scan by day, country, city, device and referrer. Rolled up daily, honest about bots.
02Features
Our platform
03Studio
Design your perfect brand
The real engine under a real light: turn a dial and the object follows. Everything else waits in the studio, free.
Scannability instrument
Every kit scores against the real engine as you design. All the combos on this panel read 100.
Logo knockout
Drop a mark in the center. The engine carves its space and holds error correction above the floor.
Print-ready export
SVG and PNG, sRGB inks, quiet zone baked in. No watermark at any tier.
Free, no account required
04Brand kits
Every code syncs instantly
Set your kit once. Edit it anytime: every attached code re-renders in the same breath, from menu tents to ticket stubs.
Emberkit
- ink
- #131316#ffffff#90daff
- paper
- #ffffff#18181b#04131d
- modules
- rounded · 0.88square · 1.00circle · 0.78
- eyes
- leafsquarecircle
- attached codes
- 4
One kit, every surface
Modules, eyes, ink, and logo live in the kit. Attach any code and it prints on brand, from a menu tent to a poster.
Edits propagate instantly
Save a change and every attached code re-renders in place. Reprints always pick up the current look, and scans are never touched.
Old looks stay safe
Keep a legacy kit and its codes keep the old style. Detach a code and it freezes exactly as printed, never restyled.
05Dynamic links
Update a destination anytime
Print the code once. Change where it goes as often as you like.
Retarget anytime
Point a printed code somewhere new in seconds. Unlimited on both plans, never a numeric cap.
Never cached
A 302 with no-store, never a 301. Every scan asks us where to go, so an edit is never stuck in someone's browser.
Live at the edge
Changes reach the redirect Worker in seconds, five minutes worst case, on Cloudflare's network.
Your code never dies
Free codes are never deactivated, and a downgrade never breaks a printed code.
06Access controls
Control who can visit
Put a password on a code, give it an end date, or pause it outright. The printed code never changes. What changes is who gets through.
All clear
No controls in the way. The scan forwards in one hop, never cached.
This code is password-protected.
Enter the password to continue.
/p/K7M2X9A
Password
ProHashed with scrypt, checked server-side. The destination never appears in the gate's HTML.
This code isn't live right now.
The person who printed it may have paused it, or it hasn't been claimed yet.
/u/K7M2X9A
Pause
Free·Expiry
ProPaused and expired codes park here, indistinguishable from unclaimed ones. By design: a scan never reveals why.
A gate, not a vault. A password stops a scan from forwarding. It does not make the destination secret: once someone gets through, the address is in their browser and they can pass it on. Unlock attempts are throttled, which is an abuse backstop rather than a lock.
07Analytics
Track every scan globally
Every scan is a place and a moment. By day, country, city, device and referrer, rolled up daily and honest about bots.
Scans
2,350
scans · 30 days · 1,669 unique devices
Peak day
231
posters went up
Unique devices
1,669
sha256, never raw IPs
Top countries
Devices
Top sources
08Scannability
Know it scans before you print it
The studio checks contrast, module shape and logo coverage as you design. Its limits are not guesswork: they are calibrated against real decode campaigns, and set below the point where anything actually failed.
The instrument
Logo 24%
Scannable · V3 · ECC H
Every check clear with the knockout carved. This exact readout runs live in the studio as you design.
The decode boundary · effective logo ratio
this code · 0.309
warn sits below the best observed pass · fail sits inside the gap where nothing was observed at all
Measured by a decoder, not by a camera. Those campaigns rendered each style to an image and decoded it with zxing, the library most scanning apps are built on. That is a real test and it is not the same as a phone reading a printed sheet under a shop light, so the thresholds are set conservatively and we say which kind of test they came from.
160+ style combinations · 2 adversarial zxing decode campaigns · warn 0.395 · fail 0.412
09API
Automate with our API
Create, retarget, pause, measure: the whole surface, owner-scoped to a key.
POST/api/v1/codes201 · "url": "https://qrcdn.com/…"Create a dynamic code.
curl -X POST https://www.qrcdn.com/api/v1/codes \
-H "Authorization: Bearer qrcdn_live_…" \
-H "Content-Type: application/json" \
-d '{"name": "Storefront flyer", "destination": "https://example.com/promo", "slug": "mybrand26"}'// 201 Created
{
"slug": "MYBRAND26",
"name": "Storefront flyer",
"destination": "https://example.com/promo",
"status": "active",
"scanCount": 0,
"brandKitId": "8a9f1c2e-4b3d-4e5f-9a0b-1c2d3e4f5a6b",
"expiresAt": null,
"passwordProtected": false,
"url": "https://qrcdn.com/MYBRAND26",
"createdAt": "2026-07-23T09:14:02.000Z"
}GET/api/v1/codes"codes": [ … ] newest firstList every dynamic code owned by this key.
curl https://www.qrcdn.com/api/v1/codes \
-H "Authorization: Bearer qrcdn_live_…"{
"codes": [
{
"slug": "8K2QRX",
"name": "Storefront flyer",
"destination": "https://example.com/promo",
"status": "active",
"scanCount": 142,
"expiresAt": null,
"passwordProtected": false,
"url": "https://qrcdn.com/8K2QRX",
"createdAt": "2026-07-01T12:00:00.000Z"
}
]
}GET/api/v1/codes/{slug}"scanCount": 142Fetch one code by slug.
curl https://www.qrcdn.com/api/v1/codes/8K2QRX \
-H "Authorization: Bearer qrcdn_live_…"{
"slug": "8K2QRX",
"name": "Storefront flyer",
"destination": "https://example.com/promo",
"status": "active",
"scanCount": 142,
"expiresAt": null,
"passwordProtected": false,
"url": "https://qrcdn.com/8K2QRX",
"createdAt": "2026-07-01T12:00:00.000Z"
}PATCH/api/v1/codes/{slug}"destination": "…/new-promo"Retarget, pause, and/or set a code's expiry.
curl -X PATCH https://www.qrcdn.com/api/v1/codes/8K2QRX \
-H "Authorization: Bearer qrcdn_live_…" \
-H "Content-Type: application/json" \
-d '{"destination": "https://example.com/new-promo"}'{
"slug": "8K2QRX",
"destination": "https://example.com/new-promo",
"status": "active",
"expiresAt": null
}GET/api/v1/codes/{slug}/analytics"today": { "scans": 3 }Scan analytics for one code: the same data your dashboard renders.
curl "https://www.qrcdn.com/api/v1/codes/8K2QRX/analytics?range=30" \
-H "Authorization: Bearer qrcdn_live_…"{
"range": 30,
"code": {
"slug": "8K2QRX",
"name": "Storefront flyer",
"destination": "https://example.com/promo",
"status": "active",
"scanCount": 142,
"expiresAt": null,
"passwordProtected": false,
"url": "https://qrcdn.com/8K2QRX",
"createdAt": "2026-07-01T12:00:00.000Z"
},
"series": [
{ "day": "2026-06-24", "scans": 12, "uniques": 9 }
],
"totals": { "scans": 142 },
"today": { "scans": 3 },
"topCountries": [
{ "key": "US", "count": 88 }
],
"topDevices": [
{ "key": "mobile", "count": 120 }
],
"recentEvents": [
{
"ts": "2026-07-23T09:10:44.000Z",
"country": "US",
"region": "CA",
"city": "San Francisco",
"device": "mobile",
"referer": "https://instagram.com"
}
]
}Bearer auth: a key only ever sees its own codes.
Pro's monthly API allowance, metered per key.
Send a full style on create; the code freezes to it.
Omit style and the code follows your default kit's edits.
Pro: choose the printed path, 4 to 17 print-safe characters.
One PATCH stops scans; resume whenever you like.
Set or clear expiresAt; immediate expiry is legitimate.
Not-found never reveals whether a code exists or is merely not yours.
10Comparison
Industry-leading features
The whole feature set, including what everyone offers. Where we lead is marked, and every row is something you can go and check.
| Feature | QRCDN | Free generators | Shortener add-ons | Enterprise platforms |
|---|---|---|---|---|
| Survives a downgrade, Free codes are never deactivated: a downgrade pauses features, never redirects | Yes, never deactivated: pauses features, never redirects | No, trial traps common | No, link plans lapse | Partial, contract-dependent |
| Retargeting, Change where a printed code points, live in seconds | Yes, live in seconds | No, reprint to change | Yes, core product | Yes, standard |
| Styled codes, free, Full styling in the studio: free, no account, no watermark | Yes, no account, no watermark: the public studio | Partial, watermarks or sign-up walls | Partial, QR is a paid add-on | Yes, behind a login |
| Brand kit sync, Edit the kit once and every attached code follows: 2 kits free, hard sync | Yes, edit once, every code follows: 2 kits free, hard sync | No, no kit concept | No, one code at a time | Partial, templates, sync varies |
| Scannability instrument, Scannability enforced by an instrument calibrated on real decodes: warns before you export | Yes, calibrated on real decodes: warns before you export | No | No | No |
| Scan analytics, Scans by day, place and device | Yes, day, place and device | No, none, or pixels | Partial, click counts | Yes, full breakdowns |
| IP privacy, Raw IPs never stored: hashed with a daily rotating salt | Yes, raw IPs never stored: hashed, daily rotating salt | Partial, policies vary | No, click logs keep IPs | Partial, varies |
| Retention, Scan history: 30 days free, 365 on Pro | Yes, 30 days free, 365 on Pro | No, none | Partial, 60 days | Yes, contract-length |
| API included, 10,000 requests a month on Pro: one scoped endpoint, 404 reveals nothing | Yes, 10,000 a month on Pro: one scoped endpoint, 404 reveals nothing | No | Partial, rate-limited add-ons | Partial, often costs extra |
| Open source, The engine and the platform, MIT licensed: read it before you trust it | Yes, MIT: read the engine yourself | No | No | No |
| Price transparency, $0 free, $8 a month on annual: the price is on the page | Yes, $0 / $8/mo annual | Partial, until the trap | Yes | Partial, quote form |
| Teams and SSO, Team seats and SSO are enterprise's lane today: accounts here are single-owner | No, single owner today | No | Partial, team plans on some | Yes, built for teams, SSO at contract tier: their lane today |
| Feature | Free generators | Shortener add-ons | Enterprise platforms | QRCDN |
|---|---|---|---|---|
| Survives a downgrade, Free codes are never deactivated: a downgrade pauses features, never redirects | No, trial traps common | No, link plans lapse | Partial, contract-dependent | Yes, never deactivated: pauses features, never redirects |
| Retargeting, Change where a printed code points, live in seconds | No, reprint to change | Yes, core product | Yes, standard | Yes, live in seconds |
| Styled codes, free, Full styling in the studio: free, no account, no watermark | Partial, watermarks or sign-up walls | Partial, QR is a paid add-on | Yes, behind a login | Yes, no account, no watermark: the public studio |
| Brand kit sync, Edit the kit once and every attached code follows: 2 kits free, hard sync | No, no kit concept | No, one code at a time | Partial, templates, sync varies | Yes, edit once, every code follows: 2 kits free, hard sync |
| Scannability instrument, Scannability enforced by an instrument calibrated on real decodes: warns before you export | No | No | No | Yes, calibrated on real decodes: warns before you export |
| Scan analytics, Scans by day, place and device | No, none, or pixels | Partial, click counts | Yes, full breakdowns | Yes, day, place and device |
| IP privacy, Raw IPs never stored: hashed with a daily rotating salt | Partial, policies vary | No, click logs keep IPs | Partial, varies | Yes, raw IPs never stored: hashed, daily rotating salt |
| Retention, Scan history: 30 days free, 365 on Pro | No, none | Partial, 60 days | Yes, contract-length | Yes, 30 days free, 365 on Pro |
| API included, 10,000 requests a month on Pro: one scoped endpoint, 404 reveals nothing | No | Partial, rate-limited add-ons | Partial, often costs extra | Yes, 10,000 a month on Pro: one scoped endpoint, 404 reveals nothing |
| Open source, The engine and the platform, MIT licensed: read it before you trust it | No | No | No | Yes, MIT: read the engine yourself |
| Price transparency, $0 free, $8 a month on annual: the price is on the page | Partial, until the trap | Yes | Partial, quote form | Yes, $0 / $8/mo annual |
| Teams and SSO, Team seats and SSO are enterprise's lane today: accounts here are single-owner | No | Partial, team plans on some | Yes, built for teams, SSO at contract tier: their lane today | No, single owner today |
Category patterns, not claims about any specific vendor.
See the full sheet on pricing11Open source
Verify our platform yourself
Three pieces, all MIT and all public. Read whichever one worries you.
Draws every code you make.
- Certified across 160+ decode combos
- Warns before a design stops scanning
- Styles you save keep working forever
Answers every scan, at the edge.
- 302 and no-store, never a 301
- Runs on Cloudflare, not our app
- Keeps working if our site goes down
The studio, the dashboard and the API.
- Every table and every access rule
- Raw IPs never stored
- This page you are reading
Read the source
MIT licensed · disclosure: hello@qrcdn.com
12Trust & privacy
Lifetime guarantees
- 01We never switch off a free code.pricing policy, in the terms
- 02Stop paying and your codes go read-only, never dark.D14, in the terms
- 03If our site goes down, your codes keep redirecting.architecture, in the open
302 + no-store, never 301 · KV in front of Postgres · retarget propagates instantly, ≤ 5 min worst case · raw IPs never stored
13Pricing
Start free, pay when you print at scale
$0 gets 3 dynamic codes that never stop redirecting. Nothing here expires and nothing switches off.
Free
Your first printed codes
$0 per month
Unlimited static codes
3 dynamic codes, retarget any time
2 brand kits
30-day scan analytics
Pro
Print runs that grow
$8 per month
billed annually $96/yr · save 33%
Everything in Free, plus:
250 dynamic codes
Unlimited brand kits
365-day analytics, city-level geo
API access, 10,000 calls a month
Vanity short links and bulk generation
Expiry and password protection
checkout opens at launch, start free today
Enterprise
Print at institutional scale
Let's talk
priced to what you print
Everything in Pro, plus:
Volume past the Pro cap
Self-host the redirect worker, MIT
Custom terms on request
A direct line to the people who built it
Not sure which plan fits? Tell us what you are printing and how many people will scan it, and we will tell you which one you actually need.
Contact usCreate your first code in minutes
Start free. No card, no trial clock.
your code never dies