Turn text into a decodable pixel matrix or a field of abstract generative art. Export one recoverable image, or split the signal into two noise-like shares that reveal it only together. Choose a 1:1, 4:3 or 16:9 frame, add optional password encryption, and test real damage recovery — entirely in your browser.
Text is encoded as UTF-8, passed through Deflate when that makes it smaller, and packed into four brightness levels at two bits per cell. Optional AES-256-GCM encryption uses a PBKDF2-stretched password. Reed–Solomon recovery is added last, so damaged ciphertext can be repaired before its authentication check.
Compact uses CRC validation without payload recovery overhead. Balanced and Robust add proportional Reed–Solomon recovery data, capped at 32 or 64 bytes per block.
Maximum stores three globally interleaved copies of every two-bit data cell, resolves them by majority vote, then applies up to 96 Reed–Solomon bytes per block. This two-stage design is tuned for at least 10% random cell damage without the former expansion of 230 recovery bytes for every 25 payload bytes.
Every profile is split across independent recovery blocks. Longer messages contain more blocks and therefore more opportunities for an unusually damaged block, so the simulator remains the useful final check for the exact payload.
The live contrast check measures both the familiar WCAG contrast ratio and the brightness gap between adjacent data levels. The level gap is the more important number for decoding: these four-level cells need solid separation between On and Off colors, especially after resizing or recompression.
The header and payload use the same four brightness levels and visual scrambling, so the image remains one uninterrupted matrix without QR-style frames. Square, 4:3 and 16:9 formats add deterministic data-like filler after the payload, filling the entire frame without changing the decoded text.
The render style is an independent visual layer laid around each cell. One pixel — the exact centre of every cell — carries the data; everything else is free. Regenerating the pattern changes the artwork seed, not the message or its recovery budget.
Each style exposes the same two axes: a set that picks the palette, and a density that picks whether that palette uses 4 or 8 colors. A palette declares which of its entries stand for each of the four data levels, so the extra colors of an 8-color set become decorative variants rather than new data — the decoder still reads the same four brightness steps.
Where those variants land depends on the style. Tile-based styles paint whole cells with them. Line- and fill-based styles — dither, circuit, truchet, the maze, fragments, flow and the topographic field — carry their data in coverage or line orientation and never in color, which leaves the color free: each cell picks its mark from the two brightest bands. At 4 colors, and for Duotone at any density, there is only one color to pick, so those looks are exactly as they were.
Duotone follows the live foreground and background colors as a ramp. Brand palette re-tones the hues of the selected color preset onto the four levels. Blue sweep keeps a style's geometry but lets the lit pixels run from white to deep blue across the columns. Confetti, Cool mosaic, Carnival, Poster and Blocks ship their own fixed palettes.
The preset menu is built from the same brand palette library the other tools on this site use, so nothing is retyped here. It reaches the image by two routes. For Duotone it supplies the foreground and background pair: of all the combinations a brand offers, the one that keeps the most color wins, provided it still clears the level-gap target — otherwise every preset would collapse into the same near-black on near-white. For Brand palette it supplies the raw hues, and each of the four data levels takes the closest one scaled to a fixed target brightness.
Sets that ship a fixed palette of their own — Confetti, Cool mosaic, Blue sweep, Carnival, Poster and Blocks — ignore the preset, so the menu is greyed out while one of them is selected.
Motif grid fills each tile with its data color and stamps one symbol from a poster vocabulary — discs, lenses, sunbursts, wedges, arcs and stripes — leaving some tiles blank.
Shape scatter and Isometric blocks paint the whole canvas at once instead of cell by cell, which is what lets their shapes cross cell boundaries: scattered circles, squares, triangles and sectors in the first, a rhombille tiling that reads as tumbling cubes in the second. The data pixels are stamped back on afterwards, so overlapping artwork never hides the signal.
Diagonal maze draws one diagonal per cell, chosen by a data bit. Because the diagonals meet at cell corners, the field joins up into a continuous maze — the straight-line cousin of the Truchet arcs.
The Glyph mosaic style switches the encoder to a wider alphabet, inspired by libcimbar. Instead of four brightness levels, every tile is a symbol drawn from an 8×8 template and painted in a signal color: the shape carries the low bits, the ink color the high ones. At 6 bits that is 16 shapes and 4 colors, at 7 bits 16 shapes and 8 colors, at 8 bits 32 shapes and 8 colors — four times the classic two-bit matrix, so the same message fits in a quarter of the cells.
This is the one place where more colors really do mean more data. In every other style the palette is decoration: the cell still carries two bits, and the extra colors widen the look rather than the payload.
Three symbol families are available — Geometric, Wedges and Block mosaic. Only the first sixteen geometric symbols are drawn by hand; the rest of every family is selected by the same deterministic rule, which keeps adding candidates only while each one stays far enough from all the others. The result is a worst-case separation of 24 differing pixels out of 64 for the geometric and mosaic families and 20 for the wedges, which is what lets a blurred tile still resolve to the right symbol.
Nothing about the family or the density is written into the image. The decoder reads the header cells once per candidate grid and tries every combination against it, so a mosaic identifies itself.
Reading works on float tile boundaries and averages each sub-cell band rather than sampling a single pixel, so a rescaled copy still decodes — down to roughly 8 pixels per tile in the denser modes, and about 6 at 6 bits. Below that the sub-tile detail is gone and no amount of error correction brings it back.
This is a picture, not a scanning target. There are no finder patterns, no quiet zone and no perspective correction — decode it by loading the image file, not by pointing a phone at a screen.
Single image creates one self-contained artwork that the decoder can read directly. It is an encoding, not secrecy, unless AES encryption is enabled.
Two shares turns the message into a 2-of-2 split: a random noise image (share A) and its XOR with the data (share B). Each share on its own is uniformly random and carries zero information; only combining both in the decoder — an information-theoretic one-time pad over the four cell levels — reveals the signal. Share files must keep their original size to line up.
Download uses an indexed PNG — four or eight colors depending on the density — with adaptive per-row filters and PNG's built-in Deflate compression. The source text is already compressed before encoding, so wrapping the data in ZIP would normally add another container rather than save useful space.
The damage simulator overwrites random cells or a contiguous scratch, then runs the real decoder. It shows whether the selected protection profile can recover that particular damage pattern.
Without a password this remains an encoding, not secrecy. With AES enabled, the password is never stored in the image or sent anywhere; losing it makes recovery impossible.