Tested in Blink and WebKit.

Which browsers, and when · How all of this works

geodzkdocs

reading plane · What this is, what it keeps, and how to drive it without a browser.

What this unlocks

What geodzk lets you do that a shortener built the usual way does not — each claim with the mechanism under it, and the costs at the bottom.

This page is about what this service unlocks — geodzk as it is actually built — rather than what a link shortener is for in general. Every claim names the mechanism it rests on, because a capability with no mechanism behind it is a slogan, and several of these would be false of a shortener built the usual way.

Where something is worse here than elsewhere, that is on this page too. It is at the bottom, under What this is not, and it is the part worth reading if you are deciding whether to use this at all.

If you have not used one of these before

A link shortener takes a long web address and gives you a short one that forwards to it. You hand out the short one — https://geodzk.com/l/alice/party — and whoever follows it lands on the long one.

Two reasons that is useful, and the second is the one this service is built around. A short address is easier to type, read down a phone line, or fit on something small. And because the forwarding is decided when the link is followed rather than when it is written down, the short address can outlive the destination it was pointing at when you gave it away.

Nothing here requires understanding any of the rest. Make a link, hand it out, and the two things below happen whether or not you ever read this page again: it keeps working, and it never learns anything about the people who follow it.

The short version

What you can doUnlocked by
Reprint nothing when the destination changesthe QR encodes the short URL, never the target
Put a link on a wall without collecting anything about who scans itthere is no IP, user agent or referrer column to write to
Hand out a link that changes what it does on a dateactive_from, expires_at and fallback_url on every link
Hand out a link that works a set number of timesmax_clicks, with a fallback rather than a dead end
Know whether the poster workeda click count and a last-followed time
Give somebody a link that says who it is froma namespace per account, on a domain you own
Be certain a link you printed can never point at a stranger's contenta code is retired on delete and never reissued
Turn a list of links into one sheet to hand outa collection, and its printed form
Let a program do all of the above without a browseran API with scoped keys, and a manual written for a program

A QR code of https://example.com/the-thing is finished the moment it is printed. The paper now hard-codes a destination: it cannot be moved, it cannot expire, it counts nothing, and it prints somebody's URL onto the object in a form any camera will read.

A QR of https://geodzk.com/l/alice/party is a handle rather than an address. The label on the jar, the card in the wallet and the poster in the window all keep working after you change where they point — which is the difference between putting a link on paper and putting a link into paper.

This is the capability everything else here is arranged around, and it is why deleting a link retires its code for good. A code that could later be handed to somebody else would turn every printed copy into a link to a stranger.

Four fields, set when the link is made or changed at any time afterwards: not live until a date, dead after a date, dead after a number of follows, and where to go instead of a dead end. Between them, one printed code can do this:

  • An invitation. Before the day it goes to the details; after it, the same code on the same card goes to the photographs. Set expires_at to the morning after and fallback_url to the album.
  • A handout or a badge. max_clicks on a single-use code with a fallback to a general page, so a shared screenshot does not become an open door.
  • A plant label or an equipment tag. No expiry at all, retargeted whenever the manual moves. The label outlives several destinations.
  • Something not announced yet. active_from in the future answers as if the code does not exist, so a printed run can go out before the thing it points at does.

Knowing it worked, without watching anybody

You learn two things about a visit: that it happened, and when. That is enough to answer did the poster work, is anyone still using the old card, and which of these two labels do people actually scan — and it is not enough to learn anything about a person.

The useful consequence is that you can put a QR somewhere public without becoming something that watches a public place. Nothing about the visitor is collected, so nothing about them can be requested, leaked, handed over, sold with the company, or accidentally written to a log: the columns do not exist. The destination is not told either — every hop is sent with Referrer-Policy: no-referrer, so the site you point at never learns which of your links sent somebody, or that this service was involved at all.

  • Per link: how many times it was followed, and when it was last followed. Nothing else.
  • No IP addresses. No user agents. No referrers.
  • No email addresses anywhere in the service — there is no column for one.
  • One exception, and it is volunteered rather than observed: an account holder may type a browser engine and version into a form, and that pair is counted. Nothing detects it, and no report records who sent it.

A short link from a public shortener is anonymous in the least useful sense: the recipient cannot tell your link from a stranger's, and neither can their spam filter. Here the address carries a namespace on a domain somebody actually owns, and a namespace is never handed to a second person — not on deletion, not on a rename, not ever.

So https://geodzk.com/l/alice/party is a claim that can be checked, and it keeps being true. On a wedding invitation that is worth more than any amount of click analysis.

One list, three shapes

A group of links can be published, which gives you the same list as a public page, as a framable box for your own site, and as a sheet laid out for a printer — with a code beside each entry that encodes the same short URL printed under it.

  • The published URL is allocated once and stays stable across renaming, unpublishing and republishing, so a URL you have already shared does not break when you tidy up.
  • Unpublishing takes effect on the next request rather than when a cache feels like it: you pressed the button and it means now.
  • The public page never shows a click count. Those are yours.

Why the philosophy is the feature

The five ideas on the overview are not a manifesto sitting beside the code; each one is why a specific thing above is possible. Read this table in reverse if you like — every capability on this page is one of these five, applied.

The ideaWhat it gets you
A URL you handed somebody is a promisePrinted matter stays safe for ever: no code is reused, no published collection URL is reissued, and no namespace is given to a second person. This is the one that makes paper viable at all.
The box matters more than the threat modelEvery anonymous surface has a number on it, so somebody else's bad afternoon does not become your dead links. Redirects are the one thing never rate-limited, because throttling the product to protect against nothing is not a trade worth making.
A guard that can be checked in two places will disagree in two placesIsolation you can rely on rather than audit: every query touching account data takes an account id, and scope enforcement lives in one function. Demote somebody and every key they hold narrows in the same instant.
No dead ends, and no liesA link that stops working says which kind of stopped and what to do, to the visitor as well as to you — and a fallback turns most of those into a redirect instead. Nothing here reports success it cannot see.
Privacy by absenceNot a setting, not a policy: there is no column. That is why the privacy claim on this page can be checked rather than believed, and why account recovery had to be built for real.

Where a shortener built the usual way differs

Stated as difference rather than as fault, because most of these are reasonable choices for a service with a business model. They are simply not the choices here, and they are what the page above is measured against.

  • Most shorteners log the visit — address, browser, referrer — because analytics is the product or the pitch. Here those columns do not exist, which costs you every report they would have sold you.
  • Most shorteners are a third party. Your link lives on their domain, under their terms, for as long as their company lasts — and shorteners shutting down has broken a great many printed things. This one runs on a box somebody you can talk to is responsible for, on a domain they own.
  • Some rewrite or wrap what you pointed at, adding an interstitial, a tracker or a preview. This service makes no outbound request of any kind, so it never fetches your destination, never learns anything about it, and has nothing to inject on the way through.
  • Many recycle codes when a link is deleted or an account lapses. Here a code is retired permanently, which is worse for tidiness and the entire point for anything printed.

What a program unlocks that a person would not bother with

Everything above is reachable by hand, one form at a time. The ones below are reachable by hand in theory and nobody does them, which is the honest definition of what the API unlocks here.

  • Retargeting a whole printed run at once. Forty labels, one pass, after the destination moved. By hand it is forty edits and the fortieth is where the mistake is.
  • Going from a list to something a printer can take. Create the links, put them in a group, publish it, hand back the sheet — four calls, however long the list is.
  • Setting the schedule per link. Fields nobody fills in by hand for thirty rows, and exactly the fields that let a printed thing survive its first destination.
  • Reading the counts as a question rather than a table. Which of these codes has never been followed, and which is still being followed a month after the event is two lines of arithmetic against the list, and it is not a screen this service offers.
  • Not doing the destructive thing. A program that has read the manual knows that deleting to tidy up retires a code which may be on a poster. That is a capability, and it is why the manual is written the way it is.

If the program in question is an AI agent, the page written for it is AI instructions, and it is one page.

What this is not, and where it is worse

The list above is only worth anything next to this one. None of these is a limitation to be worked around later; each is the cost of something above it.

  • It is not an analytics product and cannot become one. No per-visitor data, no referrer breakdown, no unique visitors, no funnel. If you need to know who followed a link, nothing here will ever tell you, and that is structural rather than a feature not built yet.
  • It is one small container on one machine, not a network of edges. Redirects are a single indexed lookup and are never throttled, so they are fast — but this is not a CDN, it has no availability promise, and if the box is off the links are off. You are trading somebody else's uptime team for knowing exactly who is responsible.
  • A code you retire is gone for everyone, including you. That is the promise working as intended, and it means naming a code deserves a moment's thought. An operator can release one deliberately; nothing else can.
  • There is no email address anywhere, so there is no reset link. Losing your authenticator and your backup codes means asking the operator. A real cost, paid for the privacy claim above.
  • Accounts are made by a person, not by a sign-up form. Good for running this for people you know; useless as a public service, which it is not trying to be.
  • Nothing is shared between accounts. No team, no shared collection, no handing a link over to somebody else. Every query takes an account id, which is what makes the isolation trustworthy and also what makes collaboration absent.
  • The click count is a count. Two people following a link twice each and one person following it four times are the same number here, for ever.
  • It is also not the baking kind of shortening. It will not stand in for butter in a cake, and butter will not stand in for it here either — the two are not interchangeable in either direction. This is the only limit on the page that has never been verified.

Back to top

The same page as text, for a program: GET https://geodzk.com/api/docs/unlocked — needs a key holding docs:read.

Sign in · geodzk.com