| title | Beppo Laughs |
|---|---|
| updated | 2026-04-24 |
| status | current |
| domain | product |
Trapped in Beppo's nightmare circus, driving a clown car through a maze you can't remember entering. Collect what you need, avoid what's watching, find a way out before the laughter catches up.
A 3D first-person survival horror clown-car maze game. Runs in the browser and on Android.
- Web: https://arcade-cabinet.github.io/Beppo-Laughs/ (deployed from
mainvia GitHub Pages). Installable on mobile β Chrome on Android shows "Install app"; iOS Safari β Share β "Add to Home Screen" for a full-screen standalone experience with the proper icon. - Android: Debug APK attached to each GitHub Release. Side-load; not on the Play Store yet.
- Open the landing page, pick a seed (three words), hit Enter the Maze.
- Drive:
- Desktop: hold W or β to accelerate, release to brake. Use arrow keys or WASD to choose at forks.
- Mobile: hold the red lever at the bottom of the cockpit to drive forward; tap a glowing hand (or swipe in its direction) at each fork. Drag a circular gesture across the screen to look around.
- Pick up items at nodes. Some blockades only clear if you carry the right item.
- Avoid the villains β proximity raises fear. Fear at 100 = game over.
- Find an exit. Mazes are seeded, so the same three words always give the same maze.
Share a seed. On the win or game-over screen, tap Share this seed to send a URL that prefills the menu with the same three words. Useful for "think you can beat this?" exchanges.
Silence. The π / π toggle in the top-right mutes the procedural drone and jumpscares without affecting the rest of your device. Preference persists across refreshes.
Reduced motion. The game honors the system-level prefers-reduced-motion: reduce OS setting β the pulsing / bouncing / shaking cues that drive the
horror feel are suppressed so vestibular-sensitive players can still
complete a run.
Prereqs: Node β₯ 22, pnpm 10.33.
pnpm install
pnpm dev # Vite dev server on :5173
pnpm build # tsc --noEmit && vite build β dist/
pnpm test # Vitest
pnpm e2e # Playwright
pnpm lint # Biome check
pnpm native:android:debug # Build a debug APK (requires Android SDK)See CLAUDE.md for the authoritative stack definition and the
commands above in full. See docs/ for architecture, design, and
testing docs.
src/
βββ main.tsx # React root
βββ App.tsx # SPA router
βββ types/ # Shared domain types
βββ core/ # Engine-agnostic game systems
βββ game/ # Game state + maze + textures
βββ components/
β βββ ui/ # Radix-based primitives
β βββ game/ # R3F scene components
βββ assets/catalog.ts # Auto-generated asset manifest
public/assets/3d/ # 29 GLB models (28 MB)
docs/ # Design, architecture, lore, state, testing
Full layout: docs/ARCHITECTURE.md.
Vite 8 Β· React 19 Β· @react-three/fiber Β· three Β· Radix UI Β· Tailwind v4
Β· Zustand Β· Capacitor 8 Β· Biome Β· Vitest Β· Playwright.
Why these: the same shape as the sibling midway-mayhem and
mean-streets projects. One renderer for web and mobile, one
build, minimal ceremony.
- Branch from
main. - Conventional commits (
feat:/fix:/chore:/docs:β¦). pnpm lint && pnpm typecheck && pnpm test && pnpm buildmust pass.- Open a PR. Squash-merge after CI green.
Dependabot runs weekly; patch/minor bumps auto-merge after CI passes.
release-please opens a release PR whenever conventional commits land on
main. Merging it cuts a tagged release with the web bundle and debug
APK attached.
MIT β see LICENSE.