Skip to content

arcade-cabinet/Beppo-Laughs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

283 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

title Beppo Laughs
updated 2026-04-24
status current
domain product

Beppo Laughs

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.

Play

  • Web: https://arcade-cabinet.github.io/Beppo-Laughs/ (deployed from main via 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.

How to play

  1. Open the landing page, pick a seed (three words), hit Enter the Maze.
  2. 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.
  3. Pick up items at nodes. Some blockades only clear if you carry the right item.
  4. Avoid the villains β€” proximity raises fear. Fear at 100 = game over.
  5. 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.

Develop

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.

Project layout

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.

Stack

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.

Contributing

  1. Branch from main.
  2. Conventional commits (feat: / fix: / chore: / docs: …).
  3. pnpm lint && pnpm typecheck && pnpm test && pnpm build must pass.
  4. 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.

License

MIT β€” see LICENSE.

Packages

 
 
 

Contributors