DotCode was introduced in 2009 for high-speed marking, where printers can't reliably place touching or connected dots. Industrial inkjet and laser coders print each module as a single dot, so a DotCode can be applied to every pack on a fast production line. AIM publishes the specification, and revision 4.0 dates from 2019.
Every symbol has these parts:
- Dot grid: data dots on alternating positions, like the dark squares of a checkerboard. The dots never touch.
- Rows and columns: chosen by the encoder to fit the space. The height plus the width in dots is always an odd number, for example 12 x 23.
- Data and error correction: the dots carry the encoded data and Reed-Solomon error correction, so a code with missing or damaged dots can still be decoded.
- Quiet zone: a blank margin three dots wide on all four sides.
DotCode packs ASCII text, serial numbers with variable length, expiry dates and unique identifiers into a small area. That is why it fits the narrow print area on a cigarette pack. A symbol that starts with two digits carries GS1 data.