Skip to content
UseQR
ESC

Jump to

MOVEOPEN50 places

Design

QR code module shapes compared: square to organic

Module shapes are safe when each module keeps roughly 60% or more of its ink and neighbouring modules never merge into ambiguous blobs. Square is the 100% baseline, rounded keeps about 91% of the ink, dots about 55%, and the risk rises in that order, always decode the styled export before using it.

View as MarkdownPaste this page into any AI assistant. It is plain, portable Markdown.

Why shape is a contrast problem in disguise

A decoder samples each cell of the grid, effectively reading near the centre of every module, and asks: dark or light? Any shape that keeps the centre solidly inked and the cell majority-dark reads identically to a square. Styling fails in two ways: starving a module (so little ink that blur or print gain tips its sample light) and merging neighbours (ink bridging cells that should be light). The working floor is roughly 60% ink per module, and merging is never acceptable.

The styles, measured

These are UseQR's eight module styles (style= parameter), with the exact geometry the renderer uses and the risk that geometry implies:

Style Geometry Ink per module Risk
square full cell 100% none, the baseline
rounded corner radius 0.32 × module ~91% low
vertical-bars / horizontal-bars runs joined into capsules, 6% inset each side ~88% low
organic 0.5 × radius on free corners; connected runs stay joined ~91–100% low–medium
dot circle at 84% of module width ~55% medium
diamond oversized 13% so neighbours overlap ~65% medium
star pointed star inside the cell lowest of the set highest

Three details worth noting. The dot's 84% diameter still leaves only about 55% of the cell inked, which is why dot codes have a density limit. The diamond is deliberately drawn 13% oversized: pure inscribed diamonds touch only at points and drop below decoder tolerance, so the overlap is what keeps the style safe. And the organic style rounds only free corners, so adjacent dark modules remain physically connected, controlled merging along the grid, not across it, as explained on the organic styles page.

How to choose

  • Print small or scan far: square or rounded. At small physical sizes the reduced ink of dots and stars is the first thing blur erases: see rounded vs square for the print-size arithmetic.
  • Soft brand look at normal sizes: rounded, bars, or organic.
  • Decorative, generous size, short payload: dot, diamond, or star, and keep the version low so modules stay large. A dense code amplifies every shape's weakness.

Eyes follow their own rules: UseQR pairs each module style with a matching default eye (dots get circle eyes, rounded and bars get rounded eyes) but the eye shape is set independently via eye= and ball=, and eyes should always stay solid and high-contrast.

Whatever the choice, the test is empirical: run the styled export through the validator, at the size it will actually be used. Styling risk is cumulative with size, contrast and logo choices, and only a real decode of the real artwork accounts for all of them at once.

FAQ

Do styled QR code modules scan as well as square ones?

Rounded modules scan essentially as well as square in normal conditions. Dots, diamonds and stars carry less ink per module, which costs margin at small sizes, low resolution or long distance. The style itself is rarely fatal; the style combined with small print often is.

What is the safest non-square module style?

Rounded, which keeps about 91% of each module's ink and never merges neighbours. Bar styles are close behind. Both look noticeably styled while giving up very little scanning margin.

Can module shapes touch each other?

Along the grid, deliberately, bar and organic styles join orthogonal neighbours and decode fine, because the joined cells were all dark anyway. What must never happen is ink bridging into cells that should be light, which changes sampled values and corrupts data.

Which module style should I avoid?

Star modules at small sizes. They carry the least ink of any style, so printing blur and camera noise push their samples toward the background first. If the code is generously sized and the payload short, they can still verify, decode the export to check.

Try it: free, no signup