Telegram QR code generator
100% Private & Local — Your data never leaves your browser. These QR codes are permanent and will never expire.
Telegram settings
Design
Add a centre logo
The image is read in this page and embedded in the code as a data: URL. It is not uploaded, and it stays inside the file you download.
More design options
The dark half of the code. Keep it well below the background in lightness.
Covers the quiet zone as well as the gaps between modules. A transparent background leaves it out of the file, so nothing is drawn with it.
Contrast 11.5:1 between the modules and the background.
PNG and WebP keep an alpha channel; the SVG simply omits the background rectangle. Whatever the code is placed on becomes the light half of the contrast.
A gradient fills the dark modules only. Its lighter end sets the contrast a scanner actually gets, so both ends have to stay dark.
The second colour, used only while a gradient is selected. It is measured for contrast alongside the first.
Degrees clockwise from a left-to-right sweep. A radial gradient spreads from the centre outwards, so the angle applies to a linear one only.
Rounded shapes cover less of each cell. The centre stays covered, which is where a decoder samples, but a small print of a dense code reads more reliably as squares.
The ring of the three finder patterns.
The eye inside each finder pattern.
The blank margin around the code, measured in modules. 4 is the specified minimum.
Higher recovery survives more damage and costs capacity, so the same content produces a denser symbol.
A logo sits at the centre and holds the level at H. Its width limit follows the symbol: 14% on the smallest code, 30% on a dense one.
Live preview & export
Enter the Telegram username.
Export
Raster, for screens
Complete the form to enable the downloads.
Export size and encoded text
- Payload
- Nothing encoded yet
- Symbol
- Not built yet
- Recovery
- M
Waiting for input
Telegram addresses three different things through the same t.me domain: a public username, an invite hash for a private group or channel, and a phone number. Choose which one you actually have, because the three are written differently and are not interchangeable.
When someone scans it
The phone opens t.me, which hands off to the Telegram app and shows either a chat with the account or the join screen for the group or channel.
Three link shapes on one domain
A public username is the simplest: https://t.me/northgatebindery resolves to the account, group or channel that holds that username. It works for anyone, it needs no approval, and it survives being reprinted because the username belongs to you until you change it.
A private group or channel has no username, so Telegram issues an invite link instead: a plus sign followed by a random hash, https://t.me/+AbCdEfGhIjKlMnOp. Links created before the format changed use https://t.me/joinchat/ followed by the same kind of hash and still resolve. There is no way to derive one of these; it has to be copied out of the app.
A phone number uses the plus form too, https://t.me/+447700900123, and Telegram tells the two apart by what follows the plus. All digits means a phone number, anything else means an invite hash. That is also why an invite hash must never be typed into the phone field and the other way round.
Invite links expire, usernames get released
An invite link is a credential, not an address. An admin can revoke it at any time and it stops working immediately, and Telegram lets a link be created with an expiry date or a cap on how many people may use it. Any of those three endings kills every printed copy at once, so a poster carrying an invite link is only as durable as the link behind it.
If you are printing something you cannot recall, generate a fresh invite link with no expiry and no usage limit and keep it out of chats where it might get revoked in a clear-out. If you want the opposite, a link with a hundred-use cap is a reasonable way to make a printed run self-limiting.
A username has the mirror-image risk. It is stable while you hold it, but Telegram releases a username when you change it, and someone else can then take it. A printed code pointing at a username you have abandoned will send people to a stranger.
Why the code uses t.me and not tg://
Telegram also has a native scheme, tg://resolve?domain=northgatebindery, which opens the app directly and skips the browser. It is not used here, for two reasons.
Camera apps and scanners frequently refuse to follow a non-http scheme out of a QR code, and some show the raw string instead of offering to open anything. Even when they do follow it, a phone without Telegram installed gets nothing at all: no page, no prompt, no explanation.
https://t.me is a plain web address, so every scanner offers to open it and every browser can load it. Someone without the app lands on a page that explains what they scanned and offers the install, which is a far better outcome for a poster in a public place than a tap that does nothing.
Questions and answers
Do I include the @ in the username?
No. The @ is display convention inside Telegram; the link form is t.me followed by the bare username. Type northgatebindery rather than @northgatebindery. A leading @ is stripped before the code is built.
What happens if someone scans this without Telegram installed?
Because the payload is an ordinary https link, the browser opens t.me and shows a page for the account, group or channel with an option to install the app. Nothing breaks, and the code keeps working once they have installed it.
Will a phone-number code open a chat for everyone?
Only for people your privacy settings allow to find you by phone number. If Who can find me by my number is set to My Contacts, a stranger scanning the code will not reach a chat. A public username has no such restriction.
Can a printed invite-link code stop working?
Yes. An admin can revoke an invite link, and a link can be created with an expiry date or a limit on how many people may join through it. When any of those triggers, every printed copy stops working at the same moment. A public username link has no such dependency.
How a static QR code works
Every code on this site is static: the payload is written into the black and white modules themselves. Nothing is looked up when the code is read, no server of ours takes part, and no subscription holds the printed code up. The same property is the limit — once it is printed, what it contains cannot be changed.
Three things then decide whether a printed code reads: how many bytes the payload came to, which recovery level absorbs the damage, and how wide a single module ends up on paper. These guides work through each of them with the numbers.