Casual

How Round Was That

Draw a circle freehand and get scored on how round it is

Play now

The original prompt.

Copy it. Add your own twist.

Read the complete original prompt
APP NAME
How Round Was That

APP IDEA
A dark, focused canvas where the only thing to do is draw one circle freehand around a centre dot, and get scored on how perfect it was.

CORE EXPERIENCE
The app opens on a near-black textured canvas with a small bright dot in the middle. A short line of text asks whether the user can draw a perfect circle. A single GO control starts a round. Once started, the user presses and drags around the centre dot in one continuous stroke; a thick bright-green stroke follows the finger. The stroke must start and end near the same angle to close the circle.

INTERACTION AND STATE
A round has three states: ready, drawing, result. In ready state only the centre dot, the prompt line and GO are shown. In drawing state the user drags around the centre dot; sample the pointer angle and radius continuously, and require the sweep to cover close to a full 360 degrees before scoring. If the user lifts too early, or the stroke crosses itself badly, show a short retry hint and return to ready without scoring. In result state compute the score from how constant the radius stayed: take the standard deviation of all sampled radii divided by the mean radius, and map it to a percentage where a perfectly constant radius is 100.0%. Show the percentage to one decimal place, large and centred, together with the user's drawn stroke still on screen and a faint true circle drawn at the mean radius so the user can see the difference. Keep the best percentage of this session in local storage and show it as a smaller "best" line. Replay clears the canvas and returns to ready.

VISUAL AND CONTENT DIRECTION
Very dark charcoal background with a subtle grain, one small light dot at the exact centre, and a thick rounded acid-green stroke for the drawn line. The faint reference circle is a thin grey outline. Typography is a light monospace for the prompt and a heavy condensed face for the percentage. No decoration beyond this; the emptiness is the point.

OUTCOME
A large percentage score for the circle just drawn, the drawn stroke shown against the ideal circle, and the session best.

ONE-SENTENCE INSTRUCTION
Press and drag all the way around the dot in one stroke to draw your circle.

TASK-SPECIFIC REQUIREMENTS
Sample pointer positions on pointermove with the canvas rect read live on every event, never cached. Size the canvas from its parent element with a ResizeObserver, and call the fit routine once on mount. Support both mouse and touch. Lock input during the result state so a stray drag does not start a new stroke.

Server-render determinism: do not call Date.now(), new Date() or Math.random() during initial render. Read the clock and generate randomness only inside client effects, and hard-code the default locale to English rather than detecting navigator.language, so first paint is identical on server and client and never produces a hydration mismatch.

REPLICATION SCOPE

This specification is a faithful rebuild of an existing reference experience, described here in full. Reproduce it as closely as the platform allows.

Must be reproduced exactly: the complete content inventory listed above with its exact ordering and wording, the mechanic and its state transitions, the copy voice, the visual structure and the overall pacing. Do not add levels, items, scoring, achievements, timers, onboarding or extra features that are not described here. Do not drop or abbreviate any listed content.

Acceptable platform adaptations, and only these: touch input in place of mouse input; layout reflow for a phone-sized portrait host; the bilingual layer, the one-sentence instruction and the result/Replay/Share affordances required below; and host safe-area insets. Everything else stays as specified.

All content must be self-contained. Do not call any external API, data service, map, media or image service at runtime; every dataset, table, constant and asset this app needs must live inside the project.

IMPLEMENTATION INSTRUCTIONS

Treat this specification as the final implementation brief and build the complete app now.

Open directly into the live app experience. Do not add a splash screen, opening cover, welcome page or separate onboarding flow.

Include exactly one concise sentence that explains how to play or use the app. Use the sentence provided under ONE-SENTENCE INSTRUCTION. Show it inside the live app interface, not on a separate opening screen.

Internationalization is required. Implement a lightweight built-in i18n layer supporting exactly two locales: English (en) and Simplified Chinese (zh). The app must always open in English and must never auto-detect or follow the browser, device or system language. Provide one clear EN / 中文 language toggle. Every user-facing string, including the one-sentence instruction and all loading, empty, success, error and result states, must have complete English and Chinese versions. Switching languages must update the entire interface without mixed-language text or untranslated fallback strings.

Let Eazo adapt the app to its actual host and available viewport. Do not hard-code or target a particular browser size, device size, viewport width or height, App frame size, root-height formula, or host-container CSS implementation. In the live preview, keep the current primary action easy to discover and usable without requiring an initial downward scroll; avoid horizontal overflow and avoid decorative layers blocking required controls. Optional detail may scroll. Keep active media and secondary copy compact enough that the next action remains visible. In result states, show the summary plus Replay and Share before optional detail. Do not eagerly render a large collection of full-size result images in one long page; use a compact summary, carousel, pagination, expansion, or virtualization. Use accessible touch targets.

Respect the host safe areas for iPhone notches, Dynamic Island, the status bar and the bottom home indicator in the initial implementation, before the first preview. Apply the safe-area treatment to the App's entire usable content region across the live flow, result, modal, empty and error states, not only to the first header. Keep the header, language toggle, primary controls and result actions entirely inside the usable safe area. In the standard Eazo mobile host, use `padding-top: max(56px, env(safe-area-inset-top, 0px))` and `padding-bottom: max(34px, env(safe-area-inset-bottom, 0px))`, or Eazo's current official safe-area equivalent. If the header or action footer is sticky or fixed, include the matching inset in that region and reserve content clearance so it does not overlap the scrollable body. These are safe-area insets only, not fixed viewport or App-frame dimensions; continue to let Eazo adapt the overall width and height. Make sure flex children can shrink inside the remaining usable area and that required controls are not covered or pushed off screen.

Use Eazo's built-in defaults and official platform capabilities. Do not add unrelated features or expand the scope beyond this specification.

When implementation is complete, provide a working preview for QA.

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.

Play
THE ORIGINAL CREATION PROMPT

The idea that started this app. Copy it, change it, make it yours.

Play app ↗Open Eazo ↗