Skip to main content
Zubin KhavarianZubin Khavarian

hi, I'm Zubin I build learning apps and 3D games for the web and native apps(iOS and Android)

React, TypeScript, Three.js, game-dev, and AI-native engineering, plus notes on what I learn along the way.

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, a camera inspector, scene audits and draw-call batching. Vanilla three and React Three Fiber. Also on GitHub and npm.

Recent posts

See all →

Hundreds of Draw Calls Down to a Handful with BatchedMesh

7 min read

How Typo's Voyage draws every tile and every 3D letter through four three.js BatchedMeshes, poses a whole treadmill on the GPU with one vec4 a frame, and what breaks when you move instances in the vertex shader.

Stamp DEV on the Debug Icon

4 min read

My Debug builds are their own app: a .dev bundle ID, a Dev name, and the real icon with a DEV ribbon a small script draws across the corner. They install beside the App Store version and never touch its data.

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.

Roll It Has No Outline Pass

9 min read

The ink lines in Roll It aren't a post-process. Each material finds its own edges: the median of three distances on a box, crease barycentrics on a mesh, and a view-angle band on the ball.

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.

zubin@zubin.dev: man keys

// go to

  • ghhome
  • gwwriting
  • gaapps
  • gpprojects
  • goopen source

// move

  • jscroll down
  • kscroll up
  • ggtop of page
  • Gbottom of page
  • }next section (posts)
  • {previous section (posts)
  • ]newer post
  • [older post

// do

  • ⌘Ksearch everything
  • /search, too
  • ttoggle light / dark
  • ?this sheet
  • escclose