Skip to main content
Zubin KhavarianZubin Khavarian

Writing

RSS

Notes on front-end work, TypeScript, and the overlap with games and audio: skipLibCheck in tsconfig, ES modules, and ink outlines without a separate pass.

TypeScript 7: What Breaks Is the API, Not Your Code

4 min read

TypeScript 7's native tsc type-checked my apps six to nine times faster and flagged nothing new. What broke was every tool that imports the compiler: the typescript package no longer ships the JavaScript API. One repo moved; this blog can't yet.

#typescript#tooling

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.

#threejs#game-dev

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.

#ios#swift#app-store#tooling

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.

#threejs#game-dev

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.

#threejs#game-dev

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

13 min read

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

#audio#game-dev

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.

#audio#game-dev

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.

#react#javascript

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.

#git#process

Yak Shaving: Shave It, Stash It, or Skip It

5 min read

Yak shaving vs bike shedding: a yak is one person following a chain of real tasks away from the work, and a shed is a group stuck on something small.

#process

Get new posts by email

One short email when a post goes out, about once a week. Unsubscribe any time.

Or follow along:RSSGitHubX

zubin@zubin.dev: man keys

// go to

  • ghhome
  • gwwriting
  • gaapps
  • gpprojects
  • goopen source
  • gnnow
  • guuses

// 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