PolyFish

It started with beer, not fish

PolyFish is twelve years old and it started with beer. A private VR experiment about yeast and a population curve that crashes on purpose, which turned into an ocean I actually showed people. Here is where the fish came from.

PolyFish started as a beer. The yeast in one, specifically: little organisms that eat sugar, get fat and happy, breed like crazy, then starve in a pile once the sugar runs out. In 2014 I built a small VR visualization of that fermentation curve, just for me, and watched the blobs bloom and crash with real depth in a headset. Nobody else ever saw that version. It wasn’t much to look at. But it taught me one thing worth keeping: watching a whole population live and die in front of you is gripping, even when the cast is a bunch of blobs.

So I built the thing those blobs were trying to become. Same loop, find food, eat, reproduce, run out, die, but an ocean of fish instead of yeast in a dish. That became PolyFish, and that is the version I actually showed people. The loop is still the engine under it today. The bones never changed, only the fidelity did.

The North Door, 2014

An attendee at the 2014 meetup wearing a VR headset, experiencing the early PolyFish underwater scene
Someone meeting PolyFish for the first time, in a headset. Lower-poly than it is now, and my dad’s narration was already running over it.

I showed PolyFish at an Austin VR meetup at The North Door in December 2014, back when positional tracking was new and nobody was quite sure what VR was for yet. I definitely wasn’t. What I had was a little ocean of low-poly fish that lived and died on their own, projected up on the big screen, and it turned out that was enough to make people stop and watch. The room was mostly other builders, so the bar for “huh, neat” was high, and a tank of fish quietly running their own boom and bust still cleared it.

A wide panoramic photo of the 2014 Austin VR meetup at The North Door, with PolyFish projected on a large screen while attendees watch
The North Door, December 2014. That is PolyFish up on the big screen. Most of early VR was people squinting at tech demos, so a little ocean that quietly lived and died was a nice change of pace.

My dad narrated it

Here is the part that made it more than a physics toy: it had narration. My dad, Phil, does voice-over for a living, the real thing. I wrote a deliberately cheesy, too-serious nature-documentary script and he read it dead straight, full gravitas, over a tank of low-poly fish that frankly had not earned that level of respect yet. That voice is the thing that turned a tech demo into a tiny documentary that does not take itself seriously.

Being able to collaborate with my Dad on this was special. I had helped him with his work before, and now he could help me with mine.

A tech demo with nowhere to go

What I did not have was any idea what it was for. It wasn’t a game. It wasn’t a product. It was a gorgeous little dead end with my dad’s voice on it. So it did what gorgeous little dead ends do: it went in a drawer. For about a decade. Unity shipped a dozen new versions, headsets came and went and came back, and I had a day job making games, which is a great way to spend all your making energy before you ever get home to your own stuff. The ocean just sat there, frozen, exactly as alive as I had left it.

A birthday, then a browser

What finally pulled it back out was my dad’s birthday. I wanted to give him something, and the something I already had was this: his narration, sitting on top of a build that only ran on a headset, with an install. Not exactly “here, Dad, open this.” So the present turned into the work. I rebuilt the whole thing to run in a browser, so he could open it on anything, anywhere, from a link, and so could everyone else. He had done his part back in 2014. This time the job was mine.

What I kept, and what I tore out

I kept the ecosystem. That part is sacred. It still starts slow and quiet, ramps up to a frankly stupid number of fish, then falls apart once the predators catch on. Almost everything underneath it got torn out and rebuilt: hand-written Unity and C# became Three.js and JavaScript, the physics engine changed, the shaders were rewritten from nothing, and those low-poly fish finally got real light and moving water to swim through.

I started the port with Codex in Cursor and switched to Claude Code partway through. I will say that plainly, because pretending otherwise helps nobody, but it is not the interesting part. The interesting part is that it let one tired person pull off a big rewrite in spare evenings. “Get it running in a browser” quietly turned into “okay, how much better can this actually be.” It got a lot better.

That is the origin. A beer experiment that learned to swim, sat in a drawer through most of a decade, and got dragged back into the light as a birthday present. Everything else I write about this thing is just me explaining how the fish work. They die, by the way. On purpose. We will get to that.

Open PolyFish on the live site ↗


all PolyFish updates