What We Can Learn From Grass in Ghost of Tsushima RendersIntroduction Ghost of Tsushima renders huge fields of grass that sway in the wind. Each blade animates on its own. Roughly 83,000 blades on screen at once. In about 2.5 milliseconds per frame. This poApr 16, 2026·7 min read
Why The L System Trees Looked WrongIntroduction We wanted procedural trees. We kept getting trunks with leaf puffs. Pine looked acceptable. Oak. Birch. Maple. And sakura did not. They read like poles with crowns. The important lesson iApr 15, 2026·4 min read
Nanite Explained: How Modern Game Engines Render Billions of Triangles Without ExplodingFrom draw calls to culling to virtual geometry. Everything you need to know about the system that killed the triangle budget.Apr 15, 2026·20 min read
Next.js use cache: remote: A Distributed Cache in One LineIntroduction I discovered this while digging through the Vercel docs and the Next.js cache components skill. I was trying to understand how caching actually works when you deploy to Vercel. What I fouApr 15, 2026·8 min read
How To Implement A Level And XP System With ConvexThe goal A good level and XP system should do three things well. It should be easy to reason about. It should be hard to exploit. It should be flexible enough to support more than one reward source. TApr 15, 2026·6 min read
How I Fixed Slow Convex Storage Assets With ConvexThe problem We had a simple problem. Query prefetch was working. Images and audio still felt cold. That meant the next screen could have its data ready, but still show an image pop in late, or start aApr 15, 2026·7 min read
How To Implement A Daily Streak System With ConvexThe goal A daily streak system sounds simple. It is not. The tricky part is not counting. The tricky part is deciding what a day means. If someone played at 10pm, then again at 2am, that is only four Apr 15, 2026·5 min read