FOR BUILDERS
Plain JSON files, no key, no sign-up. Everything a page shows comes from these files, and everything in them can be checked.
THE FILES
Each unit publishes its own copy. Use a night only when both files have it with the same number. Each night lists both fingerprints and seal times, the drand round, its randomness and signature, the exact text hashed and the number. Where both dice files have a roll, they must agree; an older roll's round comes from drand itself, and its time gives the round number.
—
A DAY FILE ITSELF IS AT /DAYS/APEX1-YYYY-MM-DD.JSON (AND APEX2): ITS SHA-256 IS THE FINGERPRINT.
READ A NIGHT · PYTHON
import hashlib, json, urllib.request
def nights(name):
url = "https://midnightbeacon.org/data/" + name
return {n["day"]: n for n in json.load(urllib.request.urlopen(url))["nights"]}
one, two = nights("beacon_apex1.json"), nights("beacon_apex2.json")
day = "2026-11-09"
a, b = one[day], two[day]
assert a["number"] == b["number"] and a["text"] == b["text"]
assert hashlib.sha256(a["text"].encode()).hexdigest() == a["number"]
print(day, a["number"])def dice(day, roll, beacon_day, beacon_number, rnd, randomness):
text = (f"APEX-BEACON-DICE-V1\nday {day}\nroll {roll}\n"
f"beacon {beacon_day} {beacon_number}\n"
f"round {rnd}\nrandomness {randomness}\n")
h = hashlib.sha256(text.encode()).hexdigest()
return [int(c) for c in h if c in "123456"][:2]The round's signature checks against the League of Entropy's public key with any drand client. The night pages do the same check in the browser.
CITE IT
Name the night in your plan, paper or post before it happens, then cite the number once it's out. A night's link works before the night too: it says when the number is due, then shows it.
—
—
ADDRESSES · PERMANENT
Links to beacon.apexengine.live and apexengine.live/beacon keep working for good: they bring you to the same page here.