All Projects

Mana Counter

A quick web app that tracks mana in Magic: the Gathering for those thirty-minute turns in which your mana pool gets flooded.

This was built in about an hour because apparently I have to do everything myself because there was a distinct lack of results on Google for mana counters that didn't demand you download an app.

A gif depicting a spinning torus

Right now the engine doesn't do much, so here's a spinning donut.

Palladia Engine

The Palladia Engine is a simple, ECS-based game engine written in C using the SDL GPU API. Currently, it only targets a Vulkan backend, but the goal is to at least also support WebGPU. Most of the code written so far is loosely based on the Learn OpenGL tutorials, at least as far as they can be for using an entirely different graphics API.

The project stemmed from a desire to learn graphics programming and the fact that, in game programming, I often find myself knowing exactly what I want the code to look like, but unsure of how to tell the game engine to do what I want. So I figured that several hundred hours of trial and error should save me thirty or so minutes of reading the Godot documentation.

I intend to come back to this, but as of writing this, my university capstone project is taking up a lot of my time.

I couldn't think of a good image for this one, so here's Piru the Volatile from Magic: The Gathering.

I couldn't think of a good image for this one, so here's Piru the Volatile from Magic: The Gathering.

Piru

The way this project came about is kind of funny. When I was doing my internship at NSHC in the summer of 2025, I was tasked with reading and creating a presentation on the Tiny C compiler by Fabrice Bellard. Perhaps because of the language barrier, I had misinterpreted this as being to write a very simple compiler. I had gotten as far as writing a lexer and parser using a tutorial by Kuter Daniel before the misunderstanding had been cleared up.

The compiler targets the RV64I instruction set for portability. The idea is that the compiled code will run in a virtual machine that executes the RISC-V instructions so that only the VM, not the runtime code, has to be recompiled for new platforms. This virtual machine is, of course, part of the project. As a part of preparing to write this project, I followed a tutorial by Justin Meiners and Ryan Pendleton detailing how to write a simple LC-3 virtual machine, and the RV64I VM would be based on that.

I intend to come back to this, but as of writing this, my university capstone project is taking up a lot of my time.

Lyci.link

This site serves as a landing page for a friend's social media presence—similar to Carrd or Linktree.

It was recently refactored to use Tailwind instead of plain CSS.

Kiko.gg

This site also serves as a landing page for a friend's social media presence—similar to Carrd or Linktree. This one came first, but the projects are listed in reverse chronological order.

It was recently refactored to use Tailwind instead of plain CSS.

Three.js Test

I built this site as a means of familiarizing myself with Three.js. The text was generated by GPT-3.5 turbo.

It might not render correctly in the small preview window depending on your screen's resolution, so open it in a new tab to view it properly.

A photo of Luke Henderson

Lukeh.xyz

This site serves as my developer portfolio and is built with Alpine, Tailwind, and Cloudflare Pages.

Alpine was chosen for similar reasons; this site isn't seriously limited by the "HTML with interaction on top" approach that using something like vanilla JavaScript or jQuery has. I find Alpine to be more ergonomic than those without inflating the client bundle to multiple megabytes in the way that React would likely do.

I really dragged my feet on adding Tailwind, but the ability to use existing component libraries was something I couldn't ignore any longer.

bhm.gg

This site serves as a landing page for my own social media presence—similar to Carrd or Linktree. This one was used as reference for the other two. It also usually gets any updates that I might implement before the other two.

It was recently refactored to use Tailwind instead of plain CSS.