Experimental browser game
An experimental multiplayer submarine extraction game with no client build step, data-driven vector art, and browser-generated audio; its generated asset system led directly to Pat Engine.
- Status
- Experimental alpha
- Platform
- Browser
- Development
- Solo
- Source
- Private repository
Portfolio notes
Why I made it
I started Pat's Sub Game to see how far I could take a browser game with no build step and as little pre-rendered media as possible. That meant describing the artwork as vector data, generating audio in the browser, and building tools to edit both. The asset system eventually became a project of its own and led directly to Pat Engine.
The result is a real-time multiplayer submarine extraction game played almost entirely in the dark. You outfit a modular submarine, use directional sonar to reveal the surrounding ocean, fight or salvage what you find, and surface before the Abyssal Surge ends the dive. It is still an experimental alpha: I have run playtests and have a long list of things I want to improve, although it is not my primary focus at the moment.
Project notes
Inside Pat's Sub Game
The private project notes are presented here with the playable build and screenshots kept in view.A sonar-driven multiplayer extraction game running entirely in the browser.

Generating the assets in the browser
The main experiment behind Pat's Sub Game was reducing its dependence on pre-rendered assets. The client uses vanilla JavaScript and Canvas2D without a framework, bundler, transpiler, or client build step.
Submarines, modules, payloads, NPCs, world objects, visual effects, and interface icons are described as data and drawn from vector primitives at runtime. The same approach extends to browser-generated, data-driven audio.
As the game grew, editing all of that data directly became its own problem. I built browser-based tools for artwork, effects, sound, sequences, maps, mount points, and game balance. Those systems became the foundation of Pat Engine, which generalizes the authoring approach so it can be reused in other browser games.
Build a submarine, then dive
Every dive begins at the loadout screen. Players assemble a submarine within a fixed budget, choosing its hull, engine, sonar, weapons, targeting systems, cargo capacity, and utility modules.
Those choices determine what the submarine is good at once it enters the water. A fast scout, a salvage rig, and a heavily armed broadside ship have different strengths, and the mount and budget limits prevent any one loadout from doing everything.
Once underwater, the loop is straightforward:
- Search the darkness with directional sonar.
- Fight other players and autonomous factions or salvage what they leave behind.
- Resupply and repair at depots when necessary.
- Reach a surface plume before the Abyssal Surge closes the arena.
- Bank the recovered scrap and equipment for a future dive.
Anything still in the cargo hold remains at risk until it has been extracted.
The ocean stays dark until you reveal it

Sonar is both a navigation system and a tactical decision. Wide pings reveal more of the ocean, but they produce less precise information, take longer to establish a target lock, and announce the submarine's position to nearby listeners. Narrow pings cover less space but produce faster, more accurate locks.
Contacts fade back into darkness after they have been detected, so the map is never simply uncovered. Players have to decide how much information they need and how much attention they are willing to attract to get it.
Cargo, weapons, and extraction

Players can carry guided torpedoes, rocket salvos, magnetic mines, and chaff countermeasures, along with scrap and upgraded equipment recovered during a dive. Cargo space is volume-based, so ammunition and salvage compete for the same limited hold.
That creates the main extraction decision: keep searching and risk what is already aboard, or head for the surface and make the haul permanent.
Multiplayer crews can share a submarine through invite codes. Before diving, the captain can assign individual ship systems to other crew members while retaining control of anything left unassigned.
A server-authoritative shared world
The game simulation runs on a Node.js server at 20 ticks per second. The browser sends player intent, while the server decides movement, collisions, damage, sonar detection, target locks, inventory collection, projectile hits, and extraction.
Clients receive snapshots over WebSockets and interpolate them for rendering at 60 frames per second. This keeps the shared world consistent while preserving smooth movement in the browser.
Players can enter as guests or create accounts that retain banked scrap, installed modules, inventory, and extraction history. The world also contains autonomous salvagers, security drones, reclaimers, supply and repair depots, environmental hazards, and rotating arenas.
Current state
Pat's Sub Game is an experimental alpha built and maintained as a solo project. I have run multiplayer playtests and collected a substantial list of improvements I would like to make. Development is ongoing, but the game is not my primary focus right now.
The current build is playable at patssubgame.com.