wanessalabs games production October 28, 2026

Wanessa Labs Games Learn

A Learn tab for the games hub. Every one of the 36 games gets a short animated reel, then its rules, how to win and what to play next.

ReactTypeScriptZodVitestPlaywrightCloudflare Pages
Deal me a game: a finite, shuffled deck of every hub game, one card per tap. It ends, and it never plays anything by itself.
Deal me a game: a finite, shuffled deck of every hub game, one card per tap. It ends, and it never plays anything by itself.
A one-pager. The reel on the left, and the rules, the tips and what to play next on the right, all from the same content file.
A one-pager. The reel on the left, and the rules, the tips and what to play next on the right, all from the same content file.
Every beat of the Chinese Checkers reel. Each marble move is replayed through the game's own engine in a test.
Every beat of the Chinese Checkers reel. Each marble move is replayed through the game's own engine in a test.
Inside a game, How to play opens the reel in a sheet. Opening it never resets the game, and timed games pause while it is up.
Inside a game, How to play opens the reel in a sheet. Opening it never resets the game, and timed games pause while it is up.
The kids shelf. Kids reels show one turn and one encouraging tip, with no scores and nothing that leaves the Kids Hub.
The kids shelf. Kids reels show one turn and one encouraging tip, with no scores and nothing that leaves the Kids Hub.

I have built 36 games on this hub and explained almost none of them. Most had a rules panel somebody had to find, read and trust. Mahjong had a faan table. Big Two assumed you already knew the suit order. The games that most needed explaining were the ones I explained least.

The Problem

Rules text is the wrong medium for a rule. “A claim counts every card on the table” means nothing until you watch four hands turn face up and the fib come apart. People learn a card game by watching someone play one hand.

So I wanted every game to have that hand: thirty to fifty seconds of the game played for you, slowly, with each rule shown at the moment it matters.

What It Is

A Learn tab on the hub, with three ways in. Deal me a game shows one game at a time from a shuffled deck, and the deck ends. Pick for me asks how long you have, who is playing and what kind of thinking you want, then names three games and says why. Browse all lists everything by section.

Each game gets a one-pager: the reel, the facts at a glance, the rules, how to win, the game’s own words, and what to try next. Inside every game, a How to play button opens the same reel in a sheet.

Kids games have their own shelf inside the Kids Hub. Their reels show one turn and one encouraging tip, with no scores, no timers and no links out.

How a Reel Works

Every reel is a script of beats, and each beat is a list of moves: this card flips at 900 milliseconds, that panel slides in at 1,200. The script compiles into a timeline where the position of everything on stage is a pure function of time. Nothing is recorded and nothing depends on the clock, so any frame can be drawn on demand. That is what makes a screenshot, a test or a future video export of any moment possible.

The first reel was a prototype for Fibbers Poker, a single HTML file. I ported it as is, and a test now checks the port against frames read out of that prototype. Its pacing became the bar for the other 35.

Rules Come From the Game

This was the rule I cared about most. Every caption traces to the game’s own How to play text, or, where a game has none, to help text written from its code. Every percentage on screen is worked out by the game’s own engine at build time. None is typed in by hand.

Holding to that overruled my own creative brief eleven times. I asked for a Ski Rash reel that weaves through gates, and Ski Rash has no gates. I asked for a Paper Squadron hook where you deflect a shot back at an enemy, and a roll cancels a shot, it does not deflect it. I asked for a 2048 cascade in one swipe, and a tile can only merge once per move. My tip for Low Roller was backwards. Each time, the reel follows the game.

Built in Parallel

I wrote the engine, the player and the first reel. The other 35 were written in parallel, one game each, against a written authoring guide. Each reel ships with a test file that replays every move on stage through the game’s own engine and checks that every claimed outcome is true: the merge, the caught bluff, the winning tile.

Of 76 tips, 69 are backed by an engine check. The other seven ship marked as drafts for me to review.

What I Learned

Writing a reel turned out to be a good way to audit a game. Making the claims checkable surfaced things I had not seen. Dishwasher’s plates-touching rule counts a large plate as its own neighbour. Drop4 announces “You wins!”. The help text was wrong about Blackjack’s hard 12 in a way the strategy chart contradicts. Each one surfaced when I tried to show it on stage and a test refused.

Not Included

No accounts, no tracking and no network calls. A reel is part of the game’s code and plays offline. The only thing Learn remembers is whether you have already dismissed the “New here?” chip on a game.

No autoplay. A reel starts when you press play, stops at its last beat, and never rolls into another one.

Development timeline

95 logged updates over 177 days, 5 May 2026 to 28 Oct 2026.

  1. Learn, a how-it-works reel and one-pager for every gamefeature

    A Learn tab on the hub, and a "How to play" button inside every game. Each of the 36 registry games has a short animated reel (Hook, Rules, How to win, Try) and a one-pager under it with the rules, tips, words to know and what to play next.

  2. Anagram Daily dictionary lookup pointed at a dead originfeature

    Reported: clicking a found word in Anagram Daily's word list says the dictionary cannot be found ("Couldn’t reach the dictionary. Check your connection and try again.").

  3. Anagram Daily explains the words you findfeature

    Tapping a word in Your Words or the Answer Bank opens the bundle's existing modal with up to three meanings. The words became <button>s and one delegated click on #sheet-content covers both lists.

  4. The SEO pass shipped twelve live 404s, and why the lists were the bugfix

    The same cause, eleven more times. It also means every real route must exist as a file, and the generator drove off two hand-kept lists.

  5. the Time Machine sold a day the play path would not openfeature

    The bug, exactly. Pick any recent date in the Time Machine calendar, click Sudoku, and get "That day is not unlocked yet." Not a Sudoku bug, and not the per-game calendars the report guessed at: the date-wide unlock was already in place…

  6. The Time Machine covers ten games, and the print export shipsfeature

    Five games were added and every one of them satisfied the first and broke the second, each in its own way. That is the finding worth keeping: the condition people check is not the condition that fails.

  7. shipped to production, and the precache ceiling nearly stopped itfeature

    Deployed to games.wanessalabs.com. The Kids Hub's guided practice run, the parent report, the word search fix and its reveal, and one way out of every game.

  8. one way out, and one lemonfeature

    "All games" was hardcoded to / in FIVE places and the first fix changed one. That one was InGameTopBar, which only games adopting GameScreen use.

Show the earlier 87 entries
  1. the word search was listing words it had painted overfeature

    Reported: "in the word search game, I'm not able to find half of the words." Half was exact. On the Animals theme at seed 0, six of the ten listed words were not in the grid at all.

  2. continuing the day from wherever you startedfeature

    Fixed, from a real play: "after completing the math drill for the first today game, it doesn't have a logical way to continue the day's work. The 'All games' arrow button goes to the daily hub." Three defects on one route.

  3. today's practice becomes a run, and the top of the Kids Hub loses a duplicatefeature

    Built: the daily practice list turned into a session with a progress bar, a round end that offers the next game instead of a dead end, a perfect-round headline, and the removal of the Next-up card.

  4. what walking the live site foundfeature

    Built: the round-end screen reaching both pilot games, a required kid-facing label on every skill, a real parent door in the kids footer, an ungated way out of the gate, and a child switcher on the report. Deployed to…

  5. the Kids Hub becomes a path, and the parent report finally answers its own questionfeature

    Built: a Next-up card and a walkable path on /kids, a round-end screen that names what was practised, a skippable grade picker, and four cross-time modules on the parent report: what a child keeps missing down to the exact fact, what to…

  6. The crossword bank reaches full size, and the maker that was never broken turns onfix

    The report was "there's books in the bank, but I don't see it working", and the maker was not broken. It held 735 against a threshold of 3,000, so the page rendered, the coverage bars drew, and the button was dead exactly as designed.

  7. One slot order for thirty-six games, and four of them adopting itfeature

    Thirty-six games were built one at a time and drifted apart. Measured before writing anything: the body column at 1280px ran from 384px (Low Roller) to 1216px (Mahjong), a 3.2x spread.

  8. A Reddit Games section, and the first cards that leave the originfeature

    What shipped. A Reddit Games section on the Daily hub, directly above CampPing, carrying two cards that open a post in r/wanessalabsdev rather than a route on this site: Dishwasher Daily and Poker Daily.

  9. Clem's Pick, and a README that told you to compete with your own deploydocs

    1. Three games carry an owner's recommendation.

  10. Devvit distribution surface & Dishwasher Pilotfeature

    Built: established devvit/ as the 6th distribution rail for Wanessa Labs Games.

  11. Registry-driven daily calendar system & Time Machine modefeature

    Replaced the hand-maintained Archive tab list with a registry-driven daily calendar system (DailyCapability) and Time Machine mode (?date=YYYY-MM-DD).

  12. Crayon Box, Sticker Book, and a kids grid that finally has its own facesfeature

    Built: the kids palette re-solved in gamut against a contrast floor; cards as die-cut stickers; Lemon Coach reaching the kids hub; the coin chip back with a different destination on each shell; owner art for all twenty kids games; and the…

  13. kids.wanessalabs.com becomes a redirect, and the kids shell stops selling thingsfeature

    The kids surface stays a route on this hub, and that was the whole argument. A separate site meant a second Pages project, a second service worker, a second install prompt and a permanent second copy of every game engine, all to hide four…

  14. Lemon Coach, on every game and on the hubfeature

    Built: the Coach reached all 36 games and grew a character. Two chips every game answers from authored text ("How do I play?", "What's a good strategy?"), live-state advice in the seven with a real advice engine, and a one-time…

  15. Stats coverage. every game reports, both surfaces read one contractfeature

    Fifteen of the hub's thirty-six games had reached production declaring no stats at all, so the strip and the profile under-reported what a player had actually done. Phases 1a, 1b, 2 and 3 of a gated pass.

  16. Chinese Checkers, a star board with a coach that only claims what it can provefeature

    A 27th game, built engine first and gated so no UI existed until the rules passed. 209 tests across 11 files.

  17. One coach, seven games' worth of advice, and a closed question cataloguefeature

    Built: a single Coach character at the shell level. A docked bubble on any game route that expands into a chat popout, answers questions from that game's own engine, and is wired into Craps, Poker Friday and Blackjack.

  18. Blackjack, a trainer that grades every decisionfeature

    A 26th game, and the first whose point is learning rather than winning. Three surfaces over one engine: a table with an always-available coach, a coached mode that grades each decision against basic strategy, and a drill that flashes…

  19. Newsletter link fixed, Tip Jar folded into Creditsfix

    Built: the footer's Newsletter link now points to https://www.listsof30.com (the bare domain does not resolve); the same bare-domain bug is fixed on the PlaceholderTile subscribe link. /tip is gone: its content (the Stripe tip card and…

  20. A shelf of your own, a badge that expires, and a streak worth keepingfeature

    Built: starred favourites with a "Your games" row at the top of the hub; a "New game" badge derived from the updates feed; and a hub streak that counts days you finish three DIFFERENT games.

  21. One mark per thing, one panel per job, and the shop moves to the topfeature

    Built: a shared DisclosurePanel owning the Coach and stats panels in five games; a required mark field on every one of the 34 registry entries; the coin on the Archive Calendar's priced cells; and a BuyBar putting both paid paths at the…

  22. The coin goes back to being the coinfeature

    Changed: CoinGlyph renders the 🪙 emoji again instead of the outline SVG ring it shipped as on 2026-08-17. One component, one CSS rule, and the mark changes on every spend control in the hub.

  23. Shell polish before the public publish: 21 itemsimproved

    A diff-first pass over the hub shell, not the games. Everything below was audited against the working tree before it was written; three of the twenty-one turned out to be different from how they were reported, and those corrections are…

  24. Mahjong gets one table read, shared by the bots and the coachfeature

    445 mahjong tests, 4443 across the repo, tsc clean. Verified on production by Playwright (/games/mahjong 200, non-empty #root, the new tier labels present in the served bundle), not by status code alone.

  25. Supporters get a mark, and Settings stops selling a tipfeature

    Why this started: the owner asked whether a paid Supporter could get a special avatar mark, a thank-you on the daily hub, and a "Be a Supporter" link in Settings replacing the tip link.

  26. The Archive Calendar had no door, and offered no dailiesfeature

    Two independent failures, both invisible to a green suite.

  27. Mahjong phase 4: How to play, bigger tiles, revealed handsfeature

    355/355 mahjong tests, tsc -b clean, verified live on games.wanessalabs.com with Playwright.

  28. Last Card — the Play On winner shows themselves before the scoreboard doesfeature

    Nothing on screen said so — a player had to wait for everyone else to go out before learning who'd already won. All three clear automatically once the round is actually scored.

  29. Merged with Mahjong, and the collision was realfeature

    The Mahjong ledger collision was not a merge conflict and git had no opinion about it. The merge was textually clean.

  30. The monetization runbooks, and two paid-grant paths that were built but never reachedfeature

    Why this started: a review of what still had to be done on the Stripe side before the first live sale. Checkout runs on Payment Links, so most of the remaining work is dashboard configuration rather than code.

  31. The currency gets a face, and the shop gets a doorfeature

    The trigger was a question about Drop4's undo, and the answer was that it had shipped six days earlier and nobody could see it. Both shop components took their entire appearance from className and style props, so twelve games had each…

  32. Two mobile bugs the owner hit live, fixed and shippedfix

    Built: (1) ProfileModal's dialog card had no height cap — only the inner stats list was capped at 50vh. On a short mobile viewport, or once a player had enough games/streaks to fill the list, the fixed-centered card grew past the viewport…

  33. Catalog v2, and what a coin is not allowed to buyfeature

    Built: the coin-action catalog expanded from 11 actions across 6 games to 24 actions across 17 games, plus a second registry of 12 persistent unlocks and 3 category passes. Branch feat/coin-actions-v2, cut from feat/supporter-pack.

  34. Three routes into a shop nobody could reachfeature

    Built: persistent entry points into /coins and /supporter from the header, the profile modal, and the footer.

  35. The Archive Calendar, and selling a month with nothing in itfeature

    Three rules the implementation had to enforce, not just describe.

  36. The supporter flag, the extra roll, and a card rule I would have had to inventfeature

    Built: the Supporter Pack's headline promise (every outfit and accessory) and Lemon Dice's bought extra roll.

  37. Low Roller: the match length becomes a choice, and the board splits with itfeature

    The 2026-08-09 build replaced a one-turn game with a fixed three-round match.

  38. Monetization: a ledger, because an integer cannot answer "did this order already pay?"feature

    coins existed and had almost nowhere to go. Three sinks, all cosmetic: a 40-coin outfit, a 90-coin outfit, a 60-coin gacha pull.

  39. One balance, and four ways a ledger ref can be quietly wrongfix

    Any UI showing a number would have shown the wrong one.

  40. Poker Friday: a named character, eight seats, and a look at the hand you foldedfeature

    Three unrelated gaps. Every bot name was interchangeable, so the table had no personality.

  41. Poker Friday's reveals become the coin economy's first spendfeature

    One button did two different jobs, so neither could be priced. It showed your folded hand and any missing board cards together, whether or not there was anything to deal.

  42. The coin balance moves into the headerfeature

    The coin economy had one readout: the wardrobe. Coins were awarded at the end of a game by the popup and spent two screens away, so the balance was a number you went and looked up rather than one you watched.

  43. The entitlement Worker, and two things the Stripe docs correcteddocs

    paid grants needed a server. Three endpoints, no database, no webhook, because Stripe is the store of record and there is no orders table to write.

  44. The offer sheet, and a paywall across a game's front doorfeature

    Built: CoinActionButton and CoinOfferSheet, the two shared pieces every game's coin action renders through, wired into Poker Friday.

  45. The shop pages, and three things only a screenshot foundfeature

    Purchase UI sits behind !isNative(), because store policy requires in-app purchase for digital goods inside a native build and this hub ships Capacitor targets.

  46. One stat registry drives both surfaces, and Lemon Dice finally shows up on themfeature

    ProfileModal and the home StatStrip each carried their own hand-written per-game markup for the same numbers, so a game landing in one never automatically reached the other. Lemon Dice shipped the same day, in the Hall of Records merge,…

  47. Low Roller: three-round matches and a device leaderboardfeature

    Low Roller was one turn long. Every player emptied all 17 dice once, lowest penalty won, done in about ninety seconds.

  48. A design token is only half-declared until Tailwind knows about itfeature

    A 2026-07-30 note recorded this as two broken titles and left it alone "because fixing them changes two other games' cards".

  49. Adaptive practice: a progression layer under the Math Trailfeature

    Difficulty chosen from a child's own history, every answered question recorded, and a parent report that names the problems instead of the questions. Six games opted in; nine creative games untouched.

  50. Coin award popup at the completion funnelfeature

    The hub has paid coins for every win since the avatar system shipped, and never told anyone. reportResult computed the earn, committed it, and returned void, so the balance simply changed between one glance at the header badge and the next.

  51. Paper Squadron: collectible ringsfeature

    Rings placed along the rail, flown through for points, with a streak multiplier and chain bonuses.

  52. Rings validated in playfeature

    Owner played the rings on production and reports the game plays well. That closes the largest open item on the previous entry: every claim there was measured or tested, and none of it had been judged by a human at speed.

  53. What's New: a player-facing feature timelinefeature

    A bell in the top bar opens a panel of the ten newest updates and links to /whats-new, a full timeline with shipping-pace stats. The feed is 32 curated entries covering 15 games and the hub itself.

  54. Poker decision journal and 14-name roster merged to main and deployedfeature

    Reported as a rollback; it was an unmerged branch. The owner reported that the Poker Friday version they had been playing, with different bot names and player stats, had reverted.

  55. Poker Friday: a decision journal, real stats, and a coach with memoryfeature

    What changed. The coach reacted only to the current street.

  56. Site-anatomy exportfeature

    Read-only export from prd/lineage/roadmap plus the project page source. Redacted for public use: no commit hashes, no deployment IDs, no hosting-project names, no unlock phrases.

  57. Poker Friday: a rotating bot rosterfeature

    What changed. Every session now seats a different table.

  58. Palette Quest reopened for free play, math still gates coloursfeature

    Every picture in Palette Quest is now playable at any time. The 2026-07-28 entry above gated all 30 pictures behind a daily rotation, one earned per day.

  59. Critter Blocks built: engine, UI, unlocks, hubfeature

    critter-blocks built end to end and registered at /games/critter-blocks. 8×8 seeded daily polyomino placement in a 180-second run, every piece an animal.

  60. Drop4 spec approved (decisions, no code)docs

    No code written. The folder already existed as a README-only stub carrying a rebrand mandate.

  61. Stats surfaced for Drop4 and Critter Blocks; daily difficulty tiersfeature

    Added a Drop4 win stat, surfaced Critter Blocks' existing stats (which were being written and never shown), and gave Critter Blocks a per-day difficulty tier drawn from the day seed. 1010 hub tests green, typecheck clean.

  62. Math Trail, a progression layer over the existing gamesfeature

    Added a journey shell that sequences the hub's practice games into a curriculum ladder for a 2nd-to-4th grader, built five games to fill the concept gaps, and fixed the Spelling Quiz's audio.

  63. Math Trail, part two, daily checklist and the two bugs only a browser foundfix

    Added the daily practice checklist, an avatar-coin bonus for finishing it, opt-in narration, and confetti on hard questions. Then finally rendered the whole thing in a real browser, which found two bugs that a green test suite had been…

  64. Palette Quest, 30 pictures, a daily unlock, and an archive worth keepingfeature

    Palette Quest went from 5 pictures to 30, and its progression was rebuilt around collecting them. Every picture is now earned rather than browsed: one is offered per day, finishing it unlocks that artwork permanently, and anything earned…

  65. 13张 added; shared card core extracted from Big Twofeature

    Started 13张 (Chinese Poker) as a new hub game at /games/thirteen, reusing Big Two's card engine rather than writing a third one. Phase 0 audit only; no code yet.

  66. 13张 shipped: engine, solver, bots, UI, hubfeature

    13张 (Chinese Poker) built end to end and registered on the hub at /games/thirteen.

  67. Added Paper Squadron (rail shooter)feature

    Paper theme: a paper dart versus shuriken / crane / turret archetypes and a paper-dragon boss with a weak point. Architecture: fixed-timestep loop entirely outside React (ref-held World of typed arrays), object pools with zero hot-loop…

  68. Critter Blocks spec approved (decisions, no code)docs

    Design spec written and approved for critter-blocks, an 8×8 daily seeded polyomino-placement puzzle where every piece is an animal.

  69. Canva front-matter round trip for the Sudoku book makerfeature

    Desire: edit the book's cover and first pages personally, rather than only downloading a finished PDF.

  70. Big Two — a new card game vs. 3 AI, with a strategy Coachfeature

    What: Added Big Two (Choh Dai Di) at /games/bigtwo — the Cantonese climbing game, solo vs. three AI opponents (Alice, Louis, Angus).

  71. Branded game art on the home page cardsfeature

    What: Nine branded illustrations (the lemon mascot plus a per-game motif) now front the home page cards, replacing the pure-CSS mini previews for sudoku, linked, dishwasher, anagram, 2048, emoji-match (Snack Pop), crossword, low-roller,…

  72. Profile stats expanded to match what storage already trackedfeature

    What: The profile showed only Sudoku, 2048 (512+ reached), Linked, Poker Trainer, and Low Roller, while the remaining stats were already being tracked in storage and already shown on the home page. The profile was the surface that was…

  73. The profile modal was dead code; made reachable, plus a player namefeature

    ProfileModal was mounted and fully built, and nothing could open it. The name input and the "Good {morning}, {name}" greeting already existed too, so the greeting had been permanently falling back to its nameless form: the name could not…

  74. Avatar on the kids tabfeature

    / Dress up →" card under the header, showing the collectible character (composeAvatarSvg) with the coin count and a link to /wardrobe. Larger avatar (64×90) than the hub greeting; styled as the kids page's card-puzzle with the accent-2048…

  75. Cross-game collectible avatar systemfeature

    What: A persistent, dress-up avatar that follows the player across the whole hub, inspired by generative-NFT trait layering (Pudgy-Penguin energy). Players earn coins and milestone unlocks by playing any game, then equip traits on a…

  76. Poker Trainer: named home-game crew, trash talk, pre-flop cheat sheetfeature

    What: Three additions to the Poker Trainer, for playing it as a named home game.

  77. Added Low Roller (push-your-luck dice game)feature

    Added a new original game, "Low Roller," a push-your-luck dice game for solo and pass-and-play (1 to 6 players).

  78. Added Poker Trainer (Texas Hold'em practice game)feature

    What: A single-player Texas Hold'em trainer at /games/poker vs. 1-5 bots, with an integrated teaching Coach (live Monte Carlo equity, outs + Rule of 2/4, pot odds, pre-flop tiers).

  79. Added design/brand.md as a thin brand-extension pointerfeature

    It documents only the games-hub flex: the theming engine (.dark, .theme-ocean, .theme-sunset, kids mode → Nunito), the per-game accents (sudoku ~h80, linked ~h165, 2048 ~h35, etc.), the real shadow ramp (--shadow-sm/md/lg), and…

  80. Offline click-through PASSED (observed, not inferred)feature

    The 2026-07-11 session concluded from static analysis that the PWA layer was already ~95% built and that all 12 games would work offline. It explicitly refused to check the roadmap box, on the grounds that the finding was inferred from…

  81. Offline / PWA verification: the layer was already builtfeature

    Investigated "make the games work offline" and found the PWA layer was already ~95% complete. No new offline capability was built this session — the session's actual output was evidence that offline already works, plus a build to test it…

  82. Sudoku color readability fixfix

    Correct entries render green-bold, errors render red-bold, so the two states are distinguishable at a glance on small screens.

  83. Deployed to Cloudflare Pagesfeature

    Deployed. Custom domain (games.wanessalabs.com) and the Stripe payment flow are still open — see roadmap V1.

  84. POW artifacts scaffoldeddocs

    Hub was missing POW documentation despite being the most active gaming project.

  85. Android strategy: Capacitor WebView wrap, Sudoku firstfeature

    Android APKs will be built by wrapping the existing React hub with Capacitor.

  86. Dishwasher fully ported to TypeScript with 100 testsfeature

    The Dishwasher game — originally a standalone JS prototype — was fully rewritten in TypeScript and integrated into the hub as a React route. 100 tests written covering core puzzle logic, chapter progression, and IAP unlock states.

  87. Linked game added as a hub routefeature

    Linked (word grouping game) was built as a full route inside the hub (/games/linked). Puzzle service, tile animations, daily puzzle rotation, and loss state all implemented.

Written from this project's decision log as work happened, not afterwards. 1 entry was withheld from publication. See every project →