Coastal town built with Opus 5.5
See the codeAn island fishing game for the browser. Cast from the pier, the beach or your own boat, fight the fish, sell your catch to Joe at the fish stand, and spend it on better gear at Marta's chandlery. Around it is a real-time tropical island and ocean: swim the reef, drive the boat out to deep water, and watch a humpback breach. It runs directly on WebGPU and WGSL with its own small rendering engine, no framework.
Play it: https://dgreenheck.github.io/tidewater/


Fishing
Ocean
Sky
World
Lighting and post
Audio
| Key | Action |
|---|---|
| W A S D | Move |
| Mouse | Look (click to capture the mouse, Esc to release) |
| Shift | Sprint / boat boost |
| Space | Jump / swim up |
| C | Crouch / dive |
| E | Interact: board the boat, take or leave the helm, step ashore, trade with the fish buyer or the chandlery |
| V | Boat camera at the helm (1st / 3rd person) |
| R | Take out / put away the fishing rod |
| Left mouse | Hold to wind up, release to cast · strike when a fish takes the bait · hold to reel |
| Right mouse | Reel an empty line in |
| I or Tab | Cooler / fish hold and the fish log |
| F | Free camera |
| L | Flashlight |
| T | Pause time |
| M | Mute |
| H | Settings panel |
| P | Photo mode |
| F1 or ? | All controls |
Walk the deck of the boat while it drifts, or fish from the pier and the beach. Cast, wait for the bobber to dip and strike when it's pulled under, then play the fish: keep the line tension in the green band, ease off when it runs. Different water holds different fish (the shallows, the pier, the reef, the bay and deep water offshore), and some bite best at dawn, dusk or night. Sell your catch to Joe at the fish stand on the beach by the pier, and spend it at Marta's chandlery by the boathouse: stronger line, a faster reel, a longer rod, a bigger fish hold, a larger fuel tank, a rebuilt engine, a fish finder and deck floodlights for night fishing. The boat burns diesel at the helm; fill up at the chandlery. Progress is saved in the browser.
The settings panel (H) exposes the sea state, time of day, sun azimuth, clouds, haze, post-processing and more.
Add these to the URL, for example ?fly&noAudio:
| Option | Effect |
|---|---|
fly | Start in the free camera |
noAudio | Disable sound |
noClouds | Skip the volumetric clouds |
noHaze | Skip the haze and sun shafts |
noCaustics | Skip caustics |
noVeg | Skip vegetation |
noSim | Skip the swash (shallow-water) simulation |
npm install
npm run dev # http://127.0.0.1:5189
npm run build # static build in dist/
Every push to main deploys to GitHub Pages through .github/workflows/deploy.yml.
| Folder | Contents |
|---|---|
src/game/ | The fishing game: rod, bites, the fight, catch card, cooler and log, vendors and stalls, guide, minimap, HUD |
src/engine/ | The rendering engine: math, scene graph and geometry, GPU resources, WGSL shader composition, materials, lighting and shadows |
src/ocean/ | FFT ocean, water surface and material, shore waves, breakers, swash, wake, caustics, underwater lighting |
src/sky/ | Atmosphere, clouds, sky and environment |
src/world/ | Terrain, village, pier, reef, fish, vegetation, rocks, debris, wildlife, whale, boat |
src/post/ | Post chain: AO, underwater composite, haze, TAAU, motion blur, bloom, lens flare, droplets |
src/materials/ | Shared lighting: shadow filtering, bounce light, contact shadows, local lights, LOD fades |
src/player/ | Walking, swimming, the boat and the free camera |
src/audio/ | The sample-based soundscape |
src/ui/ | Settings panel, loading screen and HUD |
tools/ | Scripts that fetch and convert the characters, stall props and fishing sounds |
test/ | Headless engine smoke test and game-logic tests (npm test), and HUD / loader dev pages |
The code is released under the MIT license; see LICENSE. Third-party assets (CC0 audio from Freesound, CC0 scans from Poly Haven, MIT characters from Microsoft Rocketbox, OFL / Apache fonts) and technique references are listed in CREDITS.md.
48 commits
JavaScript
97.6%
CSS
1.7%
Coastal town built with Opus 5.5
See the codeAn island fishing game for the browser. Cast from the pier, the beach or your own boat, fight the fish, sell your catch to Joe at the fish stand, and spend it on better gear at Marta's chandlery. Around it is a real-time tropical island and ocean: swim the reef, drive the boat out to deep water, and watch a humpback breach. It runs directly on WebGPU and WGSL with its own small rendering engine, no framework.
Play it: https://dgreenheck.github.io/tidewater/


Fishing
Ocean
Sky
World
Lighting and post
Audio
| Key | Action |
|---|---|
| W A S D | Move |
| Mouse | Look (click to capture the mouse, Esc to release) |
| Shift | Sprint / boat boost |
| Space | Jump / swim up |
| C | Crouch / dive |
| E | Interact: board the boat, take or leave the helm, step ashore, trade with the fish buyer or the chandlery |
| V | Boat camera at the helm (1st / 3rd person) |
| R | Take out / put away the fishing rod |
| Left mouse | Hold to wind up, release to cast · strike when a fish takes the bait · hold to reel |
| Right mouse | Reel an empty line in |
| I or Tab | Cooler / fish hold and the fish log |
| F | Free camera |
| L | Flashlight |
| T | Pause time |
| M | Mute |
| H | Settings panel |
| P | Photo mode |
| F1 or ? | All controls |
Walk the deck of the boat while it drifts, or fish from the pier and the beach. Cast, wait for the bobber to dip and strike when it's pulled under, then play the fish: keep the line tension in the green band, ease off when it runs. Different water holds different fish (the shallows, the pier, the reef, the bay and deep water offshore), and some bite best at dawn, dusk or night. Sell your catch to Joe at the fish stand on the beach by the pier, and spend it at Marta's chandlery by the boathouse: stronger line, a faster reel, a longer rod, a bigger fish hold, a larger fuel tank, a rebuilt engine, a fish finder and deck floodlights for night fishing. The boat burns diesel at the helm; fill up at the chandlery. Progress is saved in the browser.
The settings panel (H) exposes the sea state, time of day, sun azimuth, clouds, haze, post-processing and more.
Add these to the URL, for example ?fly&noAudio:
| Option | Effect |
|---|---|
fly | Start in the free camera |
noAudio | Disable sound |
noClouds | Skip the volumetric clouds |
noHaze | Skip the haze and sun shafts |
noCaustics | Skip caustics |
noVeg | Skip vegetation |
noSim | Skip the swash (shallow-water) simulation |
npm install
npm run dev # http://127.0.0.1:5189
npm run build # static build in dist/
Every push to main deploys to GitHub Pages through .github/workflows/deploy.yml.
| Folder | Contents |
|---|---|
src/game/ | The fishing game: rod, bites, the fight, catch card, cooler and log, vendors and stalls, guide, minimap, HUD |
src/engine/ | The rendering engine: math, scene graph and geometry, GPU resources, WGSL shader composition, materials, lighting and shadows |
src/ocean/ | FFT ocean, water surface and material, shore waves, breakers, swash, wake, caustics, underwater lighting |
src/sky/ | Atmosphere, clouds, sky and environment |
src/world/ | Terrain, village, pier, reef, fish, vegetation, rocks, debris, wildlife, whale, boat |
src/post/ | Post chain: AO, underwater composite, haze, TAAU, motion blur, bloom, lens flare, droplets |
src/materials/ | Shared lighting: shadow filtering, bounce light, contact shadows, local lights, LOD fades |
src/player/ | Walking, swimming, the boat and the free camera |
src/audio/ | The sample-based soundscape |
src/ui/ | Settings panel, loading screen and HUD |
tools/ | Scripts that fetch and convert the characters, stall props and fishing sounds |
test/ | Headless engine smoke test and game-logic tests (npm test), and HUD / loader dev pages |
The code is released under the MIT license; see LICENSE. Third-party assets (CC0 audio from Freesound, CC0 scans from Poly Haven, MIT characters from Microsoft Rocketbox, OFL / Apache fonts) and technique references are listed in CREDITS.md.
48 commits
JavaScript
97.6%
CSS
1.7%