Tlhano: Five Words, One Place
An open, self-verifying location addressing scheme built on S2 geometry
1 Introduction
Most of the developed world enjoys street addresses; much of the working landscape does not. A borehole, a farm gate, a cattle post, a landslip on a rural road — these have coordinates but no name, and coordinates are a poor interface for human beings under stress. Reading -24.64492, 25.90733 aloud over a phone is a transcription exercise; reading five common words is not.
The commercial incumbent, what3words, proved the idea and tied it shut. Its word assignment is a trade secret; addresses can only be created or validated through its paid API; its plans meter even the reverse lookup (our own integration received HTTP 402 on the free tier for exactly the conversion a farm SOS needs); and during a 2026 refactor we shipped a call to an endpoint that does not exist — because the only party who can audit the contract is the vendor. A safety feature with a single point of commercial failure is not a safety feature. Tlhano is the response: the same human interface, with the mathematics, the vocabulary, and the test vectors all public.
2 The name
Tlhano is the word for five in Setswana, the language of Botswana and the Northern Cape, where this system's parent platform runs. The name is literal — five words address one place — and it continues the platform's Setswana sky: Chaba (the sun) is the farm platform, Ngwedi (the moon) is the agent that built Tlhano and wrote this report. The moon, fittingly, does its work after the sun has set, and borrows its light: Tlhano's mathematics is mostly borrowed — from S2 — and arranged to shine on its own.
3 Preliminaries: S2 geometry
S2 [1] discretises the sphere by projecting each of six cube faces quadratically onto [0,1]², subdividing each face into 4L cells at level L, and threading the cells with a Hilbert space-filling curve so that spatially adjacent cells receive nearby positions in the traversal order. A cell is identified by a 64-bit identifier laid out as [face:3][Hilbert position · 2 bits/cell][1][0…], and level 22 — the leaf level — tiles the Earth with
N = 6 · 4²² = 105,553,116,266,496 cells mean area 4.83 m² (range 2.90 – 6.08 m²)
Figure 1 — leaf-level capacity and cell sizes, from the S2 specification, reproduced in our port's test suite against the published values.
We re-derived the construction — the quadratic ST/UV projection, the Hilbert lookup tables generated by the same recursion as InitLookupCell, and the bit layout — as a self-contained Python port, anchored against published constants (e.g. face 2's cell id is 0x5000000000000000) and against the Hilbert locality property (consecutive ordinals are neighbours on the sphere, within ≈ 6 m at leaf level).
4 The Tlhano encoding
Four steps carry a point to its five words:
lat, lng → containing S2 cell at level 22 (Section 3) → 47-bit ordinal o = face · 4²² + position-in-face (Section 4.1) → dispersion y = o · M mod 2⁴⁷ (Section 7) → 48-bit frame [ 0-pad(1) | y(47) ] + CRC-12 (Section 5) → five 12-bit word indices into a 4096-word vocabulary (Section 6)
4.1 The ordinal
Since 2⁴⁶ < N ≤ 2⁴⁷, a cell is addressed by a 47-bit ordinal that folds the face number and the within-face Hilbert position into one integer. The ordinal is the scheme's entire information payload: 47 bits, of which the Earth's surface uses log₂(105,553,116,266,496) ≈ 46.6.
4.2 Worked example
input -24.64492, 25.90733 (the Three Dikgosi Monument, Gaborone) cell token 1ebb5b0458a3, level 22 ordinal 16,895,017,364,561 address common.circuit.shipped.assist.talking centre -24.64492931, 25.90733512 (cell centre: ≈ 1.2 m from the input)
5 Error detection: the check word
Five 12-bit words carry 60 bits; the payload needs 47 plus one padding bit. The remaining 12 bits are a CRC-style check word computed over the 48-bit frame with the generator polynomial
G(x) = x¹² + x⁶ + x⁴ + x + 1 (0x1053, primitive; register constant 0x053)
The frame is processed as an augmented CRC — 48 data bits followed by 12 zero bits — and the remainder becomes the check word. The register constant 0x053 excludes the polynomial's own x¹² term, which is implied by the degree.
Two engineering caveats deserve record. First, the CRC kernel must be augmented — the frame is processed with 12 trailing zero bits — or low-degree multiples of G leak into the register and a family of corrupted frames validates. Second, the register constant must exclude the polynomial's own x¹² term; XORing the full 13-bit constant 0x1053 produces 13-bit remainders and breaks round-trips. Both defects were built, caught by exhaustive sweeps, and pinned by regression vectors. Residual risk: a multi-word error escapes with probability 1 − 2−13 ≈ 99.99%, and no checksum defends against deliberate forgery — Tlhano guarantees integrity against accident, not authenticity against adversaries.
6 The vocabulary
The 4096 words are the intersection of a frequency-ranked English word list with a dictionary word list, filtered to 4–8 letters, pruned of Levenshtein-distance-1 pairs (no two vocabulary words differ by a single keystroke or a single sound), and screened against a blocklist of profanity and its inflections, slurs, violence, drugs, and strong trademarks. The result is pinned by content hash:
sha256(en-4096.txt) = b39b240e5cabd0943ea1903d2b3d45e2b7c48822ab6b50f9113db68e14854da6
When an address fails its check word, the repair protocol proposes candidates by ranking every one-edit and transposition variant that does validate, ordered by vocabulary frequency — mis-hearing …assist.talking as …assist.talkin is recovered in one suggestion.
7 Dispersion: neighbours never look alike
A naive scheme would print the Hilbert ordinal's bits directly into word indices — but Hilbert order means neighbours have nearby ordinals, and nearby ordinals share high bits: neighbouring farms would receive addresses differing in only their last word. Tlhano therefore permutes the ordinal before framing it:
y = (o · 0x72a5c9e183f7) mod 2⁴⁷
Multiplication by an odd constant modulo 2⁴⁷ is a bijection (no information is lost; the inverse constant is computable), and it avalanches: flipping one low bit of the ordinal scatters carries across the whole product. Measured on the shipped implementation: for 2,000 random cells, the address and the address of the Hilbert-next cell differ in all five words, every time (mean 5.00, minimum 5). Spatial neighbours are word-dissimilar; conversely, similar-looking addresses are, with overwhelming probability, far apart — the opposite of the confusion a dispatcher needs least.
8 Evaluation
| Property | Tlhano | Incumbent (what3words) |
|---|---|---|
| Algorithm | public, specified, re-implementable | trade secret |
| Validation | offline, from the words alone (CRC-12) | network API call, metered |
| Cost of lookup | self-hosted; no per-call licence | commercial plan (402 on free tier for reverse lookup) |
| Cell size | mean 4.83 m² (2.90–6.08) | ≈ 3 m × 3 m |
| Cells | 105,553,116,266,496 | ≈ 5.8 × 10¹³ (claimed) |
| Address space | 2⁶⁰ raw; valid fraction 2⁻¹³ | undisclosed |
| Single-word corruption | detected with certainty (20,475/20,475) | not guaranteed; similar-word lists only |
| Neighbour dissimilarity | all five words differ (measured, Section 7) | adjacent squares often share words |
| Vocabulary | frozen, hash-pinned, one-edit deduped | per-language, vendor-controlled |
A uniformly random five-word string is a valid Tlhano address with probability 2−13 ≈ 0.012%; the 60-bit envelope carries 59 bits of codeword over a 47-bit payload, a headroom factor of ≈ 5,461 that is spent entirely on error detection.
9 What was added on top of S2
S2 answers "which cell contains this point?" — it is a geometry library, not an addressing scheme. Tlhano's contribution is the layers between a cell id and a human mouth:
| Layer | Contribution |
|---|---|
| 47-bit ordinal | a dense, face-inclusive numbering of all leaf cells — the raw 64-bit cell id spends 17 bits on level tagging and trailing zeros; the ordinal spends none |
| Dispersion permutation | a multiplicative mix (Section 7) that turns S2's locality — a virtue for caching — from a liability for memorability into all-five-words-differ dissimilarity |
| CRC-12 check word | exhaustively-verified detection of every single-word corruption and transposition, chosen over the parity bit the first draft used (which missed 38% of single-word errors) |
| Repair protocol | frequency-ranked one-edit and transposition suggestions that reconstruct an address from a near-miss |
| Frozen vocabulary | 4,096 screened, hash-pinned words with a normative selection procedure |
| Normative spec + vectors | every constant, theorem, and test vector published — the property the incumbent never offered (Section 1) |
10 Limitations and future work
The vocabulary is English; a Setswana vocabulary of 4,096 screened words is the natural next language and would re-target the same 60-bit frame unchanged. Cell granularity is fixed at level 22; buildings, not sub-rooms, are the resolution. The check word certifies well-formedness, not intent — it stops fat fingers, not forgeries. And the reference implementation is, for now, proprietary; the specification and test vectors are public, so an independent implementation can be validated against them, and the open-sourcing decision belongs to the platform's owner.
11 Conclusion
Five common words can name every 5-metre cell of the Earth — and, given a check word with a proof attached, survive being spoken once, badly, over a bad line, by someone whose afternoon depends on it. The mathematics is borrowed, the arrangement is new, and nothing about the system requires asking a vendor's permission to find a farm gate.
References
- [1] S2 Geometry Library — Dev Guide. s2geometry.io/devguide (cell hierarchy, ST/UV projection, Hilbert curve internals).
- [2] D. Hilbert, Über die stetige Abbildung einer Linie auf ein Flächenstück, Math. Ann. 38 (1891) 459–460.
- [3] W. W. Peterson, D. T. Brown, Cyclic Codes for Error Detection, Proc. IRE 49(1) (1961) 228–235 — the burst-detection bound used by Theorem 1.
- [4] P. Koopman, T. Chakravarty, Cyclic Redundancy Code (CRC) Polynomial Selection for Embedded Networks, DSN (2004) — selection criteria behind a primitive degree-12 generator.
- [5] Tlhano, Normative Specification rev 1.0.0-draft — constants, algorithms, frozen test vectors. S2/docs/SPECIFICATION.md.
- [6] The Chaba SOS incident log — the what3words dependency review that motivated this work. S2/docs/RESEARCH.md, Part 1.