GeodeQR

QR codes that never expire.

Free, no account, nothing leaves your browser — and every style stays inside limits proven against a deliberately bad scanner.

A transparent code keeps scanning on any light background.
Download as
PDF ships a vector matrix with the full design. EPS is the bare vector code. PNG and SVG stay sharpest — JPG is for systems that require it.

This code doesn't need us. It keeps working even if this site disappears.

Bulk codes from a spreadsheet

Upload a CSV. Get a ZIP of codes — generated in your browser, free.

Your QR code points exactly where you tell it. Nothing sits between the scan and your link, because there is no server involved at all. That is also why it is free: a static code costs us almost nothing to make, so we do not charge for it, do not watermark it, and do not put anything inside it. Your code stays yours.

We invite you to double-check our work.

Open your browser’s developer tools, switch to the Network tab, and make a code. Nothing leaves your device.

The whole source is on GitHub. Read it, fork it, run it offline.

Found a bug, or a claim that doesn’t hold up? Tell us — an example helps enormously, though we understand if yours is too sensitive to share: qr@geodeforge.com

That’s the difference between a privacy policy and a fact.

Tell someone it exists

This project has no marketing budget and no growth team — it spreads or it does not.

See what's actually inside a QR code

A QR code is text in a grid, not a picture of a link. Drop one into Read a code below — decoded on your machine, by our own decoder. The image never leaves your browser.

What you might find

Your own link. Then it's a static code: the address lives inside the image. Nothing can change it or switch it off. This is the good outcome and it's boring, which is the point.

Someone else's domain. Then it's a dynamic code. The image points at their server, which forwards each scan on to your link. Two things follow, and they're facts, not accusations:

A shortener you didn't choose. Same shape, same two facts.

Sometimes a dynamic code is exactly what you wanted

If you chose a dynamic code — because you want to change the destination after printing, or you want scan counts — that's a legitimate product and the redirect is the thing you're paying for. Plenty of people need it. We don't offer it, and we're upfront about why: it needs a server running forever and someone moderating what gets redirected.

The reason this page exists is narrower. A lot of people are handed a dynamic code without being told what it is, and find out when the printed one dies. They deserve to be able to look.

Scanning something you didn't make

The same tool works, and here it's a safety check rather than a curiosity. A QR code on a parking meter, a restaurant table, or a letter can point anywhere, and a sticker can be placed over a real one. Reading a code is not the same as scanning it — this shows you the destination without going there.

If the text looks nothing like the business it's attached to, you've learned what you needed to know — walk away and pay another way.

How it works, since you shouldn't take our word for it

The decoder is ours — written from the specification, no libraries, no dependencies, and no BarcodeDetector API (that only exists on some platforms, so a reader built on it is invisible on most desktops). It refuses to guess: a Reed–Solomon correction that doesn't re-verify is reported as a failure, not as a result.

Validated at 56/56 against codes from independent generators, 500/500 on corruption round-trips. The record is in the repo, including the four real bugs that only an independent decoder could find.

Read the source. Clone it, disconnect your Wi-Fi, open index.html. It still works.

More from GeodeForge

GeodeForge is a one-person studio that crafts open-source tools that do what they say, and let you check — in your browser.

Check at geodeforge.com →