Thoughts

Modernising Project GoldScript for 2026

Project GoldScript has been an over-decade-long labour of love. Scrolling back through this blog brings back a lot of fond memories, like elevation and pathfinding from 2014, real-time combat on Three r86 from 2017, and an AI system inspired by FFXII's gambits from 2020.

My biggest challenge was always time. Building an entire game engine from scratch is the kind of thing people deride as a challenging and, let's be honest, slightly foolish endeavour.

Life commitments in 2020 drastically reduced my free time and all my passion projects had to take a back seat to paid work. By 2026 that had started to change. Agentic coding tools had matured enough that chipping away at a project this size in limited time finally felt feasible, and the vision I had been carrying in my head for years was worth chasing again. It felt like time to embark on this epic journey once more.

So I got a Claude subscription, dumped Opus 4.6 inside my decade-old codebase and started a massive modernisation campaign.

setState(prevState)

While the engineering fundamentals of the engine and game code were strong, the scaffolding around them was a different story. It had rotted into a graveyard of unsupported libraries and known vulnerabilities.

The game and the engine lived in separate repos, each built on the deprecated create-react-app. The two were decoupled, but building them together was a chore. There was version drift between the repos, and endless npm link dances just to test a change that touched both. The build was old, I could not even run the thing on Apple's ARM-based processors and the engine had very poor test coverage.

I did not just want to get it running though. I wanted to finally bring to life so much of what I had dreamt about before.

The goals

I had a few clear goals in my head:

  • Modular Monorepo – The engine was always meant to be its own reusable thing but it was off in its own repo. This made integration between the engine and its first game brittle and hard to manage. What I lacked was a single workspace where the engine and game could evolve together, with the boundaries between them enforced by tooling instead of hand-wired across two repos.
  • Modern tooling – A proper monorepo built on pnpm, with Vite for builds and Vitest for tests. This replaces the aging create-react-app setup I had carried for years. The payoff is fast feedback and single-version dependencies, with no more toolchain archaeology.
  • Covered by tests – A modernisation this aggressive is only safe if you can prove nothing broke along the way. I was tearing the engine into many packages, swapping the build tool, bumping rendering-heavy dependencies, and upgrading three-nebula (which I also maintain and needed to upgrade in tandem) across a major version. A real safety net was not optional. It was the single thing that made the migration possible at all. The centrepiece is a visual-regression suite that drives the engine and diffs every rendered frame against a committed baseline, so a shifted pixel gets caught the moment it happens. This is possible because of a deterministic game clock. The whole simulation advances off one clock, so pausing it and stepping it by fixed amounts (paired with a seeded RNG) makes even particle effects reproducible frame for frame. Determinism turns "looks fine to me" into a guarantee you can actually check.
  • Ship a real game to many platforms – Project GoldScript's aim is to ship a game to Steam, mobile and hopefully consoles. In order to take advantage of the advances in frameworks designed to help distribute and build for multiple platforms, the framework it currently runs on (NWJS) has been completely decoupled from the engine itself. Tauri is probably a better choice nowadays, and a migration to it is on the cards in the near future.
  • Clean, operable interfaces – This one is new for 2026. I have been building the whole modernisation alongside an AI agent. A codebase that an agent can navigate and operate turns out to be a codebase with clean interfaces and real tests. Building for AI-operability turned out to be the same thing as building for maintainability, which was a pleasant surprise.
  • Better tools – AI has made shipping internal engine tools much faster, letting me prototype and ship things in a few short sessions that would have taken me weeks of full-time effort before. This means I can enrich my engine's toolset at a fast pace.

What actually got done

So far, the modernisation has come together in a few big pushes, each getting its own post over the coming weeks:

  • Becoming a Time Mage. Before I dared touch anything, I made the engine's clock fully controllable, a single time source the whole simulation runs off that can be paused and stepped by fixed amounts. On top of it I built a visual-regression suite that drives the engine and diffs every rendered frame against a committed baseline. It is the reason every other push on this list was safe to attempt.
  • Wiring it all together. Two separate repos on aging deprecated tools became one pnpm and Vite monorepo. The game and engine now live in a single workspace, the boundaries between them enforced by tooling instead of hand-wired, and the engine is layered into eleven focused packages with a guardrail against circular dependencies.
  • Real particle effects. I built a particle abstraction into the engine on top of three-nebula and used it for two things. The first was combat VFX like a proper combust and fire effect. The second was a map-level atmosphere system for weather, with snow drifting over the terrain and rain streaking across the field.
  • The Effect Designer. This is the feature I had dreamed of ever since creating three-nebula.org and its editor GUI. Instead of authoring effects in a separate tool and exporting JSON, I built an adapter on top of websockets so the Nebula editor could wire directly into the game's toolset. Because of this, you can design a VFX in place, live, on the actual map.

Where it's going

I'm trying to build an engine for a very specific type of game which I have loved throughout my life. From my very first playthrough of the Krynn saga through to Final Fantasy Tactics and Baldur's Gate 3, tactical RPGs have been a huge source of fun for me.

I don't know where this latest push will end, but I'm happy to be back on the horse at least!