> For the complete documentation index, see [llms.txt](https://axiomemu.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://axiomemu.gitbook.io/docs/tools/configencoder.md).

# ConfigEncoder

ConfigEncoder reads three plain-text XML inputs and writes encrypted binary blobs that the client and launcher load at startup. It is the only supported way to update connection details, client-side tunables, and launcher branding after a release has shipped - the client will not load an edited `.xml`.

Output files are AES-256-GCM encrypted. The per-file key is derived from the embedded master key (the same master key shared by every AXIOM-EMU binary) and the canonical lowercase filename of the blob, so the client can decrypt any bundle produced by a matching build.

## Tool Location

```
Tools/ConfigEncoder/
    ConfigEncoder.exe
    EncoderConfig.xml
    ServerConfig.xml
    ClientConfig.xml
```

## Inputs

All three files live next to `ConfigEncoder.exe` and must be present for a run to succeed.

| File                | Purpose                                                                                                         |
| ------------------- | --------------------------------------------------------------------------------------------------------------- |
| `EncoderConfig.xml` | Tool settings: output folder, client install root, license key                                                  |
| `ServerConfig.xml`  | ConnectServer IP/port, client `Serial` and `Version`                                                            |
| `ClientConfig.xml`  | Client-side tunables - graphics, interpolation, animation timing, auto-updater, launcher branding, economy caps |

## Outputs

Written to the `Output Path` configured in `EncoderConfig.xml` (typically the client's `Data\Local\` folder):

| File                 | Consumer                | Contents                                              |
| -------------------- | ----------------------- | ----------------------------------------------------- |
| `ServerInfo.axiom`   | Client                  | ConnectServer IP/port, client serial, client version  |
| `ClientConfig.axiom` | Client                  | All tunables from `ClientConfig.xml`                  |
| `UpdateConfig.ini`   | Launcher / auto-updater | Patch server URL and enablement (only if configured)  |
| `LauncherConfig.ini` | Launcher                | Branding and launcher UI options (only if configured) |

The C++ servers (GameServer, DataServer, ConnectServer, JoinServer) do **not** read these `.axiom` blobs - they read their own `.dat` / `.ini` files.

## EncoderConfig.xml

```xml
<EncoderConfig>
    <Output Path="C:\AxiomClient\Data\Local" />
    <DLLIntegrity Path="C:\AxiomClient" />
    <License Key="..." />
</EncoderConfig>
```

| Attribute           | Meaning                                                                                                                                                                                                                                                                                                   |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Output Path`       | Folder where `ServerInfo.axiom` / `ClientConfig.axiom` (and the optional `.ini`s) are written. Point this at the client's `Data\Local\` directory.                                                                                                                                                        |
| `DLLIntegrity Path` | Root of the client install. ConfigEncoder computes SHA-256 hashes of the DLLs under this path and embeds them in `ClientConfig.axiom` for the client's integrity check at startup.                                                                                                                        |
| `License Key`       | Your portal license key. Recorded here for operator reference (the first 8 chars are printed on each run); the `.axiom` encryption itself uses the embedded master key, not this field. Keep it in sync with the four servers so operators don't get confused about which deployment a bundle belongs to. |

## ServerConfig.xml

```xml
<ServerConfig>
    <Connection IP="1.2.3.4" Port="44405" />
    <Client Serial="TbYehR2hFUPBKgZj" Version="1.04.05" />
</ServerConfig>
```

| Attribute         | Meaning                                                                                         |
| ----------------- | ----------------------------------------------------------------------------------------------- |
| `Connection IP`   | Public IP of your ConnectServer - the address the client connects to first.                     |
| `Connection Port` | ConnectServer TCP port. Matches `ConnectServerPortTCP` in `ConnectServer.ini`.                  |
| `Client Serial`   | Arbitrary token. Must match `ServerSerial` in every GameServer's `GameServerInfo - Common.dat`. |
| `Client Version`  | Arbitrary version string. Must match `ServerVersion` in every GameServer's `Common.dat`.        |

## ClientConfig.xml

Template for the client's runtime configuration. Each top-level block is documented inline in the shipped file. Sections actually read by ConfigEncoder:

| Block                     | Purpose                                                                                                                       |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `<Graphics>`              | `MaxFPS` cap                                                                                                                  |
| `<Animation>`             | FPS-adaptive animation timing (`GlobalDivisor`, `PlayerMultiplier`, `MountMultiplier`, `WingMultiplier`, `EffectBlurDivisor`) |
| `<Interpolation>`         | Visual smoothing between 25Hz logic ticks (master + per-category toggles for Objects, Characters, Effects, Camera)            |
| `<RenderingOptimization>` | Chrome LOD distances and frustum culling cap                                                                                  |
| `<Frustum2D>`             | Terrain frustum expansion (widescreen black-corner fix)                                                                       |
| `<GroundItems>`           | Ground item rendering caps and name distance                                                                                  |
| `<PostProcessing>`        | FXAA, bloom, motion blur toggles + tuning                                                                                     |
| `<Economy>`               | Client-side zen caps (trade, warehouse, owned, personal shop)                                                                 |
| `<AutoUpdater>`           | Patch server host/port/HTTPS toggle                                                                                           |
| `<TooltipColors>`         | Item tooltip option colors                                                                                                    |
| `<Launcher>`              | Launcher branding (title, splash, URLs, color palette)                                                                        |
| `<BottomUI>`              | Bottom hotbar scale                                                                                                           |
| `<DLLIntegrity>`          | Optional `<DLL Name="..." />` rows added on top of the built-in DLL list whose hashes get baked into `ClientConfig.axiom`     |

Every value in this file is consumed by the client only. Edit it, re-run ConfigEncoder, and the new `ClientConfig.axiom` replaces the previous one in `Output Path`.

The `<Launcher>` block also writes a plaintext `LauncherConfig.ini` next to the `.axiom` blobs; the `<AutoUpdater>` block writes a plaintext `UpdateConfig.ini` when `Enabled="1"`. Both are read by the Launcher (not the game client).

## Usage

1. Edit the three XML files in `Tools\ConfigEncoder\`.
2. Run `ConfigEncoder.exe` from its own folder. It takes no command-line arguments.
3. The tool writes the output blobs directly into `Output Path` - no manual copy.

Re-run ConfigEncoder any time you change `ServerConfig.xml` or `ClientConfig.xml`. The client reads the blobs on startup; editing the XML alone has no effect.

{% hint style="info" %}
For end-to-end setup - where ConfigEncoder fits between editing your XML and launching the servers - see [Launching Your Server](/docs/guides/launch-server.md).
{% endhint %}

{% hint style="info" %}
Keep `License Key` in `EncoderConfig.xml` in sync with every server's `LicenseKey`. The `.axiom` encryption itself does not depend on this field, but tracking it here avoids confusion about which deployment a bundle was built for.
{% endhint %}
