<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Zubin Khavarian</title><description>Zubin Khavarian, Software Engineer: learning apps and 3D games for the web, iOS and Android. React, TypeScript, Three.js and AI-native engineering.</description><link>https://zubin.dev/</link><language>en-us</language><item><title>Stamp DEV on the Debug Icon</title><link>https://zubin.dev/blog/debug-build-own-app/</link><guid isPermaLink="true">https://zubin.dev/blog/debug-build-own-app/</guid><description>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.</description><pubDate>Mon, 05 Oct 2026 12:00:00 GMT</pubDate><category>ios</category><category>tooling</category><author>Zubin Khavarian</author></item><item><title>Your Shader Stutter Happens at First Draw</title><link>https://zubin.dev/blog/shader-stutter-first-draw/</link><guid isPermaLink="true">https://zubin.dev/blog/shader-stutter-first-draw/</guid><description>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.</description><pubDate>Mon, 28 Sep 2026 15:00:00 GMT</pubDate><category>threejs</category><category>game-dev</category><author>Zubin Khavarian</author></item><item><title>Soundscapes for Web Games: A Pluggable Howler Implementation, Part 2</title><link>https://zubin.dev/blog/web-game-soundscapes-2-howler/</link><guid isPermaLink="true">https://zubin.dev/blog/web-game-soundscapes-2-howler/</guid><description>The soundscape engine is one class under a hundred lines. A six-function adapter is the seam.</description><pubDate>Mon, 11 May 2026 17:00:00 GMT</pubDate><atom:updated>2026-08-31T15:45:00.000Z</atom:updated><category>audio</category><category>game-dev</category><author>Zubin Khavarian</author></item><item><title>Soundscapes for Web Games: The Layer Beneath Your SFX, Part 1</title><link>https://zubin.dev/blog/web-game-soundscapes-1-concepts/</link><guid isPermaLink="true">https://zubin.dev/blog/web-game-soundscapes-1-concepts/</guid><description>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.</description><pubDate>Mon, 20 Apr 2026 17:00:00 GMT</pubDate><atom:updated>2026-09-28T17:00:00.000Z</atom:updated><category>audio</category><category>game-dev</category><author>Zubin Khavarian</author></item><item><title>switch(true) in React: First True Wins</title><link>https://zubin.dev/blog/switch-true-the-stylish-way-to-simplify-complex-conditionals-in-react/</link><guid isPermaLink="true">https://zubin.dev/blog/switch-true-the-stylish-way-to-simplify-complex-conditionals-in-react/</guid><description>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.</description><pubDate>Tue, 17 Oct 2023 00:00:00 GMT</pubDate><atom:updated>2026-09-28T17:00:00.000Z</atom:updated><category>react</category><category>javascript</category><author>Zubin Khavarian</author></item><item><title>Conventional Comments: Say What It Is and Whether It Blocks</title><link>https://zubin.dev/blog/crafting-quality-code-with-conventional-comments/</link><guid isPermaLink="true">https://zubin.dev/blog/crafting-quality-code-with-conventional-comments/</guid><description>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.</description><pubDate>Tue, 10 Oct 2023 00:00:00 GMT</pubDate><atom:updated>2026-09-28T17:00:00.000Z</atom:updated><category>git</category><category>process</category><author>Zubin Khavarian</author></item><item><title>Yak Shaving: Shave It, Stash It, or Skip It</title><link>https://zubin.dev/blog/to-yak-shave-or-not/</link><guid isPermaLink="true">https://zubin.dev/blog/to-yak-shave-or-not/</guid><description>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.</description><pubDate>Tue, 19 Sep 2023 00:00:00 GMT</pubDate><atom:updated>2026-09-28T17:00:00.000Z</atom:updated><category>process</category><author>Zubin Khavarian</author></item><item><title>Turn on skipLibCheck</title><link>https://zubin.dev/blog/turn-on-skiplibcheck/</link><guid isPermaLink="true">https://zubin.dev/blog/turn-on-skiplibcheck/</guid><description>skipLibCheck stops TypeScript auditing .d.ts files. Your own code is still fully checked. Turn it on, and leave it on in CI too.</description><pubDate>Sat, 26 Aug 2023 17:00:00 GMT</pubDate><atom:updated>2026-09-28T17:00:00.000Z</atom:updated><category>javascript</category><category>typescript</category><author>Zubin Khavarian</author></item><item><title>Use ESM</title><link>https://zubin.dev/blog/use-esm/</link><guid isPermaLink="true">https://zubin.dev/blog/use-esm/</guid><description>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.</description><pubDate>Mon, 21 Aug 2023 17:00:00 GMT</pubDate><atom:updated>2026-09-28T17:00:00.000Z</atom:updated><category>javascript</category><category>typescript</category><author>Zubin Khavarian</author></item><item><title>Prefer Named Exports</title><link>https://zubin.dev/blog/prefer-named-exports/</link><guid isPermaLink="true">https://zubin.dev/blog/prefer-named-exports/</guid><description>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.</description><pubDate>Thu, 17 Aug 2023 17:00:00 GMT</pubDate><atom:updated>2026-09-28T17:00:00.000Z</atom:updated><category>javascript</category><category>typescript</category><author>Zubin Khavarian</author></item><item><title>TypeScript Has Two Decorator Systems</title><link>https://zubin.dev/blog/standard-decorators/</link><guid isPermaLink="true">https://zubin.dev/blog/standard-decorators/</guid><description>Standard decorators take (value, context) and need no tsconfig flag. experimentalDecorators switches you back to the 2015 design. The two are not compatible, so pick one on purpose.</description><pubDate>Fri, 23 Jun 2023 17:00:00 GMT</pubDate><atom:updated>2026-09-28T17:00:00.000Z</atom:updated><category>javascript</category><category>typescript</category><author>Zubin Khavarian</author></item></channel></rss>