My main projects, from game engine code to a machine running in production.


🧠 Kaban Engine

A game engine and editor in C with some C++ (OpenGL, Windows and Linux). It began as my code from following Casey Muratori’s Handmade Hero. From late 2024 I redesigned it on my own terms, and in 2026 I replaced the old Win32 platform layer with GLFW and moved the renderer to modern OpenGL. Some of Casey’s code (parts of the audio mixer, the debug system, asset loading and low-level utilities) is still in there.

What I built:

  • Renderer: OpenGL 3.3 core with batched drawing, a pixel-art world with smooth sub-pixel scrolling, game shaders and lighting with normal maps
  • Map editor: tile layers, curated tile sets from several sheets, animated tiles, painting tools and full undo/redo, packed into the game’s asset file
  • Navigation meshes: generation from map geometry, obstacle cutting and agent movement
  • Asset system: import, edit and build pipeline with its own packed format and an editor mode
  • Geometry: triangle subtraction, triangulation, and a stripped-down, SIMD-optimized Clipper2 reimplementation
  • Projects and tools: the editor builds games in the background and hot-reloads them on save; a debug window on a second monitor shows the profiler, the log and build output

Status: in active development (October 2026). I’m building Spellweaver, a top-down 2D RPG, on it as the first full game. An earlier version of the engine ran the Spellweaver Saga demo.

🐙 Source on GitHub · 📄 Engine devlog posts · ▶️ Spellweaver Saga demo


🏗️ Golf Ball Counting Machine

A machine that counts used golf balls into fixed batches (48 to 350) for bags and boxes, built for my job at Replay Golf Supplies. I pitched it to management, who approved and paid for it, and I built it outside work hours.

  • Core idea: golf balls are all the same size, so the count can be built into the geometry. Ten gravity-fed rails and an adjustable gate hold an exact batch, and a front gate releases it.
  • v1 (2025): Arduino, stepper motors and buttons. It proved the idea, but wear and jams made it unreliable.
  • v2 (2026): I removed all the electronics. A lever closes the count gate, a ratchet spool sets its tension for any count, the rails are screwed down, and a spring-loaded 3D-printed clamp holds the bags. Now in daily production.

Result: one person counts 25,000 balls into 300-ball boxes in about 2 hours, or into 50-ball bags in about 3. By my rough estimate, that’s about 3–5× more output per person, and it almost never jams.

📄 v1 write-up · 📄 v2 write-up


⚙️ Triangle Subtraction Algorithm

Subtracts one triangle from another in single precision, which I needed for cutting obstacles out of navigation meshes. I reduced the problem to 20 cases and tested it on billions of random inputs.

📄 Blog post · 🐙 Repo


📐 Clipper-2d

A reimplementation of the parts of Clipper2 the engine needed: plain C arrays, freelists and block allocation, and SIMD point math.

📄 Blog post · 🐙 Repo


🐍 Learning: Boot.dev Backend Path

Rounding out my C and engine work with Python, Git, Linux, and backend development. Projects so far include an Asteroids game in Python and pygame.

🎓 Boot.dev profile


I document most of my progress on the Blog.