2 cases built from this template
Same prompt, different [VARIABLES]. Click one to preview it above.About this template
3D Neon Breakout Arcade is a single-screen browser game in a lit court. The first view is the arena: a dark gridded floor, a cool teal sky dome, a bar near the camera, and a field of neon bricks farther down the court. A solid start card sits at the side and names the cabinet, the venue, and the controls. The arena stays visible beside it.
The default cabinet is Lumen Dock, cabinet 4 on Glass Pier in Harborline, open from 4 pm to midnight. Attendant Nia Pell runs five authored rounds. Each round changes the map and the ball speed. The player has three sparks and a running score. Bricks burst into a short particle spray, and the ball keeps a small hot trail. Three falling pickups are placed in the maps. Scatter adds balls, Needle fires a straight beam from the bar, and Girder stretches the bar for a few seconds. A clear card follows a finished round. An out-of-sparks card follows a failed run.
The bar follows the mouse, the left and right arrow keys, or a finger drag. Click, tap, or Space sends the ball. Pause, a sound toggle, and a best points total stored in the browser belong to the cabinet. Hits are short synthesized tones. Reduced motion removes the spray, the trail, and camera shake. Every mesh is built in code.
Developers and indie hackers can ship the game as static files. Five variables rename the cabinet, the venue, the city, the attendant, and the line under the name. Round names and the hours line change with those values. Speeds, colors, maps, and pickup rules stay put. The second case is a campus rec-room cabinet on the same court. No server, account, or downloaded model is required.
The template prompt
The live demo was built from exactly this text — nothing added. The other cases only change the values of the [VARIABLES].
# 3D Neon Breakout Arcade Build this website exactly as described below. Replace the [VARIABLES] with your own values; keep everything else. ## Brief Build [BRAND], a complete single-page 3D breakout in a gridded night court at [VENUE] in [CITY]. The first screen is the lit arena itself: a cool sky dome, a dark grid floor, the bar in front, and round-one bricks farther back, with a start card beside the view. Five authored rounds change the brick map and ball speed. The player has sparks, points, and three falling pickups: Scatter, Needle, and Girder. Default deck: [TAGLINE]. - Audience: Indie hackers and front-end developers who want a finished static Three.js arcade game, playable with a mouse, arrow keys, and a finger drag, and reskinnable by changing words rather than the court. - Goal: Ship one replayable five-round cabinet: a start card over a living court, mouse and touch aiming, keyboard nudge, shatter, a hot ball trail, a sci-fi readout, clear and fail cards, pause, synthesized hits, and a local best. A second name set must keep the same maps, speeds, colors, and pickup rules. - Tone: Dry, specific, and local, like a night attendant talking to a regular. Short US English. No military hull talk, no death slogan, and no padded scoreboard. ## Stack - Framework: Vite 6 + TypeScript + Three.js - Styling: Vanilla CSS - Libraries: three (MIT), @fontsource/syne (OFL), @fontsource/sora (OFL), @fontsource/share-tech-mono (OFL) - Build: `npm run build` → static files in `dist/`. No backend, no server code, no external APIs. - Setup: - Scaffold Vite's vanilla TypeScript template. Scripts: dev=vite, build=tsc && vite build, preview=vite preview. Package name is the slug of BRAND, not a fixed template id. Set vite base to './', build.outDir to dist, build.emptyOutDir to true, and build.sourcemap to false. tsconfig: strict true, noEmit true. - Install three at 0.170.0 or newer, plus Vite 6 and TypeScript 5 as dev dependencies, and the three Fontsource packages as runtime dependencies. Do not add React, a physics engine, a game framework, a tween library, an icon package, or a separate postprocessing package. - Import Syne weights 700 and 800, Sora weights 400, 500, and 600, and Share Tech Mono weight 400 from those packages. CSS families are Syne, Sora, and Share Tech Mono. Do not load fonts from a CDN. - Bloom, desktop only: import EffectComposer, RenderPass, UnrealBloomPass, and OutputPass from three/addons. Strength 0.25, radius 0.32, threshold 0.82. OutputPass is the last pass. Skip the composer under 800px width and after the performance cut below. - Use modules src/content.ts, main.ts, arena.ts, levels.ts, sim.ts, hud.ts, audio.ts, and styles.css. Keep every player-facing string in content.ts. Simulation code reads that module and never shows raw tokens. - If BRAND, VENUE, CITY, and ATTENDANT are the defaults, use the Glass Pier copy table. If VENUE is Millhouse Rec, use the Millhouse copy table exactly. Any other change to those four rewrites the attendant sentence, the hours line, and the five round names in content.ts to fit the new words. A TAGLINE-only change replaces the deck and keeps the round names. Maps, speeds, colors, coordinates, and pickup cells never change. - Persist only the best points integer and the mute flag in localStorage. Key is the slug of BRAND plus -cabinet, so Lumen Dock becomes lumen-dock-cabinet. Slug: lowercase, non-alphanumerics to single hyphens, trim hyphens. No dates. Parse nothing from the network. - One index.html, lang=en, viewport with viewport-fit=cover. Document title is BRAND, an em dash, then VENUE. A full-view canvas plus HTML overlays. Body margin 0, overflow hidden, background Ink. No router. ## Variables - [BRAND] — Cabinet name (default: "Lumen Dock"). Invented cabinet name on the start card, the readout, the document title, and the save key. - [VENUE] — Venue (default: "Glass Pier"). Invented place. Used in the eyebrow, the final clear heading, and the hours line. - [CITY] — City (default: "Harborline"). Invented city beside the venue. Words only; the court does not change. - [ATTENDANT] — Attendant (default: "Nia Pell"). Invented first and last name of the person who runs the cabinet. Not a real person. - [TAGLINE] — Start deck (default: "Keep the spark and clear the pier."). One sentence under the cabinet name on the start card. - [CREDIT] — keep a small "Template by VibeFather" link to https://vibefather.ai/t/3d-neon-breakout-arcade in the footer (default: yes; delete this line to remove it) The copy under Pages & Sections is written for the default values. If your values differ, rewrite every headline, paragraph, label and image for them — same length, tone and structure. Layout, colors, type and motion stay as described. Keep all copy, image paths and links in one content file (for example `src/content.ts`), keyed by section, so the content can be swapped later without touching components. ## Design ### Colors - Ink `#07110F` — Page background, renderer clear, start card, sky zenith, fog - Court `#0C1714` — Floor plane and readout chips - Grid `#24584F` — Floor lines and card border - Horizon `#1C6B62` — Sky-dome horizon - Teal `#1EC8B8` — Teal bricks, rails, primary button, spark pips, focus ring - Sea `#7DFFB2` — Sea bricks - Ice `#9AD7FF` — Ice bricks and chipped lime bricks - Lime `#E4F27A` — Two-hit bricks before the first chip, Girder pickup, far lip - Hot `#FF4D1C` — Ball, ball light, center tick, Needle beam, Scatter pickup - Paper `#E7F3EE` — Headings, HUD numbers, paddle body - Dim `#8AA39A` — Eyebrow, labels, hours line, credit - Rail `#12312C` — Side rails and back plate ### Typography - Cabinet name on the start card: Syne (OFL), weights 700/800 - Body, buttons, and HUD labels: Sora (OFL), weights 400/500/600 - Points, round, and timers: Share Tech Mono (OFL), weights 400 ### Layout & motion - Spacing: 4 px base. Desktop card padding 28 px, HUD inset 16 px. Mobile inset 12 px plus safe-area insets. Buttons at least 44 px tall. The start sheet on a phone stays within 46 vh and scrolls inside itself. The center of the court stays clear of chrome during play. - Radius: Start, pause, clear, fail, and controls cards 12 px with a hard 4 px offset shadow in Grid, no blur. Buttons 8 px. Spark pips are 8 px diamonds. World meshes stay sharp except the ball, the attendant head, and Scatter's small spheres. - Motion: Fixed step of 1/60 second. Each frame runs at most three steps and drops leftover time. Render with the latest state. - Motion: On the start card the camera eases 0.04 units on x over 8 seconds. During play the camera x eases toward 0.18 times the paddle x, clamped to 1.1, with smoothing 1 - exp(-4 dt). - Motion: A brick break offsets the camera by at most 0.045 units for 0.1 seconds, ease out, one shake at a time. The ball trail keeps the last 10 positions spaced at least 0.12 apart. - Motion: Shatter spawns 14 short-lived boxes. Pickups bob 0.05 units at 1.8 Hz. Overlays fade in 160 ms and do not travel. - Motion: With prefers-reduced-motion, cut the title drift, camera follow, shake, trail, shatter, pickup bob, and overlay fade. Snap UI in place. Keep the ball, the bar, the beam, and the rounds, because that motion is the game. - Imagery: Draw the court, sky, bricks, bar, ball, pickups, shatter, and the attendant from original Three.js geometry. No photographs, no generated stills, no HDRIs, no downloaded models, and no brand marks. The lit court is the first-screen anchor, with the start card beside it. The attendant is a featureless figure outside the right rail: a box coat in #C5D2CB, a sphere head in #E6C4A4 with no eyes or mouth, and a Teal cap. The figure is fictional and is not a portrait of any real person. No faces anywhere else. ## Pages & Sections ### [BRAND] — [VENUE] (`index.html`) 1. **Start card over the lit court** — Document title: Lumen Dock — Glass Pier, from BRAND and VENUE. States: start, controls, serve, play, paused, clear, fail. Open on start with round 1 already built, the ball resting on the bar, and the bar centered. Eyebrow, uppercase Sora 600 at 12 px with 0.16 em tracking: GLASS PIER · HARBORLINE, from VENUE and CITY. Heading: Lumen Dock, Syne 800, 64 px desktop and 40 px under 700 px. Deck, from TAGLINE: Keep the spark and clear the pier. Attendant line: Nia Pell opens the cabinet after dusk. Hours: Cabinet 4 on Glass Pier. Open 4 pm to midnight. Body, same for every name set: Five rounds. Three sparks. Move the bar with the mouse, the arrow keys, or a finger drag. Click, tap, or press Space to send the ball. Catch Scatter, Needle, and Girder. If a best exists, show Best and the grouped points. Hide that row when there is no save. Optional [CREDIT] link once, under the hours line, 12 px Sora in Dim. Buttons: Play round one (primary) and Controls. Focus Play round one. Millhouse copy table, used only when VENUE is Millhouse Rec: eyebrow MILLHOUSE REC · REDLOOM when CITY is still Redloom, otherwise VENUE and CITY; attendant line Ellis Ward leaves the cabinet on after lab hours; hours Room 12 at Millhouse Rec. Open 7 pm to 11 pm; deck from TAGLINE. Round names for that table are in the rounds section. Layout: The canvas fills the viewport and renders the court before the first click. Hide the play readout until Play round one. Desktop: a 400 px Ink card, 12 px radius, 28 px padding, Paper text, border 1 px solid Grid, offset shadow 4 px 4 px 0 Grid, 16 px from the left and vertically centered. It covers well under half of 1440 px, leaving bricks, the bar, the hot ball, and the right-rail figure visible. Mobile: a bottom sheet, max-height 46 vh, internal scroll, same solid Ink fill, no blur. At 390×844 the sky, at least two brick rows, the bar, and the hot ball all sit above the sheet. If the bar falls behind the sheet, move the mobile start camera back on z until that framing is true. Background behind the canvas is Ink. UI root is pointer-events none; cards and buttons set pointer-events auto. Motion: The card fades in over 160 ms after the first rendered frame. On start, the ball stays put and the camera drifts 0.04 units. Controls opens the help sheet and returns here without starting. Play round one sets state to serve, removes the card, shows the readout, and does not launch the ball yet. Reduced motion shows the card with no fade and no drift. Enter activates the focused button. 2. **Court, sky, camera, and light** — Axes: +x right, +y up, +z away from the camera toward the bricks. Play bounds: x = ±7.45, back wall z = 19.35, out line z = 0.15. Ball height is locked at y = 0.52. There is no gravity on the ball and no jump. The attendant stands at (8.55, 0, 6.4), outside the right bound, with no collision: coat box 0.42 × 0.78 × 0.28 at y 0.56, head sphere radius 0.16 at y 1.12, cap box 0.28 × 0.08 × 0.28 at y 1.28, two leg boxes. No name tag floats over the figure. Layout: Floor plane 24 by 28, center (0, 0, 10), color Court. Grid lines every 1 unit from x -8 to 8 and z 0 to 20, y = 0.015, color Grid, one LineSegments. Rails: boxes 0.14 × 0.18 × 20.2 at x ±7.72, y 0.1, z center 10.1, color Rail, emissive Teal intensity 0.45. Back plate: plane 15.4 × 2.6 at z 19.7, y 1.3, color Rail. Far lip: box 15.4 × 0.12 × 0.16 at z 19.55, y 1.15, emissive Lime intensity 0.35. Sky: sphere radius 80, position (0, -8, 10), BackSide, ShaderMaterial. Mix Horizon at the rim into Ink at the top with smoothstep on the normalized world y from 0.35 to 0.95. No sun disc and no purple. Seventy star points, radius 0.045, color #D7EFE8, only where y > 2, placed with mulberry32 seed 5704843. Do not use Math.random. Fog is linear, color Ink, near 28, far 70. Desktop camera: position (0, 6.15, -3.1), lookAt (0, 0.7, 12.5), fov 44. Under 800 px: position (0, 8.2, -2.4), lookAt (0, 1.0, 12.0), fov 52. Near 0.1, far 200. On the mobile start sheet, move the camera to (0, 7.6, -4.2), lookAt (0, 1.4, 13), fov 50, and return to the mobile play camera when the round starts. Motion: Stars, floor, rails, and the attendant do not move. Title drift and play follow are camera offsets only. Reduced motion keeps the camera on the base position for that viewport. Lighting does not pulse. 3. **Bar, ball, and input** — The bar is a box 2.56 × 0.18 × 0.46, center z = 1.35, y = 0.36, color Paper, emissive Teal intensity 0.25. A Hot tick, 0.14 × 0.22 × 0.50, sits at its center. Girder sets the bar width to 4.16 for 8.0 seconds and counter-scales the tick so the tick stays 0.14 wide. Clamp the center so the bar stays inside x ±7.45. The ball is a 16-segment sphere, radius 0.20, color Hot, emissive Hot intensity 0.85, roughness 0.32, metalness 0.04. A child point light, color Hot, intensity 1.5, distance 6, decay 2. While held, the ball center is (barX, 0.52, 1.87). Serve always sets vx to 0.28 times speed, sign of the last horizontal move or +1 if the bar has not moved, and vz to the positive square root of speed squared minus vx squared. Later bar hits use offset = clamp((ballX - barX) / halfWidth, -1, 1), vx = offset * 0.78 * speed, then clamp absolute vx to 0.92 * speed and recompute positive vz. Renormalize to the round speed after every bounce. Layout: Pointer mapping: t = (clientX - rect.left) / rect.width, target = lerp(-6.17, 6.17, clamp(t, 0, 1)), then clamp to the current bar limit. Mouse move sets the target with no button required. Touch and pen set it only while the pointer is down. ArrowLeft and ArrowRight move at 11 units per second and are ignored on any frame that also applied a pointer. Do not bind A or D. Launch only from the held state, on Space, or on a pointerup over the canvas whose total movement was under 14 px. A drag does not launch. Capture the pointer on press. touch-action none and overscroll-behavior none on the body. Prevent default on Space, arrows, and Escape so the page does not scroll. Clear held keys on blur, on overlay open, and when the document hides. Keyboard: Escape closes Controls, or toggles pause during serve and play; M toggles mute; Enter activates the focused primary button. Canvas accessible name: Three-dimensional breakout on a lit grid court. A polite live region announces round clear, spark lost, out of sparks, and the final clear sentence, not every hit. Motion: The held ball moves with the bar. After a bar hit, push the ball to z = 1.87 and ignore that ball against the bar for 0.08 seconds. Each step moves at most 0.18 units, so a ball cannot pass through a brick. If several bricks overlap, resolve only the smallest penetration. Flip the axis of least penetration; if the two penetrations are within 15 percent, flip both. Then push out by the penetration plus 0.01 and renormalize. Side walls flip vx. The back wall flips vz to negative. Trail spheres: radius 0.06, color Hot, opacity 0.35 down to 0, not colliders. Reduced motion draws no trail. The ball light stays. 4. **Five rounds and brick maps** — Nine columns, six rows maximum. Brick box 1.28 × 0.42 × 0.58. Column x = -5.84 + col * 1.46. Row z = 18.15 - row * 0.86. Row 0 is farthest. Characters, each string length 9: c teal #1EC8B8 one hit, s sea #7DFFB2 one hit, i ice #9AD7FF one hit, l lime #E4F27A two hits, hyphen means empty. A lime brick's first hit scores 40, switches the mesh to ice, and leaves one hit. Destroying a one-hit brick scores 100. Destroying a chipped lime scores 160. One geometry, four cached materials, roughness 0.4, metalness 0.08, emissive intensity 0.35 in the brick's current color. Round speeds: 7.2, 8.1, 9.0, 9.9, 10.8. Glass Pier names: Pier Lights, Kelp Gate, Lantern Stack, Tide Teeth, Last Beacon. Millhouse names: Lab Lights, Coil Gate, Shelf Stack, Gear Teeth, Last Bell. Maps in order, far row first, each row in quotes and exactly 9 characters. Round 1: "ccccccccc" "sssssssss" "iiiiiiiii" "cscscscsc". Drops: row 2 col 4 Scatter, row 1 col 1 Needle, row 3 col 7 Girder. Round 2: "cscsicscs" "-s-c-c-s-" "c-scics-c" "-i-l-l-i-" "scscscscs". Drops: row 0 col 4 Scatter, row 2 col 0 Needle, row 4 col 8 Girder. Round 3: "lll---lll" "ccc---ccc" "sss---sss" "iii---iii" "csc---csc". Drops: row 1 col 1 Scatter, row 2 col 7 Needle, row 4 col 0 Girder. Round 4: "c-s-c-s-c" "-l-i-l-i-" "c-s-c-s-c" "-i-l-i-l-" "s-c-s-c-s" "-c-s-c-i-". Drops: row 2 col 2 Scatter, row 3 col 3 Needle, row 4 col 8 Girder. Round 5: "lclclclcl" "ss-c-c-ss" "ccclllccc" "ii-----ii" "s-c-i-c-s" "cscscscsc". Drops: row 0 col 4 Scatter, row 2 col 0 Needle, row 5 col 8 Girder. A drop is queued only when that cell is destroyed, not when a lime is only chipped. Layout: Starting a round rebuilds bricks, removes balls, pickups, the beam, and shatter, and places one held ball. Points and sparks carry across rounds. Clearing a round adds 800 points, then adds one spark up to a cap of 5. The clear card shows Round clear, the round name, PTS and the grouped total, and either spark returned or sparks full. Button: Next round. After round 5 the card heading is the venue plus clear, so the default reads Glass Pier clear. Subline: Five rounds. Button: Play again. Show New best when this total beats the saved integer. Next round and Play again do not reload the page. Play again sets points to 0, sparks to 3, round to 1, and returns to serve. Motion: Bricks do not move. A chip is an instant color change. Opening the clear card freezes the step. Existing shatter may finish; spawn no new boxes after the card opens. Reduced motion removes the shatter and keeps the color change and the card. 5. **Pickups, beam, and shatter** — At most two pickups exist at once. A third queued drop is ignored; the brick still scores. A pickup falls toward the camera at 3.5 units per second and is removed at z < 0.2. Catch it when its z is between 1.05 and 1.70 and its x is within the bar half-width plus 0.28. A catch scores 200. Scatter is three small Hot spheres of radius 0.08. On catch, spawn up to two extra balls from the oldest live ball, or from the held ball if nothing is live, at plus and minus 0.45 radians from that velocity, same speed. Cap 5 balls, counting a held ball. Toasts: Scatter · two more balls, Scatter · one more ball, or Scatter · court is full. Needle is a pale box 0.08 × 0.36 × 0.36 in #FFD2C2. For 6.0 seconds it fires every 0.45 seconds, first shot 0.1 seconds after the catch, including during serve. The beam is a Hot box, 0.06 thick, from z = 1.75 to the first brick whose x overlaps the bar center within 0.08 and whose z is ahead, or to z = 19.2 if it misses. It is visible for 0.07 seconds, removes one hit, and awards the same 40, 100, or 160 as a ball. It does not bounce. Toast: Needle · beam ready. Girder toast: Girder · bar stretched. Catching Girder again sets the timer back to 8.0. Needle and Girder can run together. Timers use sim time and freeze while paused, hidden, or on a card. Layout: Shatter: 14 boxes, size 0.05 to 0.13, life 0.5 seconds, gravity -6.5 on y, initial speed 1.4 to 3.4, upward bias 1.2 to 3.0, color copied from the brick at the moment it breaks. Seed mulberry32 with roundIndex * 1000 + row * 10 + col. Cap 160 live boxes; if the cap is full, break the brick with no new boxes. Pickups bob on y only. The beam is not a collider for the ball. When the last brick breaks, enter clear in that same step before any ball can cross the out line. Motion: Pickup bob is a sine. Reduced motion pins pickups to y = 0.52 and spawns no shatter. Draw the beam for one frame and still remove the hit. Do not shake the camera when reduced motion is on. 6. **Readout, toasts, and end cards** — Play readout labels, exactly: PTS with a grouped integer and no leading zeros; RND as 1/5 through 5/5; BLOCKS as the remaining brick count; SPARKS as up to five 8 px diamonds, filled Teal when remaining and outlined Grid when empty, with a SPARKS label. Status word beside the round name: REST while the ball is held, LIVE while at least one ball is moving. Round name under the bar, from the copy table, in Sora. Power chips, bottom center, only while active: NEEDLE 4.2 and GIRDER 6.0 with one decimal. Toasts last 1.3 seconds and never block input. Spark lost toast: Spark lost · 2 left, using the sparks that remain. Fail card heading: Out of sparks. Subline: RND, the round number, a middle dot, and the round name. Then PTS and the total. Button: Run it back, which uses the same reset as Play again. New best when the total beats the save. Pause card heading: Paused. Buttons: Resume, Restart round, Controls. Restart round rebuilds the current map and returns to serve without changing points or sparks and without refunding a spark. Save the best on fail and on the venue-clear card when the total is higher. Layout: Desktop readout: one 44 px row, 16 px from the top and sides. Brand chip at the left in Sora 600, max-width 28 vw with ellipsis. PTS centered in Share Tech Mono 20 px. RND, BLOCKS, and SPARKS at the right, labels in Dim 11 px. Pause and Sound are 44 px text buttons under the brand. Round name centered under the row. Mobile, under 800 px: row one is Pause, brand, Sound; row two is PTS, RND, BLOCKS, and the pips at 16 px mono. Nothing scrolls sideways at 390 px. Cards are 420 px on desktop and full-width sheets on mobile with 12 px side inset, same Ink fill and Grid offset shadow. Primary button fill Teal, text Ink. Secondary button is transparent with a Paper label. Focus ring 2 px solid Teal, offset 2 px. Toasts sit above the power chips, max-width 280 px. Motion: Cards fade 160 ms. Spark pips do not pulse. Reduced motion snaps cards and toasts. Status text changes are instant. The readout hides on the start card and shows during serve, play, pause, clear, and fail. 7. **Sound, pause, and the two viewports** — Sound is off until Play round one, which is the unlock gesture, then on. The button reads Sound on or Sound off. M matches the button. Persist mute. Tones, no audio files: bar hit sine 392 Hz for 45 ms at gain 0.06; brick destroy square 620 Hz for 40 ms at gain 0.04; lime chip triangle 480 Hz for 35 ms; wall sine 196 Hz for 30 ms; pickup 523 Hz then 784 Hz, 60 ms each; spark lost sine glide 360 Hz to 140 Hz over 160 ms; round clear 523, 659, 784 Hz at 90 ms; venue clear adds 1046 Hz. If AudioContext fails, leave sound off and do not log in a loop. Ramps 20 ms. Silence while paused, hidden, or muted. Controls heading: How the bar moves. Lines: Mouse: the bar follows your horizontal position. Arrow keys: move left or right. Finger: drag anywhere on the court. Click, tap, or Space: send the ball while it rests on the bar. Esc pauses. M mutes. Button: Back. Back returns to start or to pause, whichever opened it. Layout: Target a clean frame at 1440×900 and at 390×844 with no horizontal overflow and no console errors. Lights: hemisphere sky #B7E6DC and ground Court at intensity 0.55; directional #F2FFF8 intensity 1.35 from (2.5, 9, -4); a Teal fill intensity 0.35 from (-6, 3, 8). No shadow maps. ACES filmic tone mapping, exposure 1.02, clear color Ink, output color space SRGB. Pixel ratio min(devicePixelRatio, 1.75), or 1.25 under 800 px. If the mean frame time over 180 frames exceeds 22 ms, once, set pixel ratio to 1 and disable bloom. Keep the rules. If WebGL cannot start, keep the start copy and add: This browser could not start the 3D view. Try a browser with WebGL enabled. Do not retry in a loop. Resize the renderer, camera, and composer on viewport changes. Honor safe-area insets. The page itself does not scroll. Motion: Pause, the hidden document, clear, fail, and controls freeze the step, the timers, and the ball. Sound stays silent while frozen. Reduced motion is separate from the performance cut: gameplay remains, and only the extra camera, shatter, trail, bob, and fades drop. Quality cuts never remove rounds, pickups, or touch aiming. ## Assets - image: No image files and no generated stills. Draw the sky, court, bricks, bar, ball, pickups, shatter, attendant, and trail in Three.js. Add an original public/favicon.svg: a 32 viewBox, Ink rounded rectangle, a Teal horizontal bar, and a Hot circle above the bar, with no letters. In ASSETS.md state that the scene is code-drawn and list the favicon as original. - icon: Do not install an icon package. Pause, Sound, and Controls are text buttons. Spark pips are CSS diamonds. List no third-party icons in ASSETS.md. - font: Self-host Syne, Sora, and Share Tech Mono through the Fontsource packages named in the stack (OFL). Import only the weights listed. In ASSETS.md record the local woff2 files, the npm package pages, and the OFL license. Do not request fonts from any CDN. - video: No video and no audio files. Hits are synthesized with Web Audio after Play round one unlocks the context. ## Don'ts - No backend, accounts, database, analytics, external APIs, multiplayer, or a shared leaderboard. The best points integer and the mute flag stay in localStorage under a key built from BRAND. - No CDN and no remote assets. Self-host fonts, import three from the installed package, use relative paths, and emit minified files to dist/ with source maps off and without copying src/ into dist/. Keep dist under 20 MB. - The only page is index.html. Do not add a marketing page, a price, or a bare directory link. The first screen is the lit court with the start card beside it, never type on a flat field. - Do not use the title VOIDBREAK, the clear line LANDED, or the fail line YOU DIED. Fail heading is Out of sparks. Mid-round clear heading is Round clear. The last card heading is the venue plus clear. - Do not label the readout HULL, LIVES, NOMINAL, CRITICAL, WAVE, BRICKS, or a zero-padded six-digit SCORE. On-screen labels are PTS, RND, BLOCKS, SPARKS, REST, and LIVE. Do not print the control line MOUSE / A D MOVE or SPACE SURGE. Do not bind A or D. - Do not use these status words: HULL BREACH, HULL CRITICAL, BALL LOST, KEEP LANE, MINE HIT, SAW HIT, IMPACT, SURGE, WIDE, WIDE LOCK, or COMBO. Pickup toasts name Scatter, Needle, and Girder only. - Do not build EnergyCore, Interceptor, ObjectivePylon, SawDrone, SpikeMine, hull damage, lane hazards, mines, or saws. The court is a bar, balls, bricks, and three pickups. - Do not copy a one-shot HTML page, a bench prompt, a judge note, a screenshot, or a gameplay video. Do not mention Agent OS, GoldieBench, AI Profit Boardroom, AIPB, Grok, xAI, or Julian Goldie, and do not add a player chrome bar. - Do not lock the scene to a source palette, and do not use Inter or Courier New. Faces are Syne, Sora, and Share Tech Mono, self-hosted. Colors are the hex values in this spec. - No real arcade brands, logos, mascots, or celebrity likeness. The attendant has no face and is not a portrait of a real person. No downloaded models, HDRIs, stock photos, or placeholder-image services. - No shadow maps, no physics engine, and no Math.random. Stars and shatter use mulberry32. Bloom is desktop-only and turns off after the single performance cut. - Do not hard-code Lumen Dock, Glass Pier, Harborline, Nia Pell, or the default round names outside src/content.ts, and do not leave raw variable tokens on screen. - Do not invent dates, entry fees, online player counts, or any claim about VibeFather. The only VibeFather presence is the optional [CREDIT] link. - Honor prefers-reduced-motion by removing shake, shatter, trail, bob, and camera drift without stopping the round. At 390×844 the sheet, readout, and drag control must be usable with no horizontal overflow and no console errors. - If WebGL fails, show the readable fallback sentence and do not throw in a loop. Freeze the round while paused, hidden, or while a card is open. --- Inspired by arcade one-shot 3D breakout by @JulianGoldieSEO — https://agentos.guide/grok-4-7-agent-os — Prompt by VibeFather · https://vibefather.ai/t/3d-neon-breakout-arcade · CC BY-NC 4.0 (non-commercial; commercial use needs a VibeFather Pro license) · Request removal: https://vibefather.ai/takedown
Free for personal projects under CC BY-NC 4.0. Commercial use comes with Pro.
DESIGN.md
The design system on its own — colors, type, spacing and motion. Apply this look to a project you already have.
---
name: "3D Neon Breakout Arcade"
colors:
ink: "#07110F"
court: "#0C1714"
grid: "#24584F"
horizon: "#1C6B62"
teal: "#1EC8B8"
sea: "#7DFFB2"
ice: "#9AD7FF"
lime: "#E4F27A"
hot: "#FF4D1C"
paper: "#E7F3EE"
dim: "#8AA39A"
rail: "#12312C"
typography:
cabinet_name_on_the_start_card: { family: "Syne", weights: [700, 800] }
body_buttons_and_hud_labels: { family: "Sora", weights: [400, 500, 600] }
points_round_and_timers: { family: "Share Tech Mono", weights: [400] }
spacing: "4 px base. Desktop card padding 28 px, HUD inset 16 px. Mobile inset 12 px plus safe-area insets. Buttons at least 44 px tall. The start sheet on a phone stays within 46 vh and scrolls inside itself. The center of the court stays clear of chrome during play."
radius: "Start, pause, clear, fail, and controls cards 12 px with a hard 4 px offset shadow in Grid, no blur. Buttons 8 px. Spark pips are 8 px diamonds. World meshes stay sharp except the ball, the attendant head, and Scatter's small spheres."
---
# 3D Neon Breakout Arcade — Design System
Apply this design system to an existing project. It describes the look and feel only; for the full site, use prompt.md.
## Colors
- **Ink** `#07110F` — Page background, renderer clear, start card, sky zenith, fog
- **Court** `#0C1714` — Floor plane and readout chips
- **Grid** `#24584F` — Floor lines and card border
- **Horizon** `#1C6B62` — Sky-dome horizon
- **Teal** `#1EC8B8` — Teal bricks, rails, primary button, spark pips, focus ring
- **Sea** `#7DFFB2` — Sea bricks
- **Ice** `#9AD7FF` — Ice bricks and chipped lime bricks
- **Lime** `#E4F27A` — Two-hit bricks before the first chip, Girder pickup, far lip
- **Hot** `#FF4D1C` — Ball, ball light, center tick, Needle beam, Scatter pickup
- **Paper** `#E7F3EE` — Headings, HUD numbers, paddle body
- **Dim** `#8AA39A` — Eyebrow, labels, hours line, credit
- **Rail** `#12312C` — Side rails and back plate
## Typography
- **Cabinet name on the start card** — Syne (OFL), weights 700/800. Self-host the font files.
- **Body, buttons, and HUD labels** — Sora (OFL), weights 400/500/600. Self-host the font files.
- **Points, round, and timers** — Share Tech Mono (OFL), weights 400. Self-host the font files.
## Spacing & shape
- Spacing: 4 px base. Desktop card padding 28 px, HUD inset 16 px. Mobile inset 12 px plus safe-area insets. Buttons at least 44 px tall. The start sheet on a phone stays within 46 vh and scrolls inside itself. The center of the court stays clear of chrome during play.
- Radius: Start, pause, clear, fail, and controls cards 12 px with a hard 4 px offset shadow in Grid, no blur. Buttons 8 px. Spark pips are 8 px diamonds. World meshes stay sharp except the ball, the attendant head, and Scatter's small spheres.
## Motion
- Fixed step of 1/60 second. Each frame runs at most three steps and drops leftover time. Render with the latest state.
- On the start card the camera eases 0.04 units on x over 8 seconds. During play the camera x eases toward 0.18 times the paddle x, clamped to 1.1, with smoothing 1 - exp(-4 dt).
- A brick break offsets the camera by at most 0.045 units for 0.1 seconds, ease out, one shake at a time. The ball trail keeps the last 10 positions spaced at least 0.12 apart.
- Shatter spawns 14 short-lived boxes. Pickups bob 0.05 units at 1.8 Hz. Overlays fade in 160 ms and do not travel.
- With prefers-reduced-motion, cut the title drift, camera follow, shake, trail, shatter, pickup bob, and overlay fade. Snap UI in place. Keep the ball, the bar, the beam, and the rounds, because that motion is the game.
## Imagery
Draw the court, sky, bricks, bar, ball, pickups, shatter, and the attendant from original Three.js geometry. No photographs, no generated stills, no HDRIs, no downloaded models, and no brand marks. The lit court is the first-screen anchor, with the start card beside it. The attendant is a featureless figure outside the right rail: a box coat in #C5D2CB, a sphere head in #E6C4A4 with no eyes or mouth, and a Teal cap. The figure is fictional and is not a portrait of any real person. No faces anywhere else.
## Tone
Dry, specific, and local, like a night attendant talking to a regular. Short US English. No military hull talk, no death slogan, and no padded scoreboard.
---
Inspired by arcade one-shot 3D breakout by @JulianGoldieSEO — https://agentos.guide/grok-4-7-agent-os
— Prompt by VibeFather · https://vibefather.ai/t/3d-neon-breakout-arcade · CC BY-NC 4.0 (non-commercial; commercial use needs a VibeFather Pro license) · Request removal: https://vibefather.ai/takedown
Make it yours
- A barcade or retro arcade: set BRAND to your cabinet name, VENUE and CITY to your location, and ATTENDANT to the staff member who runs the floor.
- A university rec center: use the campus rec cabinet setup, set VENUE to your building, and keep the five rounds as a drop-in game for students.
- An indie game portfolio: set BRAND to your studio name and TAGLINE to a line about the game, then link the cabinet from your project list.
- A festival or convention booth: rename VENUE and CITY to the event, set ATTENDANT to a host name, and run it full screen on a touch screen.
3D Neon Breakout Arcade: questions and answers
How do I rename the arcade cabinet, venue and city in the 3D Neon Breakout Arcade template?
The 3D Neon Breakout Arcade template exposes five variables: BRAND, VENUE, CITY, ATTENDANT and TAGLINE. Set BRAND to your cabinet name, VENUE and CITY to the place beside it, and ATTENDANT to the person who runs it. Changing those four rewrites the attendant sentence, the hours line and the five round names to fit the new words. A TAGLINE-only change replaces the start deck and keeps the round names.
What are Scatter, Needle and Girder in the 3D Neon Breakout Arcade game?
Scatter, Needle and Girder are the three falling pickups placed in the maps of the 3D Neon Breakout Arcade template. Scatter adds balls, Needle fires a straight beam from the bar, and Girder stretches the bar for a few seconds. They bob as they fall, and catching one changes how the round plays. Their rules and positions stay fixed when you change the cabinet name or city.
Can I change the ball speed, brick maps or neon colors in the 3D Neon Breakout Arcade template?
The 3D Neon Breakout Arcade template keeps speeds, colors, maps and pickup rules fixed by design. The five authored rounds change the brick map and ball speed on their own, and the neon palette runs from teal and sea to ice, lime and hot orange. Renaming the cabinet, venue, city, attendant or tagline does not touch the court. Changing the actual game feel means editing the simulation and level data in the source, which comes with Pro.
Does the 3D Neon Breakout Arcade template need a server or a downloaded 3D model?
No. The 3D Neon Breakout Arcade template builds to static files with no backend, no accounts and no external APIs. Every mesh is built in code with Three.js, so there are no downloaded models, photographs, HDRIs or brand marks. The only stored data is the best points total and the mute flag, kept in the browser. You can host the built files on any static host.
What should I change first in the 3D Neon Breakout Arcade template?
Start with the five variables: set BRAND, VENUE, CITY and ATTENDANT to your own names, then rewrite TAGLINE as the one sentence under the cabinet name. That updates the start card, the document title, the hours line and the round names together. After that, review the copy on the start, clear and fail cards so they match the tone of your venue.
How do I build a 3D neon breakout arcade with AI?
Copy the prompt from this page or run npx vibefather add 3d-neon-breakout-arcade, replace [CITY], [BRAND], [VENUE] and [TAGLINE] with your own content, and paste it into Claude Code, Codex, Cursor or another AI coding agent. The live demos were built from exactly that text.
Which AI model built the 3D Neon Breakout Arcade demo?
The Pier arcade cabinet case was built by Grok 4.7 in Grok Build; the Campus rec cabinet case was built by Grok 4.7 in Grok Build. Each build used the published prompt with nothing added.
What tech stack and pages does the 3D Neon Breakout Arcade template use?
3D Neon Breakout Arcade is a single-page site built with Plain HTML and Three.js, with 3d / webgl and micro-interactions. The prompt fixes the stack so every AI tool builds the same kind of project, and the result runs as a static site you can host anywhere.
Can I use the 3D Neon Breakout Arcade template for a client or a business?
The 3D Neon Breakout Arcade prompt and DESIGN.md are free for personal, non-commercial projects under CC BY-NC 4.0. Client work and commercial use need VibeFather Pro, which also includes the source code of the live demo.
Does the 3D Neon Breakout Arcade template work on mobile?
Yes. Every 3D Neon Breakout Arcade build was tested on a phone-sized screen as well as desktop before it went live, checking layout, text size and touch targets. Open the live demo on your phone, or switch the preview on this page to mobile view, to check it yourself.