Skip to main content
Zubin KhavarianZubin Khavarian

Hey, I'm Zubin

I build for the web and write about what I learn along the way. React, TypeScript, Three.js, game-dev, and AI-native engineering.

Projects

See all →
  • Typo's Voyage

    Typo rows a boat through tropical water and types words to clear mines and other obstacles on a voyage to get faster. I led the 3D team at edclub that built it. Built with Three.js.

  • Keyboard Express!

    You type the words on the track before the train hits them and try to bring every wagon of cargo to the finish. Built with React Three Fiber and Three.js.

  • connect-it

    You place timers, QR codes, logic gates, displays, and music nodes on a canvas and draw wires between them. Values update on the edges as you edit. An extensive node library helps you find nodes and learn about each, and a starter template library comes with it. Inspired by Austin Griffith's eth.build, which I still think is amazing. Built with React Flow.

  • roll-it

    WASD rolls a ball over floating tile islands while you collect gems. Rapier runs the physics. A sketch shader inks the world. When the ball rolls behind a wall or a tree, that scenery turns see-through. Built with React Three Fiber and Three.js.

Open Source

See all →
  • three-kit

    three.js dev tools, each published on npm as @zkmake/*: a performance HUD, a live texture panel, scene audits and draw-call batching. Vanilla three and React Three Fiber. Also on GitHub and npm.

Recent posts

See all →

Your Shader Stutter Happens at First Draw

8 min read

A three.js hitch the first time an effect appears is usually a WebGL program link. It blocks at the first draw, not at compile, and a warm-up only fixes it if it links the same program variant your frames use.

Soundscapes for Web Games: A Pluggable Howler Implementation, Part 2

12 min read

The soundscape engine is one class under a hundred lines. A six-function adapter is the seam.

Soundscapes for Web Games: The Layer Beneath Your SFX, Part 1

8 min read

Most web games go silent the moment the player stops moving. A soundscape is the quiet layer underneath your SFX that keeps the room alive.

switch(true) in React: First True Wins

5 min read

switch(true) runs the first case that is true, which makes it a tidy way to write ordered conditions. It is the right tool less often than it looks. Here is when it earns its place.

Conventional Comments: Say What It Is and Whether It Blocks

5 min read

Most code review friction comes from not knowing whether a comment blocks the merge. Conventional Comments is a short prefix that says what kind of feedback it is and whether you have to act on it.