Skip to main content
Back to projects
complete 2026 web-applications

Xalo — Orbital Command

A five-minute orbital mechanics game where you drag satellites off a planet and argue with the inverse-square law.

Drag outward from the planet to launch a satellite. Direction sets the angle, length sets the speed, and after release you are not steering anything — the satellite is in a gravity field, and gravity behaves the way gravity behaves. You have five minutes, and points accrue continuously while a satellite holds a stable orbit, so the score rewards keeping things up rather than throwing a lot of things.

Gravity falls off with the square of distance and the game does not soften it. Launch too slowly and the satellite comes back down; launch too fast and it leaves. An orbit counts as stable once the distance from the planet stays within fifteen percent variance, and that is when it starts scoring. Mass changes the score multiplier and nothing else, so a heavy satellite and a light one launched identically fly exactly the same arc.

Launching sideways works; launching straight up does not.

The good button

C circularizes. It fires the thruster at apoapsis and uses the vis-viva equation to work out the exact velocity change needed to round out an ellipse. Getting something into a rough orbit and then cleaning it up is both the easiest way to score well and the order real missions do it in. Holding Space gives continuous prograde thrust, which is mostly for rescuing something that is about to hit the ground.

M adds a moon. A second gravity source turns settled orbits into a slow argument, and other players can see that you have switched it on.

Six satellite types show up as you launch. Heavy is worth 1.5x and harder to place, Light is 0.8x and easy to overshoot, Solar is the 2.0x prize, and Standard is the baseline. Relay starts at 1.0x and gains a bonus for each network connection. The sixth is a cow. It arrives by UFO and scores triple.

The UFOs are part of the ambient layer along with comets: click a UFO and it leaves, occasionally dropping livestock on the way out. A switches to ambient mode, which takes away the timer and the score and leaves the orbital mechanics running on their own.

Multiplayer is a WebSocket connection to a Node.js server running ws. Other players’ satellites appear in your world in different colours, launches and crashes and burns scroll past in the event log, and if the connection is not there the game runs locally without complaint. Leaderboards run daily, weekly, and monthly, each keeping your best score for the period.

How it is built

The engine is Excalibur.js, but nearly all the drawing happens in custom Canvas 2D through postdraw hooks. The engine contributes the game loop and scene management; rendering stayed under direct control.

Text is the exception. The HUD draws to a plain HTML canvas layered over the game, which sidesteps WebGL texture sampling and keeps labels crisp at any device pixel ratio. Sound is synthesized at runtime with the Web Audio API, so there are no audio files to fetch.

The client is a single file of roughly 5,100 lines. No modules, no bundler, no build step: serve the directory over static HTTP and it runs.