About this project

singedTerra is a browser-based, turn-based artillery game written from scratch in TypeScript, presented as a homage to Wendell Hicken's Scorched Earth (1991). It keeps the classic loop: pick an angle, read the wind, commit to a power setting, and fire, while the terrain records the consequences. It is playable as a 2–4 player hot-seat match in a single browser or online through public and private Supabase rooms. Core mechanics. Terrain is a per-pixel bitmap: explosions carve real holes, unsupported ground collapses, tanks settle into craters, and dirt-type weapons can build new cover. Each round is seeded and each turn receives a deterministic wind vector, so every client resolves the same flight path. Sixteen weapons cover direct fire, airbursts, bouncing explosives, napalm, terrain construction, tunneling and defense. Movement consumes fuel, and damage earns credits that must be split across ammo, shields, batteries and fuel over multi-round matches. The presentation includes authored tanks, a dusk battlefield, ballistic instruments, impact lighting, screen shake and synthesized audio. Tank garage. Every seat has a Garage: players start from the Foundry, Ranger, Bulwark or Jackal chassis and combine mobility, hull, turret and barrel parts into a custom silhouette, which appears in the roster preview and carries into the match. Modes and netcode. Computer-controlled seats use the same deterministic physics as human players, and hot-seat and online modes do not use different physics. Hot-seat runs the shared engine directly in the browser via HotSeatClient. For online play, every browser runs its own copy of the same engine: Supabase validates room actions, assigns sequence numbers, stores the ordered log and broadcasts committed rows through Realtime. The canonical online match is a seed plus an ordered action log; game state is reconstructed locally rather than streamed from a ticking server, which makes fixed timesteps, seeded randomness and replay parity part of the design contract. Controls. Arrow keys aim the barrel and raise or lower power; A and D move and spend fuel; Q cycles the selected weapon; Space or Enter fires or activates the selected shield; G toggles trajectory guidance; M mutes or restores synthesized audio; holding F fast-forwards the current shot locally. Touch layouts replace the keyboard deck with a grouped Command Deck covering Aim, Power and Drive, while Weapon and Menu are utilities and Fire, Store, fuel and Arsenal stay in the tactical rail. On desktop, dragging outward from the active tank sets angle and power without firing. Running and verifying. The project requires Node 24.15 or newer within the Node 24 LTS line, plus npm; npm install followed by npm run dev serves the Vite client at localhost:5173, and hot-seat play needs no backend configuration. Online play requires VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY in client/.env; the anon key is expected to ship in the public client, while Row-Level Security and Edge Function validation protect server-side data. Verification commands include npm run check (typecheck plus deterministic engine harnesses), npm run test:client (Vitest client and DOM tests), npm run check:edge (Deno tests for Supabase Edge Functions), npm run test:e2e (production Chromium layout and gameplay checks) and npm run build. CI runs the same core gates on every pull request, and changes under shared/src/engine/ must preserve deterministic replay. Repository layout and documentation. client/ holds the Vite app, Canvas renderers, HTML HUD, input and lobby; shared/ holds the deterministic engine, replay logic and shared types; supabase/ holds Postgres migrations and stateless Edge Function referees; scripts/checks/ holds deterministic engine and contract harnesses; e2e/ holds production-browser gameplay and layout guardrails; docs/ holds player, architecture, development and project records. Documentation covers playing, architecture, development and operations, the UI system and the current specification. The project is released under the MIT License and is not affiliated with or endorsed by the original Scorched Earth authors.