Check the record.
Reproduce the result.
Every assignment follows the same public rules. You can verify the beacon signatures and rebuild the entire code ledger on your own computer.
Start with independent randomness.
4to.day uses drand quicknet, a distributed public randomness beacon. Each UTC hour’s beacon is verified against a fixed BLS public key. Its signature is hashed with SHA-256 to obtain 32 bytes of randomness.
Compare the pinned chain hash and public key in the downloaded verifier with the drand documentation and quicknet chain information. The verifier uses its own pinned values, rather than trusting an exported ledger’s values.
Chain: quicknet
Scheme: bls-unchained-g1-rfc9380
Genesis: 1692803367 · Period: 3 seconds
Coverage: 2026-08-01T00:00:00Z
Chain hash:
52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971
One history. One assignment order.
- Start at August 1, 2026, at 00:00 UTC. Process hours in chronological order with no gaps.
- Calculate each beacon round locally:
floor((unix_seconds − 1692803367) / 3) + 1. - Verify the round’s BLS signature. Calculate
SHA256(signature_bytes)and compare it with the recorded randomness. - At midnight, hash the day prefix, randomness bytes, and a four-byte big-endian counter starting at zero. Take the first 20 bits and encode four Crockford Base32 characters. If an earlier date owns that code, increment the counter until the first unused code is found.
- For each hour, repeat with the hour prefix and first 10 bits, producing two characters. Skip suffixes already assigned to an earlier hour on that UTC date.
- Compare every code, counter, round, and coverage boundary with the ledger. The verifier fails if anything differs.
Day prefix: UTF8("4today-day-v1:")
Hour prefix: UTF8("4today-hour-v1:")
Input: prefix || randomness_bytes || uint32_be(counter)
Digest: SHA256(input)
Alphabet: 0123456789ABCDEFGHJKMNPQRSTVWXYZDay codes are unique throughout the permanent record. Hour suffixes are unique within each date. Leading zeros are preserved.
Verify locally, without our API.
You need Node.js 24 or newer. Save the downloads as ledger.json and verifier.mjs in a new directory, inspect the verifier, then run:
npm init -y
npm install drand-client@1.4.2
node verifier.mjs ledger.json
The verifier runs offline once its dependency is installed. It checks every included beacon signature using the drand client, then reconstructs all assignments. It reports the number of verified days and hours and the latest included timestamp.
A successful replay verifies the exported history through its stated endpoint. Compare that endpoint with the UTC hour you intend to inspect to check that your export is current. An internally valid older export remains a valid record of an older interval.
A small, permanent public record.
| Field | What it establishes |
|---|---|
config | Fixed coverage start, protocol version, and quicknet parameters. |
beacons | Rounds, signatures, and derived randomness. |
days | Day assignments and accepted counters. |
hours | Hourly assignments and accepted counters. |
coverage | The first and latest included UTC hours. |
Collision resolution depends on earlier assignments. A counter alone is insufficient: replaying the ledger confirms that every skipped candidate was already occupied.
These short codes are practical freshness references. The ledger verifies their derivation and assigned time; it does not authenticate external items that include a code.