The build story
The board is your only clue.
Close Enuf is a daily guessing game played in pictures. At seven each morning a prompt drops, something weird, specific and slightly unreasonable, and nobody is shown it. You upload a picture anyway: a photo, a drawing, a screenshot, something a machine dreamed up. A judge scores it out of 100 on how close you got and says one cheeky line. That score, and everyone else’s on the board, is all you have to work out what the prompt was. Five shots until seven at night, then the prompt is revealed and a winner crowned.
It went from an empty Laravel app to live at close.div.nz on 14 August 2026, and has had a prompt every day since. The tension is the whole game: waiting buys information, because there are more shots on the board to read, and costs multiplier, because a shot at 7am is worth one and a half times and a shot at the wire is worth one. Every decision below protects that trade.
- shots a day
- 5 shots a day
- for a shot at 7am
- 1.5× for a shot at 7am
- commits since 14 August 2026
- 188 commits since 14 August 2026
- tests
- 1,293 tests
- a day to run
- 24c a day to run
What a shot is worth
Two multipliers, both frozen on the row the moment you upload. The time multiplier starts at 1.5 and decays in a straight line to 1.0 at the close. The order multiplier is 1.0 for your first two shots, then 0.9, 0.8 and 0.7. Your day is your single best shot, not the sum, so the first two are your real chances and the rest are cheap probes. Without that taper, five progressively better-informed shots would be free.
Points per raw point, by the hour and the shot
The day the board went dark
A rival’s shot that scores 85 or better keeps its rank, its name and its points on the board, but its image is held until seven, because a spot-on image is not a clue, it is the answer. Without the hold, one perfect shot at nine in the morning ends the day for everybody. The lock launched at 70, and that was wrong: the judge’s own bands put 60 to 74 at a genuine good-faith attempt, so a normal day’s board went dark and stopped being a clue at all. It sits at 85 now, and a held frame shows a blur rather than a grey square.
Then came the day the prompt was “the most confused fruit in your kitchen right now” and the board drew a kettle, a cat, the sun and a stop button. The rule until then was that there is no hint and there must never be one. It was reversed once, deliberately: with nothing to orient on, the first shot of the morning is a coin toss rather than a bet, and a coin toss is not worth 1.5× to anybody. So there is one line a day under the sealed prompt, and a guard refuses any line reusing a significant word of the prompt. For that one it could say neither fruit nor kitchen, and wrote something like “indoors, and having a bad day”.
A picture of the clue
On 19 September a player screenshotted the clue and uploaded that. It scored 75, the ninetieth percentile of every score since launch. Two of the game’s own rules had been pointed at each other: the clue must be true of the prompt, and the judge reads words in a picture as content, because a screenshot is a legal shot. A picture of the clue was a right answer written down. A harness re-ran the trick against every closed day. It paid on 9 of 33, and fired at seven in the morning it would have won six of them outright.
The obvious fix was a line in the judge’s rubric. Three wordings were measured against 32 real photographs and every one bent honest scores: the word DUST, finger-drawn in real dust, fell from 72 to 15. You cannot add a veto to a scale without bending the scale. So a second, separate question is asked, only when the judge already liked a shot, and it asks how the image was made rather than what is in it. It caught 210 clue shots out of 210 with no false alarms on real frames. The screenshot scores 0 now, a fridge-magnet photograph still scores 76, and no score already given was changed.
The same picture gets the same number
One photograph, uploaded four times, scored 75, 80, 45 and 50. On a game with five shots and a leaderboard, a scale that drifts wider than the gaps that decide a day makes re-rolling your best shot the strongest move there is. The judge now scores at temperature zero, against a rubric and nothing that varies with the board, and a shot whose bytes match one you already had scored today is answered from the earlier row without asking the model.
In September the writing moved to a newer model, which took a whole shot from 2.3 US cents to 0.3. The score stayed on the old one. Asked forty times about two real winning pictures, it gave one of them 76 twenty times out of twenty, where the new model scattered over 20 points: the re-roll problem back again. Being the same answer twice is the whole job.
The verdict, with its working shown. Thirty raw at a 1.417 time multiplier on a first shot.
Seven o’clock. The prompt comes out, the winner gets the gold frame, and the countdown to tomorrow starts.
The player who arrived by accident
For the first week the board was my family. Then somebody went looking for a domain that had never been set up, a DNS record pointing the wrong way put him here instead, and a stranger was standing in front of a game he had not gone looking for. He played. On 9 September 2026 Gerald was top of the standings, ahead of everyone who had been there from the first prompt. Nothing was changed to keep him. He is the only player here who was never invited, and he has not missed a day: thirty-four in a row on 24 September.
A thumbnail, and nothing bigger
Your photograph is published as a 512-pixel square and at no larger size anywhere in the game. The reason is not rivals; it is you. You photograph whatever is in front of you in the four minutes before the window shuts, and the address on the parcel is in it, or whoever is reflected in the window. A thumbnail on a public board is what you agreed to. A file somebody can pinch into is a different thing, and the board is archived. You can delete any shot you took and both stored objects are destroyed, but the slot it spent is never given back, or delete-and-retry would make five a day mean nothing.
That promise turned out to be one word wide. Every size of a picture sat in one folder under a plain name, so editing the last word of a published address fetched the uncropped photograph, or, on a held frame, the very square the game was refusing to show. Each size now carries a name that cannot be worked out from another, and the original is private.
A webhook hears everything
There is no advertising and nothing to sell, so on 2 September a box went in the footer: chip in through Stripe, if you like. The first live donation was NZ$5, from me, and it made SkyRunner, my Garmin game on the same Stripe account, read the bare user id as one of its own, book a Pro sale and push a notification to a real person, naming a stranger. A webhook endpoint is not scoped to the app that created it: subscribe to a completed checkout and you receive every completed checkout on the account, and there is no filter to switch on.
So an app on a shared account has two obligations, and this one failed both on its first live day. Mark what you send, with every key namespaced. Ignore what is not yours, and answer 200 when you do, or Stripe retries an event you deliberately dropped, for ever. Every other app on the account was audited that afternoon.
Honestly: cents a day
The footer of every page carries a running balance: what the game has cost to run since 15 August, against what players have put in: gold when it is covered, the safelight red when it is short. The judging is priced per call; the server is a share of a box that runs about twenty-five other sites, and the page says so. On 24 September 2026, forty days in, it read NZ$9.55 to run against NZ$10.00 chipped in, about 24 cents a day, and the figure was gold. A game whose entire business model is a box in the footer, and whose whole point is that the board tells you more than the prompt ever would.
Got a game that needs a judge, a clock and a board, and has to cost cents a day to run? Here’s how we could work together.