Human Readable QR Codes
humanqr.odd.place
Codes a camera can scan and a person can read. Your message is spelled out in plain letters, and a band of numeral glyphs lets a phone check every character and repair smudges, the way a QR code does.
What this is How to use it How it compares with QR codes Why letters The Cistercian numerals Cistercian hex codes Edited or damaged codes QR + Letters How big to print or show it Hexaglyph The Hexaglyph abacus The Hexaglyph and Cistercian Hex fonts Sharing Credits
What this is
A QR code is fast and tough, but nobody can read one. You have to trust your phone about what it says. Human Readable QR Codes keep the useful part, a grid a camera can lock onto plus repair data that survives damage, and make the message itself readable by eye.
The default Letters layout writes your text in a simplified alphabet that fits a fixed grid, so anyone can read it. The blue and red glyphs around it are hexadecimal Cistercian numerals , a medieval way of writing a whole number as one shape. Blue glyphs are the header (layout, grid size and length), and red ones are the Reed–Solomon repair bytes, the same math QR codes use.
The page also makes and reads ordinary QR codes, so you can compare the two side by side.
How to use it
Make a code
Type your message in the box. The code updates as you type.
Layout : Letters (the default) spells the message in plain letters. Hexaglyph writes every byte as a compact stave glyph (high digit above a short bar, low digit below), Upright writes every byte as an L-shaped Cistercian hex glyph, Dots is the same with a single corner dot instead of each glyph’s L, and Crosses packs four glyphs around a shared cross for the most density. QR makes a standard QR code, QR + Letters makes a standard QR code with your message drawn in its own modules, and QR + Cistercian does the same with the message’s bytes drawn as Cistercian hex glyphs.
Encode as : Text, or Number for long whole numbers (packed tightly in the numeral layouts; written as plain digits in Letters).
Damage repair : Low, Medium or High, about the same protection as QR’s levels L, M and Q (roughly 7%, 15% and 25% of the code can be wrong and still be fixed).
Point at or tap any glyph to see which character it is. The row of boxes under the code is a transcript.
Under the code, Size needed says how big it must appear to a camera and on paper. Compare every layout for this message puts all six side by side.
In Letters, Header glyphs at the top puts the four header glyphs before the message, like the other layouts. Off (the default), the message comes first.
Save PNG to print it or use it elsewhere. Save smallest scannable PNG saves the code at the size from “Size needed”, after checking that this page reads it back. Or press the share button (top right).
Read a code
Scan live opens your camera and reads continuously; it stops by itself the moment a frame checks out. It also reads standard QR codes.
Take photo or Choose image reads a still picture.
Simulate a photo warps, darkens, blurs and (optionally) smudges the code on screen and decodes that, to show the repair at work.
Tips: get all four corner squares in view (the hollow one marks the top left), fill as much of the frame as you can, and hold steady in even light. A result marked Verified passed the Reed–Solomon check, so every character is exactly right.
“Use the graphics chip (WebGPU)” lets your graphics hardware match letters faster on big codes. If your browser has no real WebGPU, the page quietly uses the processor.
Reading the numeral glyphs by eye
Learn to read the numerals , under the code, teaches this step by step, in either the L or the Hexaglyph style: the bottom arm in order, the left arm, a mix, whole glyphs, then real characters, each step unlocking when you pass it.
Each numeral glyph is one byte, written as two hex digits around an L. The bottom arm carries the low digit and the left arm the high digit, exactly as in the reading chart on the page. Each digit is built from four marks that add like binary: 1 a tick at the arm’s middle, 2 a tick at its tip, 4 a bar joining those ticks, 8 a dot. So 0 is the bare arm and F is a closed box with a dot.
Read glyphs left to right, top to bottom, skipping the corner squares. In text, the left arm works like a class marker: 3 for digits, 4 and 5 for capitals, 6 and 7 for lowercase, 2 for space and punctuation. In the Crosses layout, each quadrant is the same glyph turned a quarter turn, read counterclockwise from the top right. Four bytes form the header (C0–C7: layout and mode, then the grid size, then the length in two bytes), and a copy fills the last four cells. In the numeral layouts the header comes first; in Letters the message comes first and the header sits among the red repair glyphs near the end.
How it compares with QR codes
Every version of this code was measured against real QR codes made by a standard QR generator, holding the same message at matching repair levels, quiet margins included. Area counts in the smallest feature each code needs a camera to resolve: one module for QR, half a glyph unit here.
How the design got denser
First draft, crosses with wide spacing: about 5–6.5× the area of the matching QR code. Half the space was white gaps between crosses, and the corner squares sat in a padded frame.
Tight crosses: crosses packed so neighbouring arm tips are half a unit apart, the same spacing as the marks inside a glyph, and the corner squares moved inside the grid like QR’s finder patterns. About 2.3× QR (2.0–2.6× across sizes).
Upright glyphs, dots and letters: one byte per cell, every glyph the same way up, so people can learn the shapes. About 2.6× QR (2.2–3.1×).
Why not as dense as QR
A QR code spends every module on data and gives nothing to human readers. Here, each glyph keeps its arms (which is also how the camera locks onto it) and two always-empty boxes (which tell the camera what paper looks like in that spot). Even with no gaps at all, a numeral glyph needs about twice a QR code’s area per bit. That is the price of being readable.
Camera and speed
At the same pixels per feature, these codes need roughly 1.5–1.7× as many pixels across as a QR code with the same message.
Reading a photo takes about 0.3–1 second on a phone’s processor; live scanning reads several frames a second.
The repair code never guesses silently: it keeps some repair data unspent to double-check every fix, so a misread is reported instead of shown as right.
For comparison, plain text in an OCR font with separate repair data comes out at about the same size, but OCR can merge, split or drop letters, which shifts everything after the mistake. The fixed grid here makes every error a simple substitution that the repair code can fix.
Why letters
You can read it before you trust it. A QR code can hide any link. A Letters code shows its message, so a person can check what it says, and a camera confirms it, character for character.
It still works when phones don’t. No battery, no app, no signal: the message is right there on the paper or the screen.
Exact, not approximate. Unlike reading text with OCR, a verified scan is guaranteed correct. Damage up to the repair level is fixed; anything worse is reported, never quietly guessed.
Damage you can see around. If a code is torn beyond repair, a person can still read the undamaged letters.
Copyable by hand. The letters can be copied with a pen, and the numeral glyphs are simple strokes and dots.
No look-alike letters. The font keeps O, 0 and Q, and l, I, 1 and |, distinct for eyes and camera alike.
The trade-offs: about 2.6× the area of a QR code, and Letters covers the keyboard’s characters (A–Z, a–z, 0–9, space and punctuation). For accents, emoji or other scripts, use the Upright, Dots or Crosses layouts, which carry any text.
The Cistercian numerals
In the 13th century, around the time Hindu-Arabic numerals were reaching northwestern Europe, monks of the Cistercian order used a very different way of writing numbers: any number from 1 to 9999 as a single glyph. A vertical stave carries four digits in its four corners, units at top right, tens at top left (mirrored), hundreds at bottom right and thousands at bottom left (flipped). The number 1993 is one compact mark.
The idea seems to descend from a simpler notation for 1 to 99 attributed to John of Basingstoke, an English scholar who died in 1252 and had studied in Athens. The monks used their numerals to number pages and leaves, in Bible concordances and arithmetic treatises, and even engraved them on a 14th-century astrolabe. As Hindu-Arabic numerals took over, the system faded by the 15th century, surfacing later in Renaissance books on the occult.
The historian of science David A. King gathered the surviving examples in The Ciphers of the Monks (2001), and the numerals were proposed for Unicode in 2020.
The sister site cistercian.odd.place draws any decimal number as Cistercian glyphs, including numbers far beyond 9999 drawn as a growing fractal.
Cistercian hex codes
A modern twist on the monks’ idea, the “Reformed Cistercian Hexadecimal Numerals” shared on Reddit, rebuilds it for base 16. Each hex digit is made of four marks that add like binary (1, 2, 4 and 8), and eight digits wrap counterclockwise around a cross, so one glyph can hold any number up to FFFFFFFF, about 4.3 billion.
This site turns that into a code for text:
One byte per glyph. Two hex digits make one byte, which is one character of plain text. Upright, Dots and Letters give every byte its own cell in reading order; Crosses keeps the original four-around-a-cross shape.
A grid a camera can find. Four corner squares (one hollow) fix the perspective; the decoder works out the grid size from them, reads the header, then locks onto every glyph by its own arms.
Reed–Solomon repair. The red glyphs are repair bytes from the error-correcting code invented by Irving Reed and Gustave Solomon in 1960, the same one inside QR codes, CDs and deep-space probes. The header is covered too, so a misread length can’t slip through. Only the layout bits are left out of it, so Upright, Dots and Letters with its header on top share exactly the same red glyphs: switching between them changes only how each byte is drawn (and the layout glyph itself).
Letters. In the Letters layout the message itself switches to a simplified alphabet and starts at the top left, like any text. Only the header and repair bytes stay as numerals, after the message.
Edited or damaged codes
Writing on a code can’t change what the camera reads. The repair glyphs are computed from every character, so if someone turns an “n” into an “m” with a pen, the decoder notices the disagreement and puts the original back. Forging a different message that still verifies means redrawing the repair glyphs too, which in practice means printing a whole new code.
But a pen edit can fool a person reading the letters while the camera quietly corrects it. So the reader doesn’t just repair: it tells you where the printed code disagrees with what it encodes.
Red : the glyph reads cleanly as something else, which is what a pen edit looks like. The result says “Verified, but the printed code has been changed” and lists each character, e.g. “character 10 is printed as ‘m’ but the code says ‘k’”, with the encoded letter labelled on the photo.
Orange : damage the reader repaired, such as a smudge, a blot or a fold. Damage that spreads across neighbouring glyphs counts as damage even if one glyph looks clean.
This works the same in Letters, Upright, Dots and Crosses. In QR + Letters , a standard QR app ignores the drawn letters, but this page compares each one with the encoded message and names any that were changed.
None of these codes, and no QR code, proves who made it: anyone can print a new one saying anything. What a readable code adds is that a replacement has to show its message in plain sight.
QR + Letters
QR + Letters is an ordinary QR code that any phone camera or QR app reads, with your message written across it in pixel letters made of its own modules.
How: a QR code has room left over after the message, which standard encoders fill with padding that readers ignore. Those padding bits can be anything, and the repair codewords are a straight (linear) function of all the data bits, so solving a set of equations picks padding bits that turn the modules in each text line black or white as needed. The letter modules are real data, not a logo pasted over the code, so it keeps its error correction. The idea comes from Russ Cox’s “QArt codes” (2012).
A few letter modules sit on the message’s own bits, which can’t be changed. Those are set the right colour anyway, spending at most a third of any block’s repair capacity, usually just 1–8% of the total. The page shows the share it used.
What our reader adds: a normal QR app reads the message and ignores the picture. This page reads the QR too, then checks that the letters printed in it match the encoded message, and says so. A code whose letters say one thing while the code says another won’t get that confirmation.
QR + Cistercian
The same trick with the monks’ numerals: each byte of the message is drawn as a Cistercian hex glyph, 9 modules square with every mark a module apart, in rows that step around the QR code’s alignment squares. Any phone reads it as an ordinary QR code; anyone who has done the trainer can read the glyphs; and this page checks each glyph against the message, flagging any that were changed. It carries any text, accents and emoji included, up to 60 bytes.
It costs more room than QR + Letters, because a readable glyph needs 100 modules against 48 for a pixel letter: about twice the area of QR + Letters, and roughly 10–14× a plain QR code of the same message.
The cost is size: the letters need spare capacity, so a QR + Letters code is a bigger QR version than a plain one. For a 35-character message it takes about 5× the area of the plain QR code, and about twice the area of a Letters code. It draws keyboard characters (A–Z, a–z, 0–9, space and punctuation), up to 80 of them.
How big to print or show it
Every code needs enough camera pixels on its smallest detail to be read. These numbers were measured by shrinking simulated phone photos (tilted, unevenly lit, slightly blurred, with sensor noise) until decoding started to fail:
Letters, Upright, Dots and Crosses read reliably down to about 2.3 camera pixels per half glyph unit, the spacing between neighbouring marks.
Hexaglyph reads down to about 2.0, because its bold stave and the gaps between staves give the decoder a crisp anchor on every glyph.
QR and QR + Letters read down to about 2.6 camera pixels per module with this page’s QR reader (jsQR). QR + Letters needs the same as a plain QR code of the same version.
The page pads those by 1.5× for real lenses, focus and compression, then turns them into the Size needed line under every code: the camera pixels the code must cover, camera pixels per character (smaller is denser), and how wide to print it. Print widths assume a phone camera seeing about 65° across, which is 1920 pixels in live video and about 4000 in a 12-megapixel photo, held 25 cm from the code. Twice as far needs twice the width.
The smallest scannable image is the code drawn at exactly that camera size in pure black and white, stored as a 1-bit PNG, the same way a QR code is stored, and read back by the decoder before it’s reported or saved. Hexaglyph’s files come out 14–45% smaller than Letters and Upright for the same message. QR’s files are smaller still, because square modules compress better than drawn strokes.
One finding: the QR reader occasionally misses steeply tilted photos of larger QR codes, plain or QR + Letters alike, because it corrects perspective from just three finder squares. The Letters-family decoder locks onto four corners and then every glyph, so tilt doesn’t trouble it.
Hexaglyph
Hexaglyph (hex for hexadecimal, glyph for a written sign) is the most compact way to write the hexadecimal numerals, by hand or in a code. Each byte hangs on a short horizontal bar, the stave, much as the medieval Cistercian numerals hung their digits on a vertical stave. The high hex digit sits above the stave and the low digit below , each in a small square against it:
1 the left side, 2 the right side, 4 the outer edge, 8 a dot in the middle. Add them up: F is a closed box with a dot.
The two halves mirror each other across the stave, so “row above, column below” reads straight off the chart.
In text the top half sorts the characters: both sides (3) for digits, the top bar (4) for capitals A–O, plus the left side (5) for P–Z, plus the right side (6) for lowercase a–o, and the closed top (7) for p–z. A capital and its lowercase differ by one stroke.
A glyph is 1 unit wide and 2 tall, against 2 × 2 for the L glyphs, because nothing is left empty. In codes the glyphs sit 0.75 unit apart in rows 2.5 units apart, with fewer rows than columns so the code stays square. The camera locks onto each glyph by its stave and the gaps between staves. The trainer has a Hexaglyph style, the page has a Hexaglyph chart, and there’s a Hexaglyph font to type with.
Hexaglyph has its own home at hexaglyph.odd.place , with a full abacus (including signed digits), practice levels and the Hexaglyph font.
The Hexaglyph abacus
Because every Hexaglyph mark is one binary bit, arithmetic becomes a handful of rules about marks, much like moving beads on an abacus, with no times tables to learn. The marks climb in rank, left side → right side → outer edge → dot , each worth twice the last; past the dot comes the left side above the stave, and past the top dot, the next glyph.
Add: pile the marks of both numbers together, then two of a kind make one of the next , lowest rank first. Two dots below the stave carry across it; two dots above carry into the next glyph.
Subtract: take away each mark; when one is missing, break a bigger mark into two of the one below , which is borrowing.
Double or halve: slide every mark up or down one rank. A pure change of shape.
Multiply: keep doubling the first number; each mark of the second picks which doubling to keep; add the kept rows. This is how Egyptian scribes multiplied, and how “Russian peasant multiplication” works.
Divide: double the divisor until it would pass the number, then take away the biggest doublings that fit; each one taken gives the quotient a mark, and what’s left is the remainder.
On the page, Hexaglyph abacus steps through any sum one rule at a time, highlighting the marks that move and counting marks that pile up, with rows lined up by rank like column arithmetic. Practice works through seven levels, from adding two digits to mixed two-glyph problems, shows your answer as Hexaglyphs as you type, and loads any problem into the stepper with Show me how .
As far as we know the medieval monks used their numerals only to write numbers down, not to calculate with them, so this part is new.
The Hexaglyph and Cistercian Hex fonts
Two free fonts in which every character shows the glyph of its own code: Hexaglyph draws the stave glyphs and Cistercian Hex the L glyphs, exactly as in these codes. Type A and you get glyph 41; type a and you get 61. Set any text in it and it reads as glyphs.
Every keyboard character types normally, and the space bar types glyph 20 so word breaks stay visible.
Accented letters (bytes A0–FF) type as usual; all 256 bytes are also at U+E000 + byte.
Windows: right-click the .ttf and choose Install. Mac: double-click it and choose Install Font. The .woff2 is for websites.
Try it and download it on the page , in the “Type in Cistercian Hex” box.
Sharing
Press the share button (top right). It makes a picture of your code and a link preview for it. Add a title if you like, then post it to Facebook, copy the link, or send it another way.
Each share gets its own page with the full-size code (people can read it right there, or scan it off the screen) and a button that reopens this page with your message, layout and settings. Messages up to 600 characters ride along in the link; longer ones share the picture only.
Credits
Hexadecimal glyph system: the “Reformed Cistercian Hexadecimal Numerals” shared on Reddit, after the Cistercian numerals of the 13th-century monks, as documented by David A. King.
Error correction: Reed–Solomon codes (Irving S. Reed and Gustave Solomon, 1960).
QR Code was invented in 1994 by Masahiro Hara at Denso Wave; “QR Code” is a registered trademark of Denso Wave.
QR + Letters follows Russ Cox’s “QArt codes” (2012); its pixel letters are the HD44780-style 5×7 LCD font from the luma.core project (MIT license).
QR making: qrcode-generator by Kazuhiko Arase (MIT license), whose QR tables also drive the QR + Letters encoder. QR reading: jsQR by Cosmo Wolfe (Apache 2.0), or the browser’s own barcode reader where it has one.
Page type: Alegreya Sans by Huerta Tipográfica (SIL Open Font License).
More from the same workshop: Cistercian numbers as fractals and everything else at odd.place .
Cistercian numbers as fractals The sister site: any decimal number drawn as medieval Cistercian glyphs, growing outward for big numbers.
Discover more Oddities at odd.place Generative art, games, science toys and curious tools, all running in your browser.
Made by Jason Buchheim for odd.place .