Local mod editor for Age of Mythology: Retold
Aether Forge is an API-first desktop tool for reading, editing, and shipping additive gameplay mods. Change units, buildings, and related data through a schema-driven UI — without overwriting retail files and without memory or multiplayer manipulation.
The app produces valid Retold local mods (proto_mods.xml with mergeMode="replace") and can install them directly into your local mods folder.
- Entity Browser — searchable, grouped overview of units, buildings, and other entities
- Schema-driven editor — tabs for Stats, Armor (%), Costs, Attack, Work, and more; only existing values are editable
- Lossless XML — unknown fields are preserved; diffs stay minimal and additive
- Mod generation — output as
ModName/game/data/gameplay/proto_mods.xml - Generate + Install — writes under
%USERPROFILE%\Games\Age of Mythology Retold\<SteamID64>\mods\local - Auto-discovery — detects the local mods path on startup (Steam-account dependent)
- Embedded gameplay pack — built from a local extract or synthetic fixtures; retail XML is not committed
- API-first — the Avalonia GUI talks only to the local REST API (loopback + ephemeral token)
- Standalone backend — optional API-only binary (
Backend+API.exe) for external clients / automation
Configure local mods and optional import folder. Auto-discovery runs on startup.
Search and browse entities by group. Double-click or press Enter to open the editor.
Schema-driven tabs for stats, armor, costs, attack, and work.
Editing a villager with live fields from the gameplay pack.
Setup → Entity Browser → Unit/Building Editor → Generation → Local Mod
- Optionally import your own gameplay folder (otherwise the embedded pack is used)
- Search for an entity and open it with double-click / Enter
- Adjust values (only changed leaves end up in the mod)
- Choose a mod name → Generate or Generate + Install
| OS | Windows 10/11 (x64) |
| Runtime | Self-contained release: no separate .NET install required |
| Development | .NET 10 SDK |
| Game | Age of Mythology: Retold (for local mod install) |
From the repo root:
.\build\publish-release.ps1Output in release\:
| File | Purpose |
|---|---|
GUI.exe |
Desktop app (recommended) — starts the embedded local API |
Backend+API.exe |
REST API / backend only |
Details: build/README.md
Note:
release/and the embedded pack are gitignored. The pack is produced at build time fromaomr_extract/original(if present) orfixtures/synthetic.
# Build
dotnet build AomrModEditor.sln
# Tests
dotnet test AomrModEditor.sln
# Run GUI
dotnet run --project src/AomrModEditor.App
# Run API only
dotnet run --project src/AomrModEditor.ApiMore notes: docs/SETUP.md
When building the app:
- If
aomr_extract/original/gameplay/proto.xmlexists → pack from that extract - Otherwise → synthetic fixtures under
fixtures/synthetic
The pack (EmbeddedGameplayPack.json.gz) is not versioned — see .gitignore.
┌─────────────────┐ REST (loopback) ┌──────────────────┐
│ Avalonia GUI │ ◄─────────────────────► │ ASP.NET Core │
│ (App) │ typed API client │ API │
└─────────────────┘ └────────┬─────────┘
│
┌────────────────────────────────┼────────────────┐
▼ ▼ ▼
Application GameData / XML ModGeneration
(Use Cases) Persistence (additive mods)
| Project | Role |
|---|---|
AomrModEditor.App |
Avalonia desktop UI |
AomrModEditor.Api |
REST API (also embedded) |
AomrModEditor.Api.Client |
Typed HTTP client |
AomrModEditor.Api.Contracts |
DTOs / contracts |
AomrModEditor.Application |
Use cases, schema, classification |
AomrModEditor.Domain |
Domain model |
AomrModEditor.GameData |
Installation discovery, import |
AomrModEditor.ModGeneration |
Diff → proto_mods.xml, installer |
AomrModEditor.Persistence |
SQLite / local state |
AomrModEditor.Cli |
Command line |
Stack: C# / .NET 10, ASP.NET Core, Avalonia 11, SQLite, System.Xml.Linq, xUnit.
Design notes: design/aether_forge/DESIGN.md
Example layout:
MyCoolMod/
game/
data/
gameplay/
proto_mods.xml
Changed XML leaves get mergeMode="replace", matching common Retold local mods. Only diffs are written — no full replace of base data.
- No manipulation of running processes, memory, or anti-cheat
- No interference with multiplayer traffic or executables
- No bundling / committing of proprietary retail gameplay XML
- Not a “cheat injector” — editor + additive mod packages only
Do not commit:
aomr_extract/original/— extracted retail gameplay datasrc/.../EmbeddedGameplayPack.json.gz— derived from retail / local extractrelease/— local publish outputbin/,obj/,.vs/,__pycache__/
Research markdown under aomr_extract/*.md and synthetic fixtures are intended for the repo; original XML extracts stay local.
This repository does not include official Age of Mythology content from Microsoft / World's Edge / Xbox Game Studios.
You need a legal copy of AoM: Retold to:
- extract gameplay data for a full pack, and
- install mods into the local mods folder and test in-game.
“Age of Mythology” and related trademarks belong to their respective owners. This project is an unofficial fan / community tool.
- Fork / branch
- Keep
dotnet test AomrModEditor.slngreen - Do not check in retail XMLs or generated pack blobs
- Open a PR with a short description of the change
CI: .github/workflows/ci.yml (dotnet test on windows-latest).
| Path | Contents |
|---|---|
docs/SETUP.md |
Setup & safe workflow |
docs/images/ |
Screenshots |
build/README.md |
Release publish |
aomr_extract/ |
Research / mod guide (without original/) |
design/ |
UI / product design |
fixtures/synthetic/ |
Synthetic test data |
Built for the AoM: Retold modding community — API-first, local-first, additive mods first.




