The hub already had a dishwasher game with 40 chapters and a wife who comments on your rack placement. The problem with a hub is that people have to go to it. Reddit is where the daily-puzzle habit already lives, so this is the same game, running inside a Reddit post.
What It Is
A Devvit Web app on r/wanessalabsdev. A moderator creates the post from the subreddit menu, and the post itself is the game: drag today’s 14 dishes out of the sink and into four kitchen zones without ruining the good knives.
The zones are a 6×4 top rack, a 6×5 bottom rack, a 4×3 utensil basket, and a 5×4 hand wash mat. Knives, cast iron, wooden boards and nonstick pans belong on the mat. Put one in the machine and you take a 40 point penalty and hear about it.
The Seed Is the Post
Every player in a thread has to be solving the identical puzzle or the leaderboard means nothing. The seed comes from the post ID, not from a clock and not from the client:
derivePostSeed("t3_1vzwemc") → 32-bit integer → seededRandom → the same 14 items, every time
That is a djb2 hash over the lowercased post ID, so the load is fixed the moment the post exists. A new post tomorrow is a new load. Nobody can reroll, and the server never has to store the puzzle.
One Engine, Two Surfaces
The webview does not reimplement the game. It imports data.ts, logic.ts and types.ts straight out of src/games/dishwasher/ in the hub, plus the hub’s own seededRandom. What is new here is the renderer and the Reddit plumbing:
| Piece | Role |
|---|---|
devvit.json | Manifest: post entrypoint, server bundle, subreddit menu item |
src/server/index.ts | Express on @devvit/web/server. Three routes: create post, /api/init, /api/submit-score |
| Devvit Redis | zAdd / zRange on lb:{postId}, so the leaderboard is per thread |
App.tsx | Leaderboard, current user, and a navigateTo link back to the full game |
DishwasherView.tsx | The board: drag, drop, rotate, wife commentary, itemized receipt |
Scoring is itemized rather than a single number: 80 points a dish, 25 for a zone match, 80 for hand washing something delicate, 250 for clearing the counter with zero violations, 150 more for doing it with hints off. Excess moves cost 4 each. The receipt shows every line, then grades A+ to F.
Constraints
Devvit is a sandbox with its own rules, so the port strips things the hub version has. No coin economy, no Supporter Pack, no external network calls, no localStorage. State that survives is state Reddit holds. Scores are keyed to the Reddit username the server reads, and fall back to Anonymous if it cannot.
The build is two bundles, not one: Vite for the webview, esbuild into a single CJS file for the server, because that is what the platform loads. Three tests cover the parts that would break quietly: seed determinism across identical post IDs, grid placement, and leaderboard sort order.
This is the first of three planned Devvit pilots. Poker Friday and Chinese Checkers use the same recipe.