SPELT
What the game sends, and what it never sends.
SPELT has no accounts and no cookies. Every puzzle is generated ahead of time and solved entirely on your own device, and the game works with the network off.
Three things travel, and this page is the whole list of what is in them. Two of them happen on their own, and the usage data switch in Settings turns both off together. The third is the drop box, which sends nothing until you type a message and press send.
The usage stream
The usage stream is how the game knows whether it is any good: whether people come back, where a puzzle loses them, and whether anything is broken. It is anonymous, it is never on the path of play, and every field it may carry is listed below.
Why it is allowed to happen at all: this is first-party audience measurement, done for the game itself, with no identifier that survives clearing site data, no profile, no advertising, and nothing passed to anyone else. Under UK and EU rules that is the legitimate-interests basis rather than consent, and the switch in Settings is the objection you are entitled to. Under US state privacy law there is no sale and no sharing, so there is nothing to opt out of — and the game honours Global Privacy Control anyway: a browser sending that signal is read as having turned the switch off, and nothing is sent.
What identifies this browser
deviceIdRandom id for this browser, or for this install of the app, stored on your device. Not derived from anything about you, your hardware or your network. Clearing site data, or deleting the app, destroys it permanently
firstPuzzleThe puzzle number this browser first played, so a returning player is not counted as a new one
sessionIdRandom id for this tab or app session, held in memory only and destroyed when the tab closes or the session ends
visitDaysHow many separate days this browser has opened the game
How the puzzle went
backtracksHow many times a letter already placed was taken back
bucketWhich time band the solve fell in, the same band the day's readout counts
cleanWhether it was solved without taking anything back
ctaWhich onward button was pressed — the solved card's next puzzle, a handover to an unplayed today (the welcome's, or any card's once the daily outranks the road), the welcome's handover to the board a share link named, skipping the welcome, falling through to practice once the archive is spent, the Play button that closes How to play, or the line in Settings that hands the game to somebody without a solve first — so a door offered can be told from a door used One of: nextPuzzle, todaysPuzzle, linkedPuzzle, skipWelcome, practice, helpPlay, invite.
depthHow many of those buttons this session had taken in a row, the first being 1, so a chain of puzzles can be read by how far it ran
fromWhere the iOS app's daily reminder was asked for: the offer after a first puzzle, or the switch in Settings One of: prompt, settings.
hardWhether hard mode was on, which plays without the row ticks
hintWhether any hint was used
hintsHow many hints the board has spent: hints are repeatable, the first is the one the puzzle ships with and every one after it is a rescue
kindWhy the game spoke up about the hint: the board had gone quiet for a while with letters still in hand One of: idle.
linkedWhich puzzle number the arriving share link named, when one did — what the link asked for, so a puzzle event for that board says whether the tap became a play
minutesThe time the iOS app's daily reminder was moved to, in minutes after midnight on the device's own clock
modeWhether it was the day's puzzle, one from the archive, the welcome puzzle, or a practice board One of: daily, archive, welcome, practice.
onWhat it was set to
panelWhich panel this was One of: help, settings, stats, archive, win, giveup, feedback, privacy, install, share-fallback.
placedHow many letters were on the board at the time
poolLeftHow many letters were still in the pool when it was left
puzzleWhich puzzle this was: a dated board by its number, the welcome puzzle as 0, or a practice board numbered from 1000000
resumedWhether this continued a solve already in progress
settingWhich switch was thrown One of: hard, sound, usage, motion, text, contrast, theme, reminder.
stageThe iOS app's daily reminder, which the website does not have: the app offered it after a first puzzle and the player took it or said not now; the system's own notification prompt was allowed or denied, or had already been denied; or the reminder's time was moved One of: offered, accepted, dismissed, allowed, denied, blocked, moved.
streakBandHow long a run of days this solve stood on, as a band rather than a number: 0 none, 1 a single day, 2 two, 3 three to six, 4 a week or more, 5 a fortnight, 6 a month or more
viaWhat first showed somebody was there: a press, a key, a wheel or scroll, or the page simply being visible and in front of them for twenty seconds. It separates a person who looked and left from an automated fetch that renders the page and presses nothing One of: pointer, key, wheel, scroll, dwell.
How long things took
msOpenHow long it was open for, which separates a glance from a read
queuedMsFor a batch that could not be sent at the time and waited on your device: how long it waited
sentAtMsHow long this session had been active when the batch was sent. It places each event at the moment it happened rather than the moment it arrived, and its largest value is how long the session lasted
timeMsHow far into the puzzle this happened, counting only time the tab was open and visible
How you got here
campaignA short source tag carried by the link you arrived through, if it had one. First visit only
doorHow this visit was opened: by a link to a puzzle, from the home screen, or from a kind of site (a search engine, a list of daily games, or a social site), and none when it was none of these. Worked out on your device every visit. It carries the kind of site only, never the site or its address One of: link, home, search, directory, social, none.
referrerHostThe site you followed a link from, if any. The host only, never the full address
How the game itself is doing
batchSeqWhich batch this is within the session, so a duplicate can be discarded
buildWhich build of the game this was, so a fault can be tied to a version
flushWhy this batch was sent One of: manual, full, idle, hidden, pagehide, freeze, optout.
installedWhether the game was opened from a home screen rather than a browser tab
messageThe error's own message, with any web address stripped out of it before it is stored
methodHow the share went: handed to the system share sheet, opened and dismissed without sending, copied to the clipboard, or refused outright One of: share, cancelled, clipboard, failed.
offlineWhether the device reported being offline at the time
payloadVersionWhich version of this format the batch was written in
platformWhich version of the game sent this: the website, or the iOS app One of: web, ios.
stepThe install funnel, in order: the browser offered a prompt (or iOS made one impossible), the card showed its line, the browser prompt was accepted or waved away, the app landed — so the funnel's narrowest step can be found rather than guessed One of: offered, shown, accepted, dismissed, installed.
whereA short label for the part of the game that failed
The counters
The readout on the Solved sheet is a second, separate flow. When you solve the day's puzzle the game adds one to a set of counters for that puzzle number, and reads the totals back so the sheet can say how the day went.
The counters are the whole record: how many solved it, how the times were spread, and how many did it clean, with a hint, or in hard mode. Nothing holding a result is stored per player, which is why the sheet can tell you how the room did and can never rank anyone in it.
One thing is stored per device, and only to stop a browser being counted into the same puzzle twice: a short token worked out from your device id and that puzzle's number. It is stored on its own, with no result and no id attached to it, and it is deleted after a week. Because the number is part of it, the token is different for every puzzle, so these cannot be joined together to follow a browser from one day to the next.
Only the day's puzzle is counted. Solving one from the archive changes no total, because a puzzle from three weeks ago solved today is not part of how that day went.
The drop box
The drop box is the game's one text input, and the third thing that travels. Nothing goes through it unless you type a message and press send.
What is stored is what you wrote, the puzzle you were on, and an address only if you chose to leave one. It is deliberately not on the usage data switch: that switch governs collection the game does in the background, and a message you wrote and sent is an act rather than a background collection.
Sending is limited to five messages a day. The limit counts a one-way hash of your network address, salted with a secret only this stack holds, and that counter deletes itself after two days. The address itself is never stored.
How long any of it is kept
Batches are kept in the form they arrived in for 35 days.
The folded daily record of play is kept for 400 days.
What is never collected
- Your name, or any account. There are no accounts. The only address the game ever holds is one you typed into the drop box yourself.
- Your location. Your IP address is never stored: the drop box's daily limit counts a one-way hash of it, salted with a secret only this stack holds, and that counter deletes itself after two days.
- Your device fingerprint, your screen size, or your user agent.
- The letters you placed, the words you spelled, or anything else about the contents of a solve. The game records how a puzzle went, never what was on the board.
- Anything at all, if you turn the usage data switch off. The switch stops the stream, purges what was waiting to be sent, and hides the day's readout.