Hexatess Code 🐝
An experimental 2D barcode on a hexagonal grid — with a hexagonal bullseye finder, spiral serialization and a continuously selectable Reed-Solomon error-correction budget of 5–90 %.
from hexatess import encode, decode, render
grid, params = encode("Hello, Hexatess!", ec_pct=30)
render(grid, "hello.png")
text, stats = decode(grid) # ('Hello, Hexatess!', {...})
Symbol anatomy
- A — a real encoded symbol: hexagonal bullseye finder (rings 0–4), orientation key (ring 5: two dark cells), data region (rings 6…) filled in spiral order, and a quiet zone of at least 1 module;
- B — finder close-up: dark centre (rule
bit = 1 − ring mod 2), alternating dark/light rings, and the key — the first two canonical ring-5 cells set dark, breaking the 60-fold symmetry and marking the spiral start direction; - C — spiral bit order across rings 6–7 (bit 0 at cell
(−6, +6)), rendered from the actual reference encoder output.
Why hexagons?
- +15.5 % packing density over the square grid — hexagons tile the plane with ~15.5 % more modules per area at equal module size, which directly translates into more data per printed area.
- Rotational isotropy — three axes of symmetry instead of two; damage from any direction is statistically equivalent.
- Proven heritage — MaxiCode (UPS, ISO/IEC 16023) already proved a hexagonal 2D code works in the field; Hexatess Code generalizes the idea to variable-size, high-capacity, Aztec-style symbols.
- Modern error control — continuous EC budget from 5 % to 90 % (not 7 discrete levels), independent RS blocks of ≤ 50 data bytes, and a double-protected header.
Status: experimental. This is a young format: the symbol specification and reference implementation are solid and heavily tested (2,500+ tests, conformance vectors). A camera decoder (
hexatess.camera, optional[camera]extra) already reads symbols from real photographs — printed labels, foil transparencies, tilted and rotated shots. See the roadmap below. Adopting a young format is a deliberate bet; the full format specification is the insurance.
Installation
pip install hexatess-code # from PyPI (once published)
pip install "hexatess-code[camera]" # + photo decoding (numpy, opencv, scipy)
# or from a source checkout:
pip install -e .
Requires Python ≥ 3.8; Pillow for rendering, numpy + OpenCV + SciPy for the optional camera decoder.
Command line
hexatess "Hello world" -o koda.png --ec 30
hexatess "Important URL https://example.org" -o url.png --ec 55
hexatess --demo # demo symbol + robustness statistics
hexatess decode-photo photo1.jpg photo2.jpg # read symbols from photos
API
| Function | Description |
|---|---|
encode(text, ec_pct=30, mask_id="auto", min_rings=None) |
UTF-8 text → (grid, params); grid maps axial (q, r) to 0/1 |
decode(grid) |
grid → (text, stats); RS-corrects transparently |
render(grid, path, size_px=18, ...) |
grid → PNG (pointy-top hexagons, quiet zone, supersampling) |
sample_grid_from_image(path, rmax, ...) |
ideal re-sampling of a rendered PNG (self-test helper) |
run_tests(...) |
noise/blob robustness statistics |
hexatess.camera.decode_photo(path) |
photograph → (text, stats); finder detection, perspective handling, adaptive sampling (optional [camera] extra) |
params / stats contain rmax (radius in rings), mask, ec,
blocks (list of (data_bytes, ecc_bytes)) and data_len.
Error-correction budget
Choose any multiple of 5 between 5 and 90:
| EC | Character |
|---|---|
| 5–15 | maximum capacity, clean environments |
| 25–40 | general use (default 30) |
| 50–70 | industrial / outdoor |
| 80–90 | extreme damage tolerance |
Physical behaviour (measured on the reference implementation): one
flipped module is one RS symbol error, so uniform-noise tolerance is
roughly EC / 16 percent of modules, while clustered (smudge/blob)
damage survives several times higher area fractions because flips
concentrate inside whole bytes.
Implement it in your own language
The format is deliberately specification-first: everything needed
for an independent implementation is in
SPECIFICATION.md, and
test_vectors/vectors_v0.2.json
contains fixed inputs/outputs (grids, headers, damaged symbols, expected
results) to verify conformance. If your Rust/Go/JS decoder passes the
vectors, it speaks Hexatess Code.
Roadmap
v0.2/0.3 — camera decodingdone (v0.3.0):hexatess.camerareads symbols from photographs — bullseye detection, homography + correction-field warp handling, adaptive sampling; validated on printed foil with curl and glare.- Erasure decoding: declare blob-occluded modules as erasures → doubles correctable symbol counts.
- JavaScript/TypeScript SDK + online playground (generate a code in the browser in 10 seconds).
- Larger radii / capacity beyond 329 bytes (breaking header change).
Contributions welcome — see CONTRIBUTING.md.
License
- Code: MIT
- Specification: CC-BY-4.0 — implement it anywhere, commercially, under any license, no royalties, forever.
Hexatess Code stands on the shoulders of giants: Aztec Code (bullseye + spiral), MaxiCode (hexagonal lattice), QR Code and Data Matrix (Reed-Solomon practice).
Metadata
Release files for hexatess-code 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| hexatess_code-0.3.0.tar.gz | 39.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hexatess_code-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 71.0 kB
Release files / hexatess_code-0.3.0.tar.gz
| Download URL | hexatess_code-0.3.0.tar.gz |
|---|---|
| Size | 39.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3d8af705f57f33cce7bc6fbc68fd5435bc2fe271e3d31634f16a546cd1cecd96
|
|
BLAKE2b-256 checksum How to use checksums |
7dcbbe8485087f6b55c04ae8f55339d7d81a516c8e2dfbfe37884501bb0d19b3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.
Transparency logRelease files / hexatess_code-0.3.0-py3-none-any.whl
| Download URL | hexatess_code-0.3.0-py3-none-any.whl |
|---|---|
| Size | 31.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cafe5668e87c2a8f4606057a6dd10a60be2ce6339c56caafd66e840f55f7f7dd
|
|
BLAKE2b-256 checksum How to use checksums |
0ea8d86f89666586bdac821605b06c97f0624beded8b89332ebfdc8dd6b32636
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.
Transparency log