Portfolio · Shipped and running
Sentenced
A word puzzle where one hidden sentence fills the whole grid, and every word hands off to the next.
- Status
- Live
- Started
- 2026-08
- Visit
- sentenced.ca ↗

Written by Hollis from the project's own notes.
What it is
A grid holds one hidden sentence. Every word of the sentence is in the grid, chained in order: wherever one word ends, the next begins in a touching cell, or on that very cell when the last letter of one word is the first letter of the next. A theme prompt nudges without naming.
Each rule earns its place:
- No filler. Every cell belongs to a word. That makes a real logic move possible: you can reject a candidate word without knowing any other word, because taking it would strand cells the chain can never reach.
- Every word bends. Nothing reads in a straight line, because the eye finds straight lines for free. Straight runs are left to decoys.
- Words never cross, including diagonally through the same two-by-two block.
Because the solution is a single 48-cell walk, a player can sweep several words, or the whole sentence, in one motion. That is a perfect chain, and it turns the game into solve it in your head, then execute.
How it works
Drag a word, or tap it letter by letter. A real word that isn't in the sentence fills the hint bar; anything else is "not in word list". Nothing explains why a word is wrong, because working that out is the game. Words found cold are scored as scanned, and words found next to one you already hold are scored as deduced. You can guess the whole sentence at any time, which makes guessing early the game's risk dial.
When a puzzle has more than one legal solution, the game accepts all of them and narrows the set as you play. Progress survives a refresh. The finished board shows a coloured rail for each word, and the result can be shared as a row of squares, one per word, coloured by how it was found.
Closed loops. If the last word ends next to where the first begins, the chain is a cycle. A sentence that still reads when rotated then has two legal readings of the identical grid, and coming in through the second door reports "Alternate ending!"
Built with
- Front end: React and Vite. The game rules live in a pure JavaScript module with no interface code in it, covered by 24 headless tests, each paired with a case that must fail.
- Dictionary: each puzzle ships with every real word that can be traced in its grid, 996 words in 6 KB for the first puzzle. It is complete by construction.
- Puzzles as files: each puzzle is a JSON file fetched at load, so publishing needs no rebuild and every past puzzle stays playable by its own link.
- Puzzle Master: a generator that asks Claude for theme-and-sentence pairs, then validates the letter budget, shared links, word lengths and repeats locally before anything expensive runs.
- Pipeline: propose, validate, tile the grid with a backtracking search, enumerate every solution, build the word list, then publish. The publish step opens the live site in a real browser and confirms the game renders.
Where it stands
Live at sentenced.ca, with puzzles published through the automated pipeline and every past puzzle playable by link. On the list of ideas: a daily cadence, an archive page, and custom puzzles where the hidden sentence is a wedding invitation or an announcement.
Pictures

