Working With The Last Of The Moon Girls

I spent about three weeks debugging The Last Of The Moon Girls before I actually understood what was going on under the hood. It's a niche indie visual novel engine that wraps around Ren'Py but adds its own layer of asset management and branching logic that trips up anyone who's only ever used Ren'Py straight. Download it from their official repo at lastofthemoongirls.dev. The latest stable build is 0.9.4. Do not grab the alpha channel builds unless you want to spend your evening filing bug reports about missing character portraits that won't reappear until you restart the editor three times. The installer runs about 180 MB when unpacked. I'd budget roughly 400 MB total including the sample project files. The setup wizard will ask where you want to install everything. I recommended putting it on an SSD because loading assets from a mechanical drive during branch testing will make you question your life choices. The default path works fine, but if you put it on a network drive at all, save yourself the headache and don't.

Understanding the project structure

Once you open the editor, you're looking at a slightly modified Ren'Py project layout. The core difference is that the moon module handles its own state tracking, which means your traditional Ren'Py label system gets intercepted by the moon pipeline before execution. I learned this the hard way when I had a label that worked perfectly in pure Ren'Py but silently failed inside the moon wrapper because the module was rewriting the jump targets behind the scenes. The project tree has three main folders. scripts contains your dialogue code. assets is where images and audio go. configs holds the moon-specific settings file, which is where most people get stuck. The configs/moon_settings.json file uses a format that looks like JSON but isn't quite JSON. There are trailing commas that the editor accepts but a standard validator will reject. I wasted about two hours chasing a parse error before I realized the editor itself had written the file with a custom parser that was more forgiving than anything in the Python ecosystem.

Creating your first branch

The branching system in The Last Of The Moon Girls doesn't use Ren'Py's choice syntax directly. Instead, it uses a tag-based approach where you declare a branch point with a moon_branch directive and then define outcomes with moon_outcome tags. It's more verbose than Ren'Py's menu blocks, but it gives you better tracking across long narratives. Here's the basic pattern I ended up using after trial and error: moon_branch point: "chapter_one_choice"

Get the Full Details

The Last of the Moon Girls by Barbara Davis | Goodreads
The Last of the Moon Girls by Barbara Davis | Goodreads

moon_outcome path: "gentle_route" weight: 2 moon_outcome path: "harsh_route" weight: 1 The weight parameter is important. Beginners tend to ignore it and set everything to equal weight, but the engine uses weighted random selection when the player doesn't make an explicit choice. If you're building a story where certain paths should feel rarer, adjust those numbers accordingly.

Common pitfall: the asset loading timeout

During my second week with this thing, I hit a recurring issue where large PNG files over about 4 MB would cause the editor to hang for 30 to 45 seconds during branch compilation. The editor doesn't show any loading indicator either, so my initial reaction was that it had crashed. I restarted it twice before noticing the CPU spike on those particular files. The workaround is to run your character art through a batch resizing tool before importing. I use ImageMagick with a command like convert input.png -resize 1400x output.png before dropping it into the assets folder. This cuts typical portrait files down to around 1.5 MB without visible quality loss on screen. It reduced my compile times from something unusable to about 8 seconds per branch test.

Debugging runtime errors

When the game runs and something breaks, the error log goes to moon_logs/runtime_error.txt in your project root. The log format is straightforward. Each entry starts with a timestamp, the file path, and then the Python traceback. The problem is that traceback gets mangled at the layer where moon intercepts the execution, so the line numbers don't map back to your original scripts cleanly. My approach was to add strategic print statements wrapped in moon-specific debug flags. The engine respects a MOON_DEBUG=1 environment variable, and when it's set, the branch compiler outputs a JSON trace of every decision point. It's not elegant but it's faster than commenting in and out of labels to find where things go wrong.

The Last of the Moon Girls Audiobook | Libro.fm
The Last of the Moon Girls Audiobook | Libro.fm

Exporting your build

The export function in The Last Of The Moon Girls only fully supports Windows and macOS at the moment. Linux builds exist but they're marked as experimental and the developers themselves say they don't test them regularly. I tried a Linux export for a friend and the audio didn't load at all. You can work around it by placing a Vorbis-compatible audio file separately, but that's patching a problem that should have been caught before the build started. If you're shipping on multiple platforms, consider building on Windows with cross-compilation enabled rather than running native Linux builds. The Windows build process is more stable and the macOS conversion from that base is generally reliable. Just leave Linux out of your release cycle until the next stable update. That's basically how I've been working with it. The engine does what it needs to do once you get past the initial learning curve. The biggest issue is documentation that's two versions behind the actual code, so don't expect the manual to match everything you'll encounter.