Skip to main content
Zubin KhavarianZubin Khavarian

Writing

RSS

Notes on front-end work, TypeScript, and the overlap with games and audio.

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

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.

#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 is a chain of reasonable tasks that walks you away from the thing you sat down to build. Three questions tell you whether to follow it.

#process

Turn on skipLibCheck

4 min read

skipLibCheck stops TypeScript auditing .d.ts files. Your own code is still fully checked. Turn it on, and leave it on in CI too.

#javascript#typescript

Use ESM

6 min read

JavaScript has a standard module system, and new code should use it. Here is how Node decides whether a file is ESM or CommonJS, where CommonJS still matters, and why AMD and UMD are history.

#javascript#typescript

Prefer Named Exports

4 min read

A default export lets every file that imports it choose its own name, and those names drift. Named exports rename with the compiler. Use them unless a framework needs a default.

#javascript#typescript