v4rgas/two-feet

Two Feet: a physics-based browser skate game where each foot is controlled separately. A game by v4rgas.

TypeScript

1

124 commits

updated Sep 28, 2026

See the code

See what people are saying

README

Two Feet

A physics skateboard game for the browser, played with two feet: each foot has its own keys. No trick buttons: the feet push the board, the physics reacts, and the game names what the board did. A game by v4rgas.

Run it

pnpm install
pnpm dev        # http://localhost:5173
pnpm build      # a static build in dist/ (runs the type check first)
pnpm preview    # serves dist/

Checks: pnpm check && pnpm lint && pnpm test, plus pnpm montage:verify (the montage clips land) and pnpm test:human (lines played with sloppy human timing).

Play

The first launch opens with a short intro (a hardflip down a two-foot drop, any key skips it), then a short tutorial on flat ground (push, ollie, kickflip). After that you're on the Street Course. Later launches open the last map you played; Esc → Intro replays the intro.

Keys (regular stance)
W A S Dfront foot
↑ ← ↓ →back foot
Spacepush on the ground, catch in the air
hold ↓ + S, let go of ↓, then Wollie
A / D after the popkickflip / heelflip
← / → after the popshove-it
Q / Ebody spin, steer
Rrestart at your checkpoint, or at the start
Cset a checkpoint (on four wheels)
Escmenu: maps, stance, tutorial, intro, controls

In goofy the two key clusters swap feet. Change stance in the menu. The menu's Controls page shows every move in your stance.

Dev builds also have F1 (debug overlay), F3 (tuning panel), ?map=<id> to open a map directly, and ?montage / ?demo.

Add a map

Add a folder src/maps/<id>/ with a map.ts that exports a MapDefinition built from the world context's obstacle kinds. Nothing else: the game finds it at build time and it shows in the menu. See src/maps/README.md.

More

Deploy (Cloudflare)

Live at https://twofeet.v4rgas.com. It's a static Vite build, served by a Cloudflare Worker with static assets (the successor of Cloudflare Pages), in the Worker project two-feet.

  1. One time: pnpm exec wrangler login (opens a browser to authorise Cloudflare).
  2. Deploy to production: pnpm deploy (runs the checks, builds dist/, uploads it).
  3. Upload a preview version instead: pnpm deploy:preview (prints a preview URL; production doesn't change).

wrangler.toml holds the Worker name, the custom domain and the assets folder. public/_headers sets the cache headers. The same build is also on two-feet.juanvargasbes.workers.dev.

v4rgas/two-feet

Two Feet: a physics-based browser skate game where each foot is controlled separately. A game by v4rgas.

TypeScript

1

124 commits

updated Sep 28, 2026

See the code

See what people are saying

README

Two Feet

A physics skateboard game for the browser, played with two feet: each foot has its own keys. No trick buttons: the feet push the board, the physics reacts, and the game names what the board did. A game by v4rgas.

Run it

pnpm install
pnpm dev        # http://localhost:5173
pnpm build      # a static build in dist/ (runs the type check first)
pnpm preview    # serves dist/

Checks: pnpm check && pnpm lint && pnpm test, plus pnpm montage:verify (the montage clips land) and pnpm test:human (lines played with sloppy human timing).

Play

The first launch opens with a short intro (a hardflip down a two-foot drop, any key skips it), then a short tutorial on flat ground (push, ollie, kickflip). After that you're on the Street Course. Later launches open the last map you played; Esc → Intro replays the intro.

Keys (regular stance)
W A S Dfront foot
↑ ← ↓ →back foot
Spacepush on the ground, catch in the air
hold ↓ + S, let go of ↓, then Wollie
A / D after the popkickflip / heelflip
← / → after the popshove-it
Q / Ebody spin, steer
Rrestart at your checkpoint, or at the start
Cset a checkpoint (on four wheels)
Escmenu: maps, stance, tutorial, intro, controls

In goofy the two key clusters swap feet. Change stance in the menu. The menu's Controls page shows every move in your stance.

Dev builds also have F1 (debug overlay), F3 (tuning panel), ?map=<id> to open a map directly, and ?montage / ?demo.

Add a map

Add a folder src/maps/<id>/ with a map.ts that exports a MapDefinition built from the world context's obstacle kinds. Nothing else: the game finds it at build time and it shows in the menu. See src/maps/README.md.

More

Deploy (Cloudflare)

Live at https://twofeet.v4rgas.com. It's a static Vite build, served by a Cloudflare Worker with static assets (the successor of Cloudflare Pages), in the Worker project two-feet.

  1. One time: pnpm exec wrangler login (opens a browser to authorise Cloudflare).
  2. Deploy to production: pnpm deploy (runs the checks, builds dist/, uploads it).
  3. Upload a preview version instead: pnpm deploy:preview (prints a preview URL; production doesn't change).

wrangler.toml holds the Worker name, the custom domain and the assets folder. public/_headers sets the cache headers. The same build is also on two-feet.juanvargasbes.workers.dev.

Languages

TypeScript

97.9%