This is a look back on the projects that I worked on during 2025. I’ve never posted anything like this before, and hopefully it won’t be the last time.
Overview
2025 was heavily focused on Zig and game development with Godot. I contributed to multiple organisations and created several new tools and libraries, in varying states of release.
It was the first time that I have been able to write Zig professionally, and I hope to do more in the future. The year also included a bit of Go and Python. I got pretty familiar with OpenSSL and discovered how archaic it is. I’ve definitely enjoyed working with libsodium much more than OpenSSL.
In terms of personal projects, most of my time was probably spent working on gdzig and its related projects. Gdzig is a hard fork of the now dead godot-zig project, which aims to bring Zig and Godot together. Shout out to Tristan Pemble who has been my main co-conspirator on the gdzig project.
I have also vibe engineered several prototypes and MVPs, most of which have not gone anywhere.
- Getting binary builds of Ruby into mise (because I hate that building Ruby is a standard practice)
- Social media management for game developers
- A todo app for ADHD using the Socratic method
- Finding the best times to post to Hacker News for your timezone
- Voting app for LAN parties
- Feature crowd-funding for GitHub
Without further ado, here are the projects with a short description of each, and their current status.
Game development
Games

A retro-styled action game inspired by Space Invaders and Missile Command. It’s a solo project that’s been in development on and off for a couple of years.
Due to issues with my mental health in 2025, I really haven’t given PA84 the attention that it deserves. Though, to be perfectly honest, I don’t think there’s much of a market for this type of game. I’ve never received the kind of feedback that would indicate to me that this is a game that people are clamouring for.
My current plan is to polish the rough edges and just release it for a couple of bucks.
Godot tooling
Zig bindings for Godot 4.x, forked from the now-defunct godot-zig project. Code generation is at the core of how gdzig works. We process the GDExtension API and C headers and generate Zig structs for every Godot Engine class and method. We have given great care to using Zig’s comptime to maximise performance and reduce the need for allocations.
A novel technical tidbit is that we have a @mixin system that I borrowed from other languages. Using Zig’s Ast we can replace auto-generated code with hand-written replacements.

gdoc (pronounced guh-doc) is a command-line documentation viewer for Godot Engine. Instantly look up classes, methods, and properties without leaving your terminal or opening a browser.
I was using the JSON API dumped from the Godot binary, but I recently discovered that it does not have all of the docs. Tutorial links and some global classes are not documented in there, and need to be pulled directly from XML files in the Godot Engine source. My plan is to look more deeply into this so that I can get it all on the CLI.
A pretty-print formatter for Godot’s scripting language gdscript. I had been using gdformat that comes with the gdtoolkit written in Python, but I found its performance to be fairly lacklustre.
gd-pretty is written in Zig and uses tree-sitter under the hood. My philosophy for gd-pretty is to follow how the zig fmt tool works. There are no configuration options. You control how code is formatted by using things like trailing commas (or not).
This project uses snapshot tests that I lovingly stole from gdformat. As I continue to work on it, I can see visual feedback in the tests.
Libraries
A Goal-Oriented Action Planning library written in Zig. GOAP is an AI technique commonly used in games for decision-making. There is a great video on YouTube by AI and Games that goes into detail about how GOAP works and why it was such an important development in AI.
My current plan for this project is to use gdzig to package it into an extension for the Godot Asset Library.
Miscellaneous

This project aims to implement all the functionality of the 1995 game Whiplash/Fatal Racing in a way that builds and runs on modern PCs. Where necessary, DOS-specific functions are substituted with SDL and Windows/Unix equivalents.
This process all started when I discovered a debug version of Fatal Racing on archive.org. With the help of wcdatool I was able to reverse engineer many aspects of the data format with the hardest piece being the unmangle method. See loadcompactedfile.
Using my foundational work along with contributions from others, particularly Zizin13, Fatal Racing is playable on modern systems.
A social media management app for indie game developers. One of the frustrations that I have had with trying to market my games is syndicating posts to multiple sites. There are some solutions out there but they have expensive monthly subscriptions.
My thought was to create an offline-first single purchase app that can post to all the major socials. If you need to sync, every platform has a way to do that. The only ongoing monetisation that I had considered was to provide rich aggregate analytics.
GamePost never got to a testable state. I really need to revisit this now that I have “mastered” Claude Code. I think I could whip something up pretty quickly.
Other highlights
A BBCode parser written in Zig. If you ever posted on a forum in the early 2000’s, you know bbcode. It sounds antiquated, but there are still PHPBB forums live today that use it.
Used by gdzig to convert the Godot Engine documentation from bbcode to markdown. You can see it in action on the gdzig documentation site
Official Zed editor support for Windows is only a recent thing. I’m not even using Windows anymore, but when I was, I wanted to use Zed. Building Zed for Windows was pretty straight forward, and there wasn’t a way to get binaries, so I made one myself.
If you’re happy with stable builds, you should use the official builds, but there are still many users who are on the bleeding edge using the nightly builds that I still maintain.
A Zig library for generating compile_flags.txt files to improve C/C++ IDE integration in projects that use Zig as their build system.
Read more about it in the links below.
Vibes
These are projects that are vibe engineered using Claude Code.
A mise backend for Ruby using rv to provide precompiled Ruby binaries. Because building Ruby from source is painful and I hate it.
I will eventually clean this up and submit to mise if jdx will have it.
A platform concept for crowd-funding features on GitHub repositories. Comment something like @featurefund pledge $50. When the minimum pledge amount is reached, the campaign can be claimed. To put it simply, when the maintainer approves and merges a PR with a pledge, the developer gets the funds.
I think this is useful because it allows the community to put their money behind features they want/need. It also still allows the project maintainer control over what features they actually want in their project. I have more thoughts on this, so contact me if you have questions or concerns.
I posted about this. It’s a tool to find the best times to post to Hacker News based on your timezone. The numbers are magic and the outcomes are not guaranteed.
I dogfooded the blog post about it by using the tool to work out when to post it. It did terribly! Conversely, I used it for my post about Apple v Framework laptops and that was on the front page for several days.
Link below. Your mileage may vary.

A voting app designed for LAN parties. Works on modern devices and ancient browsers (IE 6-7, Netscape). I added a CLI so that you can use an LLM to manage polls.
It serves both a modern and legacy UI on ports 443 and 80 respectively. Ancient browsers will have no problem with port 80, and modern browsers will just use HTTPS (443).
I won’t claim that it is secure. The intention is to host it at a private LAN party.
A todo app for people with ADHD that uses the Socratic method to help break down overwhelming tasks into manageable steps.

What I found was that it works great, but testers would often put in silly goals like “I want to eat more cheese”. When they put in something more difficult like “Plan a camping trip”, the outcome was much better.

It asks clarifying questions and when it is done, it will present a list of tasks that you can either accept or give it feedback on what you meant.
Reflection
2025 was a challenging year for me for both personal and business reasons.
Business
Back in 2023 I transitioned from a full-time startup CTO to a freelance software development contractor. At the start of the 2024-25 financial year, I created an official entity for my contract work for operational and tax reasons. This also meant that I needed to transition to more project-based work instead of labour-for-hire, for complicated and boring Australian tax reasons that I won’t expand on here.
Professionally I have had the opportunity to work on some really interesting projects in languages that I only dreamed of getting paid for. In particular, getting to work with low-level cryptography and security primitives has been amazing.
Personal
Following a sleep study and years of terrible sleep, I was diagnosed with sleep apnoea (my wife was not surprised). Getting a CPAP machine was literally life-changing. I cried on the first morning after sleeping with the mask on. It felt like I was finally awake after years of auto-pilot from lack of sleep. If you suspect that you might have sleep apnoea, I implore you to talk to your doctor and book a sleep study.
After getting the CPAP machine and settling into this new normal, I was struck by a level of clarity higher than what I had before. This clarity made me want to prioritise other health issues that needed addressing. I started therapy and I think those that know will understand why 2025 has been possibly the most challenging year of my life.
2026
Writing this, I am feeling optimistic about 2026. I am proud that I was able to actually finish a few prototypes and test them with people. Additionally, a few years of crippling debt is about to end. I feel things can only get better from here.
Happy New Year! 🍻
Loading comments...