How Daily Sorting Challenges Are Generated and Verified
Opening a Daily game does not make a new puzzle on the spot. SortingGames.io keeps a library of checked levels, builds a dated schedule ahead of time, and then loads the level assigned to the current UTC date.
Quick answer
One UTC date, one fixed puzzle
The Daily page reads today’s level ID from a saved schedule. Water and Ball levels are checked with their own solvers. Stack levels are checked by replaying a saved answer path.
Your browser can remember where you stopped, but it cannot swap today’s puzzle for another one.
The Daily Challenge Flow
There are two separate jobs: checking levels and assigning dates. Keeping them separate makes the result easy to test.
- 1Level library
Each game has a stored list of puzzle layouts and an
enabledsetting. - 2Rule check
The Water, Ball, or Stack test checks the layout using that game’s real move rules.
- 3Date schedule
Enabled level IDs are placed into a fixed, shuffled calendar using a saved seed and schedule version.
- 4UTC lookup
When the page loads, the server finds today’s date and returns the assigned level.
- 5Local progress
The browser saves your moves and time on this device without changing the schedule.
How the UTC Date Picks a Fixed Level
The server gets today’s date in UTC and uses a simple date key such as 2026-08-20. Each Daily game has its own schedule, so the same date points to one Water level, one Ball level, and one Stack level.
This is why players see the same puzzle at the same moment. The change happens at 00:00 UTC, not at midnight in every local time zone. If you play near midnight, the date shown on the page may be one day ahead of or behind your local calendar.
There is no random level choice in the page load. A refresh asks for the same UTC date, and the schedule gives back the same saved level ID. Past assignments are kept when schedules are rebuilt.
How Short-Term Repeats Are Avoided
The scheduler does not pick one ID independently every morning. It shuffles all enabled IDs into a cycle. Every ID appears once in that cycle before the next shuffled cycle begins.
If the first ID in a new cycle matches the last ID from the old cycle, the first two IDs are swapped. That stops an immediate back-to-back repeat at the cycle boundary.
The shuffle is repeatable because it uses a saved seed, schedule version, and cycle number. It feels mixed, but it is still testable. It is not a live random draw.
How Water, Ball, and Stack Levels Are Verified
The three games do not share one answer checker. Their moves are different, so each one needs its own proof that a level can finish.
| Game | First checks | How a finish is proved | Saved answer path? |
|---|---|---|---|
| Water Sort | Bottle shape, capacity, color totals, empty space, IDs, and duplicate layouts | Replays the stored pours, then runs the Water solver on the original bottle set | Yes |
| Ball Sort | Tube shape, capacity 4, color totals, exactly two empty tubes, IDs, and duplicate layouts | Runs the Ball solver and checks every returned one-ball move | No; solved when needed |
| Stack Sort | Rows, columns, tile IDs, hidden tiles, hand tile, locks, and move limit | Replays the saved moves and checks for a win with no hidden question tile left | Yes |
Stored route plus solver check
A Water level includes a list of pours. The validator replays that list under the connected-liquid rules and checks the final bottles. It also asks the local Water solver to find a route without adding helper bottles.
Fresh solver path during validation
A Ball level stores its starting tubes, not one fixed public answer. The validator solves the board, then replays the returned path to make sure every move transfers exactly one exposed top ball.
Reference moves, no solver
A Stack level stores the hand, columns, hidden tiles, move limit, and reference moves. The checker plays those moves in order. The level passes only if the path finishes and reveals every question tile.
This difference also appears in the Level Library: Water and Stack can show stored route lengths, while Ball says Solved on demand.
What Keeps a Challenge Out of the Daily Pool?
The schedule builder only uses levels marked enabled. The checker does not quietly repair a bad board or pretend it passed. It reports an error so the level can be fixed or left disabled.
Bad level data
A missing or repeated ID, an overfilled container, a wrong color total, or a malformed tile can stop validation.
No checked finish
A Water or Ball board stays out if its rule-specific solver cannot finish it. A Stack board stays out if its saved moves fail, exceed the move limit, or leave a question tile hidden.
Wrong working space
Water needs at least one empty bottle in validation. Current Ball levels must begin with exactly two empty tubes. Stack uses a hand tile and columns instead of empty containers.
Duplicate layout
Exact repeated Water or Ball starting layouts are rejected. Water also reports very similar bottle arrangements for review.
What localStorage Saves — and What It Does Not
localStorage is the small browser store used to bring back a game on the same device. It is optional: the puzzles still play if browser storage is unavailable.
Saved in this browser
- The current board or stack state
- Move count and undo history
- Elapsed time
- Completion state
- Best move count for that level
- Whether a Water or Ball hint was used
Not chosen by localStorage
- Today’s level ID
- The UTC date schedule
- The challenge library
- Solver or replay checks
- Another player’s progress
- An account or cross-device save
Clearing browser data can remove your unfinished game and local best result. It cannot change which puzzle is assigned to today. The next load still asks the server schedule for the same UTC date.
The Actual Testing Process
Before a set of Daily levels is ready, the checks move from the smallest part to the full page. This is the order used by the project’s current scripts and pages:
- Read every enabled level. Check its ID, label, container or column data, capacity, and other required fields.
- Check the rules. Count colors, verify empty space, and reject moves or states that the game itself would not allow.
- Prove a finish. Solve Water and Ball with their own move code. Replay the stored Stack path with the Stack move code.
- Check the schedule. Make sure every scheduled ID is enabled, full cycles contain no duplicate ID, and neighboring dates do not use the same level.
- Simulate reloads. The Ball and Stack production tests read today’s ID repeatedly and confirm that it stays the same. Water uses the same fixed-date lookup on the live page.
- Test the page. Open today and archive routes, make moves, undo, restart, use the available hint or replay, reload, and confirm that local progress returns without changing the puzzle.
The checks behind this guide
validate-water-sort-challenges.js checks the Water pool. validate-ball-sort-challenges.js and the Ball production test check the Ball pool and schedule. The Stack production test validates every Stack level by replaying its stored moves and also checks the schedule.
This is also why the site can explain difficulty with real data instead of guessing. The puzzle difficulty guide reads the same enabled levels, and the Daily game comparison explains what playing each rule set feels like.
See the System from the Player Side
Open the library to browse the reusable levels, or play today’s fixed challenge in any of the three rule sets.