The three daily puzzles on this site — Ink Ladder, Sum Fold and Unfold — give every player in the world the same puzzle on the same day.
None of them makes a network request. There is no backend, no database and no account. The whole thing is a static file.
The trick: the date is the seed
A pseudorandom number generator produces a fixed sequence from a starting value. Give it the same seed and it produces the same sequence, on any machine, in any browser.
So instead of generating a puzzle and storing it, the puzzle is a pure function of the date:
var day = Math.floor((Date.now() - EPOCH) / 86400000);
var rand = seededRandom('ink-ladder:' + day);
Every browser computes the same day number, seeds the same generator with the same string, and derives the same puzzle. The server never sees any of it because there is nothing for it to see.
The generator itself matters here. Math.random() cannot be seeded, so it is useless for this. We use xmur3 to hash the seed string into a 32-bit integer and mulberry32 to produce numbers from it — both small, fast, and crucially deterministic across engines. A generator whose output depended on floating-point details would quietly give different players different puzzles.
Midnight UTC, not midnight local
The day number comes from UTC, which means the puzzle rolls over at the same instant everywhere rather than sweeping around the world across 26 hours.
The alternative — local midnight — sounds friendlier and breaks the thing that makes daily puzzles social. If your puzzle changed at your midnight and mine at mine, our shared scores would be comparing different puzzles for part of every day.
Guaranteeing a good puzzle without checking one
The awkward part of a serverless daily is that nobody sees the puzzle before you do. There is no editor to reject a bad one.
Each game solves this differently, and the approach is the interesting part:
Sum Fold builds the puzzle forwards. It draws six numbers, applies a random chain of legal operations, and whatever that chain lands on becomes the target. A solution therefore exists by construction — it is the chain that made the target. The generator rejects anything outside a three-digit range, anything using fewer than four of the six numbers, and degenerate operations like multiplying by one.
Ink Ladder runs a breadth-first search across the graph of all common four-letter words connected by single-letter changes. It picks a start word, finds every word exactly four steps away, and chooses one. Because the distance comes from a BFS, the par really is the shortest chain that exists rather than an estimate.
Unfold is constructive: fold a grid twice, punch some squares, and reflect them out. The answer is derived from the puzzle rather than searched for.
In every case the generator cannot produce an unsolvable puzzle, because a solution is part of how the puzzle is made.
The answer pages
Each daily has an answer page, which raises an obvious problem for a static site: the page is built once, but the answer changes every day.
The solution is that the answer page loads the same generator file the game does and computes today’s puzzle in the browser. The two can never disagree, because they are running identical code from the same source.
The surrounding content — how the puzzle type works, what techniques apply, why some days are harder — is static and does not change. Only the specific answer is computed.
What it costs
This design gives up things a real backend would provide, and it is worth being honest about them.
There are no global statistics. We cannot tell you that 43% of players solved today’s puzzle, because we do not know. There is no cross-device sync: your streak lives in one browser’s local storage, and clearing your browsing data ends it permanently. There is no leaderboard, and there cannot be one without a server to hold it.
You also have to trust that the client is honest, because there is nothing to validate against. Someone can open the console and read today’s answer. For a puzzle you play for fun, that seems like the right trade.
What you get in exchange: no outage, no login, no data collected, no privacy policy that has to explain what happens to your gameplay, and a puzzle that keeps working for as long as the tab is open, whatever the network is doing.