Browser & Mini
Budget Dial
A brass distribution dial, money flows into whichever sector the needle rests on
The original prompt.
Copy it. Add your own twist.
Read the complete original prompt
Build "Budget Dial" — a polished mobile-first portrait web app for the Eazo community, built from a live TikTok trend, in the swipe-to-decide card family. CONCEPT A heavy brass distribution dial, the kind on an old fuse box, fills the middle of the screen. Five engraved sectors ring it — clothes, supplies, tech, food, fun. Twist the dial and hold the needle on a sector and the school budget physically pours into it: coins drop, and that sector's purchases stack up as drawn objects around the rim. The budget is finite, and you can see it draining in the window at the top of the dial. RULES & STATES - The dial is a real rotary control with inertia, detents and a satisfying resistance; allocation is driven by how long the needle dwells on a sector, not by tapping. - Each sector renders what the money actually bought as a growing pile of drawn objects, so you can see the shape of your spending without reading a number. - The budget is finite. When it runs out the dial goes stiff, and the only way to change anything is to twist back onto a sector and drain it — money physically flows back out. - A red arc marks the essentials that must receive a minimum; the dial physically resists being left with an essential at zero and springs back if you try. - Result: two receipts printed from the base of the dial — BUY NOW with the sector totals, and LATER with everything you drained back out. Replay resets the dial with a new budget. Ambient: the needle always has a small residual tremor and the brass catches a slow moving highlight. OPENING (no cover, direct play) Open straight into the live interactive scene — interactive on the very first paint, no cover screen and no start button. A small floating title chip and one gesture hint dissolve on the first touch anywhere on the stage. The scene must already be in motion before the player does anything, and it must never reach an end state on its own while the player is idle. GLOBAL REQUIREMENTS - Language: ship a lightweight built-in i18n layer with exactly two locales, English (en) and Chinese (zh). The app ALWAYS opens in English — hardcode the default locale to en and never call navigator.language or otherwise detect the system or browser language. Provide one small, comfortably tappable EN / 中文 toggle placed top-right, about 56px down from the top edge, clear of the device status bar. Chinese appears only after the user actively switches. The cover, onboarding, defaults, generated content and all share output stay English regardless of locale. Never mix two languages on one screen. Declare one shared TypeScript interface whose fields are all string, annotate both dictionaries with it and look them up as Record<'en'|'zh', T> — never let the two dictionaries infer incompatible literal types, and run a production type check before you call it done. - Fully self-contained: absolutely no external APIs of any kind — no AI calls, no third-party data, media or font services, no remote backend, no login. Embed every item of data, copy and content in the app code. Draw all artwork procedurally in code; no image assets, no camera and no photo import. - Share: integrate a Share feature using the @eazo/sdk community share interface so the player can post the result directly to the Eazo Community. Follow the SDK's own current best practices for composing and attaching the result — do not invent custom share plumbing. The attachment must be something the community server can fetch over the network. Place Share on the result state, keep Replay available, no placeholder buttons, and never claim the post was shared when it was not (in a plain browser the share cannot actually publish, so the button must reflect the real return value). - SSR determinism: the initial render must be deterministic. No Math.random(), no Date.now(), no locale-dependent number or date formatting during first paint — move all of it into a client effect or drive it from a fixed seed. Hydration must produce zero console errors. - Mobile-first portrait, touch-only, no hover dependence. The app root must follow the host container height (position: fixed; inset: 0; height: 100%) — never 100dvh or 100svh. Size any canvas from its PARENT element using a ResizeObserver and run the fit once on mount; convert every touch event through getBoundingClientRect() read at event time — never cache the rect and never use window.innerWidth/innerHeight for canvas sizing. Clamp every derived geometry value to a legal range at the point it is computed, so no radius, size or index can ever go negative or non-finite. - Safe areas: keep all top UI at least 56px from the top edge. Keep every core interactive control AND every self-drawn bottom UI element (HUD text, counters, legends, hints) fully above the bottom 88px of the viewport — the Eazo mobile app overlays a native toolbar there that your code cannot detect. Verify at 393x852 portrait. - Fill the screen: the layout must stretch to the full host height. No dead colour band in the lower half — if the stage has a fixed aspect ratio, give the leftover vertical space a designed extension (gradient, ambient particles, scene ground), never a bare block. - No background music and no autoplay audio. - Complete real states: loading, empty, success and error where relevant. Every control must actually work — no alerts, console-log placeholders or fake results. - Visual bar: exactly ONE core rule understood within 3 seconds, with rich generous visual response on every touch (motion, particles, deformation, colour, light). Canvas 2D preferred for effects; do not use the canvas roundRect API (older iOS Safari lacks it). Never hardcode light text colours onto possibly-light backgrounds — derive text colour from the theme. Keep some ambient motion at all times so no screen is ever a still image.
Keep exploring.
Bakery Pin
Tap the left and right flippers to keep the ball alive and light targets in sequence, unfolding the bakery table upward zone by zone.