X (Twitter) QR code generator
100% Private & Local — Your data never leaves your browser. These QR codes are permanent and will never expire.
X (Twitter) 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 handle, without the @.
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
Encode an X profile, or use the web intent to open a compose screen with your wording already filled in. The pre-written option never posts anything by itself: it drafts, and the person scanning decides whether to send it.
When someone scans it
A profile code opens the profile page. A pre-written code opens the X compose screen with your text in the box, waiting to be edited or posted.
A profile link and a pre-written post are different payloads
The profile option encodes the profile address and nothing more. The pre-written option encodes the web intent URL that X publishes for exactly this purpose — /intent/tweet with your wording in the text parameter — which opens the compose screen with the box already filled in.
twitter.com and x.com both resolve to the same platform, and links written against either domain reach the same profile and the same compose screen. The intent path itself is still the documented /intent/tweet, which is why that is what the code contains rather than a guessed rebrand of the path.
The encoded text is longer than the text you typed
Everything in the text parameter has to survive being part of a URL, so it is percent-encoded. That inflates the payload well past the character count you see in the box, and the symbol grows with it:
The practical consequence is that a post you would consider short can produce a code that is too dense to print at sticker size. Write the pre-written text as though the character budget were a third of what X allows, check the symbol size in the preview, and cut words rather than dropping the error correction level.
- A space becomes %20 — three characters instead of one
- A line break becomes %0A, and a paragraph break becomes %0A%0A
- A hash becomes %23; left raw it would end the URL early and truncate everything after it
- An ampersand becomes %26, otherwise it starts a new query parameter
- A single emoji can become up to twelve characters once encoded, which is why they are expensive here
What the person scanning sees before anything is posted
The compose screen shows your wording in an editable box. The person can change it, delete it, or close the screen, and nothing reaches their timeline until they press post. That is not a limitation to work around; it is the reason the intent link is a reasonable thing to print at all.
It also sets the standard for using it well. A conference sign that pre-fills the event hashtag and leaves the opinion blank respects the reader. A code that pre-writes praise in the first person and hopes it is sent unread does not, and it is visible in the compose box anyway. Write the draft you would be happy to have read out by the person scanning it.
One prerequisite worth printing beside the code: the compose screen needs the reader to be signed in to X. Someone without an account reaches a sign-in wall, so a pre-written post is a poor choice for a general-public audience and a fair one where the audience is already on the platform.
Questions and answers
Does scanning the code post automatically?
No. The intent link opens X's compose screen with the text pre-filled, and it stops there. The person scanning reads it, edits it if they want, and presses post — or closes the screen and nothing happens. No link can post on someone's behalf without them acting.
Should the handle URL use x.com or twitter.com?
Either reaches the same profile; twitter.com addresses redirect to x.com. Enter the handle without the @ and the tool assembles a consistent URL, so the code stays the same length whichever way you think of the domain.
How long can the pre-written text be?
X enforces its own limit on the compose screen — 280 characters for a standard account — and the field here stops at that. Symbol size is the tighter constraint in practice: percent-encoding can double the payload, so a code destined for a small print size should carry far less than the maximum.
Can I include hashtags and a link in the pre-written text?
Yes. Both are encoded before going into the URL, so a hash becomes %23 and a colon and slashes in a link are escaped too. This is why a raw hash pasted into a hand-built intent URL truncates it — the browser reads it as a fragment marker. Typed into the field here it is escaped for you.
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.