Profile
Back to NewsBack
GitHub Trending 8 min
Reader Mode
nanolathe-gg/nanolathe: Total Annihilation engine reimplementation in Go.

nanolathe-gg/nanolathe: Total Annihilation engine reimplementation in Go.

4 hours ago

Nanolathe — Open-source 2.5D RTS engine</a>

Nanolathe

Nanolathe is an independent, open-source 2.5D real-time strategy engine in Go. Its current focus is a clean-room reimplementation of Total Annihilation. You can play campaigns, skirmish, Survival and online games on Windows, Mac and Linux using your own installed game files, or try three campaign missions in your browser without installing anything.

Single-player and multiplayer are broadly complete. Nanolathe is still in beta, so bugs and compatibility gaps remain. The engine, research and file-format documentation are public so you can investigate how TA works, make mods or experiment with engine changes yourself.

Play the demo · Install the beta · Renderer comparisons · Documentation · Contributing

Watch the Nanolathe announcement reel: 43 seconds of engine footage</a>

*Engine footage captured offline with --film from films/announce.json.*

Play

The browser demo plays three missions from the original TA demo. You don't need game files to try it. You can also select your own installed TA folder in the browser to use the full game menus and play online; those files stay on your computer. The browser build is experimental. See browser controls and saves for requirements and limitations.

For the native beta, follow Get started. The installer downloads its own Go toolchain, builds the latest code from main and creates a shortcut. You don't need to install Go separately. The shortcut remembers your game folder and offers an update when newer code is available; you can keep playing your installed version offline.

You'll need an installed Total Annihilation folder containing the original HPI archives. Keep the base game and installed expansion data together. The reference installation includes Core Contingency, Battle Tactics and the 3.1 patch; other combinations are still being tested. On Mac or Linux, you can bring over an installed Windows game folder. Nanolathe itself runs natively.

The installer guide covers platform requirements, game-folder selection, unsigned-app warnings, updates, saves and removal.

To play online, choose MULTI, create a room and share its six-character code. See the online guide for joining friends and setting up a game.

Gameplay and graphics

Gameplay rules and rendering are separate choices. You can use the modern renderer with Strict 3.1 rules, for example.

| Gameplay | What it selects | | --- | --- | | Modern (default) | Community behavior plus Nanolathe's documented changes, including movement and construction improvements. | | Strict 3.1 | The retail 3.1 behavior the engine aims to reproduce, including documented faults. | | Community 3.9 | Researched community-patch behavior, configured by the selected content and gameplay feature table. |

The gameplay rules design explains these boundaries. Choose the rules on Nanolathe → Game from the welcome screen. Modern AI, Survival, mutators and unit restrictions are available in every gameplay mode. Some mods require Community 3.9 or Modern.

The Modern GPU renderer is the default. It adds camera zoom, tactical icons, lighting, water effects and locally synthesized terrain and feature sprites. On the home screen, open Nanolathe → Graphics and choose Enhanced to use it, or Classic for the CPU-rendered look and its 30 FPS presentation cadence. Enhanced supports 30, 60, 120 and 144 FPS settings, or Display to follow your monitor's refresh rate. Your choices are saved. During a match, F10 switches renderers. The renderer comparisons show the effects with matched scenes; the renderer design describes its experimental status and remaining gaps.

Alt+Enter toggles fullscreen and saves the preference. On Mac, use the green window control to exit fullscreen if you entered it that way. For music, keep the GOG installation's music folder in the game root; its MP3 soundtrack plays directly. Options → Music controls playback and volume. See the keyboard and camera reference for more controls.

Mods

Open Nanolathe at the top of the welcome screen, then the Content card on the Game page. Choose Get more mods, download a package and select it in that card. Keep your original TA installation as the base content.

Prepared packages include Nanolathe's engine configuration as well as the mod's content. For mods whose upstream installers change TotalA.exe or DLLs, use Get more mods: copying their upstream files over a retail installation doesn't supply that configuration, and automatic recognition isn't implemented yet. Support notes cover ProTA 4.8, Escalation Gold 10.2.0 and TA Zero Alpha 5, including their known gaps.

Downloaded mods live in $XDG_DATA_HOME/nanolathe/mods (default ~/.local/share/nanolathe/mods). Synthesized map tiles and feature sprites are cached in $XDG_CACHE_HOME/nanolathe/upscale/1 (default ~/.cache/nanolathe/upscale/1). See the mods and mutators design for package configuration and battle options.

Build from source

Install Go 1.27.1 or newer. Ebitengine 2.10 builds the desktop engine without a separate C or C++ compiler. Mac requires macOS 13 or newer; Linux needs a graphical desktop and the graphics/audio runtime libraries described in the installer guide.

git clone https://github.com/nanolathe-gg/nanolathe.git
cd nanolathe
go build -o nanolathe ./cmd/nanolathe
./nanolathe

On Windows, tools\build.cmd builds every command into build\; start the game with build\nanolathe.exe.

For day-to-day development, ./tools/dev (Mac/Linux) or tools\dev.cmd (Windows) rebuilds this checkout and immediately runs it. All arguments go to the game, for example ./tools/dev --root "/path/to/Total Annihilation" or tools\dev.cmd --root "C:\Games\Total Annihilation". You can invoke the script by its path from any directory; the game runs with the repository as its working directory, so relative argument paths are relative to the repository.

The launchers require Go on PATH, reuse Go's build cache, and write only their executable under the ignored build/dev/ directory. A failed build never starts an older executable; otherwise they return the game's exit status. They do not install, update, or change asset discovery or settings. Use these launchers to play your current source; use the installer shortcut to play an installed version.

With no --root, the engine looks in registered and common installation locations, including GOG, Steam libraries and Wine installations, then nearby game folders and finally ~/TotalAnnihilation. It mounts the first installation found. Detected installations aren't combined. A directly launched installer-built executable uses its remembered game folder instead. NANOLATHE_TA_ROOT selects one root in place of discovery. To choose explicitly:

./nanolathe --root "/path/to/Total Annihilation"

Manual launches save under the first game root unless you supply --save-dir "/path/to/saves". The installed shortcut supplies its own save directory, separate from the game data.

For content-only overrides, repeat --root in load order. Later roots override earlier ones, even across different archive types:

./nanolathe --root "$HOME/TotalAnnihilation" --root "$HOME/TA-Mods/MyMod"

Explicit roots replace discovery and NANOLATHE_TA_ROOT. A mod root only needs its overrides; definitions still need to follow TA's archive-loading rules. Full mods may also need a Nanolathe configuration as described above. --remaster replaces the entire root list. See the startup root policy for details.

Skirmish defaults to 1000 units per player under Strict 3.1 and the gameplay feature table's limit otherwise (1500 for unmodified Modern and Community 3.9). --unit-limit 2000 overrides it for one run; accepted values are 20–3276. A saved top-level unitLimit also overrides that default, with --unit-limit taking precedence. Older builds sometimes saved that value automatically. You can choose a limit or return to Auto on Nanolathe → Game. Campaign missions keep their authored limits. The content design covers precedence.

Manual builds store settings in ~/.config/nanolathe/settings.json, or under $XDG_CONFIG_HOME when set. NANOLATHE_SETTINGS overrides the full path; the installed shortcut uses its own settings file beside its saves.

Run ./nanolathe --help for map, gameplay, rendering and diagnostic options. The separate cmd/nanolathe-headless command runs displayless simulations. See web/README.md to build and preview the browser host.

Contributing

Nanolathe is a community project. Bug reports, research corrections and code contributions are welcome on GitHub. For a bug, include the build, map or mission, selected mod and gameplay mode, what you did and what happened. Installer builds keep diagnostic logs in their installation's logs directory; manual launches write them to standard error.

Read AGENTS.md before changing the tree. It's the contribution guide for people and coding agents: work in an isolated worktree, preserve concurrent work, and follow the verification and landing rules.

design documents and verification gates. Start there, then read the design for the area you're changing.
  • Invariants records the rules every change must preserve.
Spec conflicts records corrections from the reference installation. format references describe how to read the files. Extension research covers sourced non-retail behavior. The design documents describe Nanolathe's implementation and its approved departures from retail.

Research distinguishes established behavior, supported inferences and unknowns. Unanswered questions stay explicit as TODO(T23), TODO(T25) or TODO(question) at the code site and in the owning research document. Verify inferences before depending on them. Committed descriptions must use independently worded algorithms; executable addresses, decompiler output and raw analysis stay outside the repository. AGENTS.md has the clean-room rules.

Use the repository scripts for checks:

./tools/check
NANOLATHE_RETAIL_ASSETS="$HOME/TotalAnnihilation" ./tools/check-retail

tools/check checks formatting, builds, vets and runs the short synthetic test tier with retail assets disabled. tools/check-retail requires a retail install and adds static analysis, retail-tagged tests, cross-platform fingerprint checks and GPU device fixtures where available. Use package arguments during iteration; run the whole-tree gates before and after landing as AGENTS.md requires. Report whether asset-backed checks actually ran.

License and history

Nanolathe's original code is MIT licensed. Total Annihilation and its assets belong to their respective owners; the engine's license doesn't grant rights to those assets or retail-derived artwork. Nanolathe is independent and isn't affiliated with or endorsed by the game's owners.

The early history contains curated integration snapshots of private development; those snapshots aren't individually verified releases. Retail-derived remaster exports and raw-analysis material were excluded from that publication. The publication review records the history boundary and remaining provenance questions.

Chat with me