APEX
NEXT NUMBER IN--:--:--

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.

/data/beacon_apex1.jsonAPEX1'S COPY OF EVERY NIGHT
/data/beacon_apex2.jsonAPEX2'S COPY OF EVERY NIGHT
/data/dice_apex1.jsonAPEX1'S LAST 24 ROLLS, EACH WITH ITS DRAND ROUND
/data/dice_apex2.jsonAPEX2'S LAST 24 ROLLS
/data/days_apex1.jsonAPEX1'S DAILY RECORD: EACH DAY'S FINGERPRINT AND SEAL TIME
/data/days_apex2.jsonAPEX2'S DAILY RECORD
ONE NIGHT IN BEACON_APEX1.JSON (SHORTENED)
—

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"])
A ROLL FROM ITS DRAND ROUND AND THE NIGHT BEFORE'S 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.

BEFORE THE NIGHT: NAME IT IN ADVANCE
—
AFTER, WITH THE NUMBER
—

ADDRESSES · PERMANENT

MIDNIGHTBEACON.ORG/TONIGHT AND THE LATEST NUMBER
MIDNIGHTBEACON.ORG/YYYY-MM-DDONE NIGHT, ALSO BEFORE IT COMES
MIDNIGHTBEACON.ORG/NIGHTSEVERY NIGHT
MIDNIGHTBEACON.ORG/DICETHE DICE
MIDNIGHTBEACON.ORG/DICE/YYYY-MM-DD-NONE ROLL
MIDNIGHTBEACON.ORG/HOWHOW IT WORKS
MIDNIGHTBEACON.ORG/BUILDERSTHIS PAGE

Links to beacon.apexengine.live and apexengine.live/beacon keep working for good: they bring you to the same page here.