Playground
The Playground imports @agntn/puzzles into the page and runs it in your browser. Every show, list and verify is the library's own answer, through the same executors the MCP server and the extensions call. Nothing is sent anywhere. The docs worker serves the page and answers one balance route. That's it.
| Operation | Runs | Tool equivalent |
|---|---|---|
| Show | showTool(id) and the record behind it | puzzles_show |
| List | listTool({ collection, status, withPubkey, limit }) | puzzles_list |
| Verify | verifyTool(id) | puzzles_verify |
| Balance | /api/balance/<id> on the docs worker, which runs puzzle.balance() | puzzles_balance |
| Collections | collectionsTool() | puzzles_collections |
| Authors | authorsTool() | puzzles_authors |
| Author | authorTool(key), which takes a collection key too | puzzles_author |
| Stats | statsTool(), which loads every collection | puzzles_stats |
The sample chips load the fifty-five puzzles the landing walks through, one per collection at least. Want to see a PuzzleNotFoundError? Load a sample and change one character. The author operation gets a chip per author key, and a key nobody published under answers with UnknownAuthorError and the keys that do exist.
Every state is a link
The form writes itself into the address. /playground?op=show&id=bits%2F71 opens the page on that answer, /playground?op=list&collection=zden&status=unsolved on that list, /playground?op=author&key=peter-todd on that author. Paste it to someone and they see what you saw. The permalink button copies the current one.
The two snippets
The request panel prints the same call as a CLI line and as a tool invocation in JSON, both with copy buttons. They're built from the form, and a limit reaches both: --limit 50 on the CLI line, "limit": 50 in the tool call.
The full response
The response panel summarises the answer: the record with its readout, the verdict, the balance, the author, the totals, or the rows of a list. The text the tool actually returned opens from Full tool response in a dialog, with a copy button that copies it as is. The footer says where the answer came from and how many milliseconds the call took in your browser.
What green means
Verified means the published key derives the stored address. It doesn't mean the address holds anything, and the page repeats that under every verified puzzle. The balance is the one number here that didn't come from a record. The worker asks the chain's explorer and keeps the answer for five minutes. What you see is the explorer's word, not the library's.
One page per puzzle
A show result links to the puzzle's own page, /collections/bits/71, with the whole record: every key row, every transaction with its explorer link, the images the record ships, the JSON, and the text a model gets. Every collection page lists its puzzles the same way. All 558 have a page.
The landing
The panels on the home page walk through the same fifty-five puzzles on one clock. Each step loads its collection through get(). That's the lazy registry doing its thing where you can watch it. Hover a panel to pause it. The arrows under the record step it by hand.