How Is a Geomancy Chart Actually Calculated?
No lookup table anywhere — just XOR, four times over.
Bokki Editorial
The short answer
Geomancy (ʿilm al-raml, "the science of the sand") reads sixteen figures, each a stack of four rows that are either active (a single dot) or passive (a pair of dots). Bokki's engine, chart(), never looks a figure up from a situation — it builds one. Four Mothers are cast first; their rows are transposed into four Daughters; four Nieces come from adding Mothers and Daughters in pairs; two Witnesses come from adding Nieces in pairs; and the Judge, the chart's final answer, comes from adding the two Witnesses. Every one of those additions is the same operation, row by row: two actives make a passive, two passives make a passive, one of each makes an active — which is exactly the XOR bitwise operator, run four times per addition. We ran a classical worked example from our own reference notes through the live engine and it reproduced the textbook chain exactly, Judge and all.
Sixteen figures, four bits each
A figure is nothing more than four yes/no answers — Fire, Air, Water, Earth, each row active or passive — so there are exactly 2⁴ = 16 possible figures, from Populus (all four passive) to Via (all four active). Bokki's FIGURE_NAME table names all sixteen; figureRows() reads any figure back out as its four 1s and 0s. Casting a figure from a seed is deterministic: Bokki hashes the seed string and runs it through a seeded pseudo-random generator to fill four bits, the same construction our runes and Ogham tools already use for their own draws — no Date.now(), no Math.random() inside the chart itself.
Worked example — four Mothers to one Judge
Start from four given Mothers: Carcer, Albus, Puer, Coniunctio. Written as rows (Fire, Air, Water, Earth; active=1, passive=0): Carcer is 1,0,0,1; Albus is 0,0,1,0; Puer is 1,1,0,1; Coniunctio is 0,1,1,0. Transpose those four rows into four Daughters — Daughter 1 reads across the Fire row of all four Mothers, Daughter 2 across Air, and so on — giving Amissio, Fortuna Major, Acquisitio, and Amissio again. Add the Mothers in pairs (Mother 1 + Mother 2, Mother 3 + Mother 4) and the Daughters the same way to get four Nieces: Puella, Puella, Carcer, Via. Add the Nieces in pairs to get two Witnesses, Populus and Coniunctio, and add those two Witnesses to reach the Judge: Coniunctio again — the figure the chart actually answers with. Its four rows, 0,1,1,0, sum to two active dots, an even number — the classical checksum a hand-cast chart uses to catch a mis-drawn figure, and one this chain satisfies automatically, because XOR-ing an even number of active bits from the Mothers keeps that parity all the way down.
The same chain, run by the live tool
/geomancy seeds its chart the same way our runes and Ogham pages do: chart(`raml:${today}:${focus}`), where focus is whatever a person typed, or nothing. Asking with no focus on 23 August 2026, the engine casts Caput Draconis, Caput Draconis, Acquisitio and Fortuna Minor as Mothers, and after the same chain above, the Judge lands on Acquisitio — "gain", read warmly, never as a promise. Ask the exact same question twice and the chart is identical down to every row, because the seed never changes; type a single word into the focus field and the Mothers — and everything downstream — come out completely different. Nothing here is picked to make a good story; it's just what four bits of hashing and four rounds of XOR produce.
What we don't calculate
Bokki draws twelve of the sixteen figures — the four Mothers, four Daughters and four Nieces — but does not place them into the twelve classical astrological houses that traditional geomancy uses to answer specific questions (career, health, and so on); our engine stops at the symbolic Judge and Witnesses. We do not compute a Reconciler as a separate on-screen figure, even though chart() returns one internally (Judge + Mother 1) — it isn't shown because we haven't verified its traditional interpretation against a source we trust. We also do not offer the sand-table's original method of physically counting dots; our seed replaces that step, and the seed is the whole of the randomness — nothing about a person's chart, birth date, or identity feeds into it. And we never treat the Judge as a forecast: the figure names a pattern to sit with, not an event that will happen (D-003).
Closing note — twelve figures cast, one XOR, one Judge
In short: a geomancy chart never looks anything up. Four Mothers are cast from a seed, transposed into four Daughters, added in pairs into four Nieces, added again into two Witnesses, and added a last time into the Judge — five stages, the same row-wise XOR at every stage. Run the classical worked example (Mothers Carcer, Albus, Puer, Coniunctio) through the live engine and it reproduces the textbook chain exactly, ending on Judge Coniunctio with an even two active rows, the built-in checksum. Run the actual product seed for today with no typed focus and the same chain lands on a different, equally real Judge, Acquisitio — because the only input that ever changes the chart is the seed string itself, and changing one word in it changes everything downstream. We draw twelve of the sixteen figures and stop there on purpose: no astrological houses, no separate Reconciler figure on screen, and no reading of the Judge as anything more than a pattern worth sitting with.