Joël van der Werf
All posts

Four years of Hydro: from a Vulkan triangle to an editor

Hydro started in July 2022 as a window and a validation layer. A look back at four years of a side project that kept getting picked up again.

Hydro's first commit is from 14 July 2022. The git history since then reads like most side projects: a burst of energy, a long pause, another burst. What kept it alive is that every pause ended with something I could pick up again. Here is how it grew.

July 2022: something on screen

The first week was plumbing: premake, GLFW, GLM, ImGui and spdlog as submodules, a window abstraction, events and input. Then Vulkan, the slow way: an instance with the Khronos validation layer, physical device selection, a logical device and graphics queue, a surface, a swapchain with image views, shaders, a command pool and a pipeline.

The commit on 25 July is called "Got something on screen". The ones after it are the classic next lessons: shut Vulkan down correctly, render more than one frame, recreate the swapchain when the window resizes. By the end of the month there were vertex and index buffers.

2023: the parts every renderer needs

In spring 2023 came uniform buffers and descriptor sets (with a cube that spun, commit message "Spin boi spin"), a memory allocator, textures loaded with stb_image, and a descriptor builder to stop writing the same Vulkan boilerplate by hand. In May, ImGui with docking. In November, a camera, a DrawQuad API, batched rendering of quads from a scene, and a commit simply called "Simple game".

2025: an engine, not a renderer

In June 2025 I came back with a different goal. A renderer draws things; an engine needs a world to draw. The editor got a real viewport, and the scene moved onto an ECS built on EnTT, with components, a hierarchy window and scenes.

October 2026: everything at once

Since October 2026 Hydro has grown faster than in the three years before: projects and YAML scene saving, a console, a full engine review, sprite sheets, Box2D, particles, a 3D renderer with shadows and HDR, Jolt physics, a scene hierarchy and runtime UI, standalone builds and data-driven content. Most of the posts in this devlog are about that month.

The Oxygen editor with the Shrine Glade open: hierarchy, editor and game viewports, render settings and console
Oxygen today: the hierarchy, a free editor camera next to the running game, render settings and the console, with Eonlore’s Shrine Glade open.

Two things changed. I knew what I wanted to build: Eonlore, an RPG to prove the engine. And I started working with AI coding agents inside a harness of rules, docs and checks, which made it possible to move this fast without losing control of the architecture.

What kept it alive

  • Small, named steps. Commits like "Create vulkan surface" are boring, but you can come back after a year and know where you stopped.
  • Validation layers from day one. Vulkan tells you what you did wrong, as long as you let it.
  • A goal bigger than the engine. "Learn Vulkan" stalled twice. "Make this game run" hasn't.
Newer: 56 issues: what a full engine review found

Building a game, an engine, or the tools around them?

I'm based in Tokyo and open to conversations about Unity, C++ and engine roles, C# and .NET software roles, and teams that want to put AI agents to work on real codebases.