# Server configuration

`automodpack/server.conf` in the server root directory. The file is created on the first start with defaults.

The file uses a small subset of HOCON: comments (`#`), `key: value` options, inline lists, and braced nesting.

## Editing the file

Apply changes with `/automodpack config reload` or a restart. When the reload changes connection settings, run `/automodpack host restart` to apply them.

## General

| Setting | Default | Description |
|---|---|---|
| `modpack-host` | `true` | Runs AutoModpack's built-in connection handling. When false, clients still receive connection information, which can point at a proxy or an externally handled endpoint. See [hosting](../how-it-works/hosting). |
| `generate-modpack-on-start` | `true` | Publishes a new generation on every start when the content changed. |
| `auto-exclude-server-side-mods` | `true` | Leaves out mods whose metadata declares them server-side only. |
| `require-modpack` | `true` | When true, players without AutoModpack are kicked and modded clients sync the pack before joining. When false, the pack is optional: players without the mod join vanilla, and modded clients are asked whether to sync before they join. |
| `accepted-loaders` | current loader | Extra loaders allowed to join. The set is seeded with this server's loader on first load; this server's loader is always accepted even if you remove it. Unknown names are logged and ignored. Most mods are loader-specific, so change it with care. |
| `advertise-versions-to-sync` | `true` | Advertises the pack's version metadata (modloader, loader version, Minecraft version) to clients. When false, clients treat the pack as files-only and never switch their launcher instance's versions. See [launcher compatibility](../compatibility/launchers#version-sync-and-switching) for which launchers apply it. |
| `self-updater` | `false` | Updates AutoModpack itself from Modrinth when a new version is published. |

## Groups

The `modpack` section holds the pack: `modpack.name` is the display name players see, and the categories follow it, each mapping category name, then group id, then the declaration. The factory config contains one category, `General`, holding a single group `main`, which is required and selected by default. Extra groups become optional parts that players pick in the in-game "Group Selection" screen, listed under their categories. Group content comes from two sources: the directory `automodpack/host-modpack/<id>/` is included in full, and `from-server` pulls in files from the server root. The full picture is in [building the modpack](../pack-content).

Both keys are identities, so treat them as permanent. The group id is the slug used by `requires` and `breaks-with`, by players' saved selections, and as the folder name under `automodpack/host-modpack/<id>/`; renaming it strands saved selections, breaks references from other groups, and requires renaming the folder. Renaming a category strands players' saved category choices. `display-name` is the always-safe rename, so keep anything volatile (versions, dates) out of ids and category names. A group with a blank `display-name` shows its id instead.

### Categories

Category names are player-facing display strings, not ids: they render verbatim as the section headers of the Group Selection screen. A name must be non-blank, carry no leading or trailing whitespace or control characters, and be at most 64 characters long, and names must be unique case-insensitively. An empty category or a group id declared twice is a validation error that fails `/automodpack generate` with the reasons in the log. Categories and their groups appear in the client in declared order, not alphabetically.

### Rule lists

Each group carries three rule lists, relative to the server root.

| Setting | Factory value for `main` | Description |
|---|---|---|
| `modpack.<category>.<id>.from-server` | `mods/*.jar`, `kubejs/**`, `emotes/*` | Extra paths pulled from the server root into the pack. The server root contributes only what a rule matches. |
| `modpack.<category>.<id>.exclude` | `**/.*`, `**/.*/**`, `**/*.{tmp,disabled,bak}`, `kubejs/server_scripts/**` | Files kept out of the pack from every source. This is the only way to exclude something from the group directory, and it also carves exceptions out of `from-server`. These rules do not add files. |
| `modpack.<category>.<id>.editable` | `options.txt`, `config/**` | Pack files that players may edit locally, mods included: editable mod jars live in the player's `mods` folder, replaceable and removable. Listing a path here does not add it to the pack. Local edits survive updates until the server changes the file; see [client updates](../how-it-works/client-updates#editable-files). |

### Globbing wildcards

A leading `/` is allowed and ignored. Rules are otherwise relative to the server root, with one exception: a rule may name its own group's directory under `automodpack/host-modpack/<id>/`, which is useful for excluding part of it.

- `*` matches within a single directory, for example `mods/*.jar`.
- `**` matches recursively, for example `kubejs/**`.
- `!` negates a rule inside its own list. A path matches a list when a positive rule matches it and no `!` rule does.

Where the negation applies depends on the list it sits in. Inside `from-server` it skips a path from the synced set only, and the group directory may still provide it. `exclude` keeps a path from reaching clients entirely, so prefer it for exclusions and reach for a `from-server` negation only when the group-directory copy should still ship.

Read more about glob syntax on the [Globbing Wikipedia article](https://wikipedia.org/wiki/Glob_(programming)#Syntax).

### Group fields

| Setting | Default | Description |
|---|---|---|
| `modpack.<category>.<id>.display-name` | `""` | Name shown to players in the Group Selection screen and the file browsers; blank shows the group id. The map key is the id used by rules and by `requires` and `breaks-with`. |
| `modpack.<category>.<id>.description` | `""` | Short player-facing description of the group. |
| `modpack.<category>.<id>.required` | `false` | Players cannot deselect the group. The factory `main` group sets this. |
| `modpack.<category>.<id>.default-selected` | `false` | Preselected for players who have not chosen yet. Ignored when `required` is true. |
| `modpack.<category>.<id>.requires` | `[]` | Group ids that must also be selected for this group to make sense, for example a shader config pack that needs its shader pack. |
| `modpack.<category>.<id>.breaks-with` | `[]` | Group ids that cannot be selected alongside this one, for example two mods that replace the same files. |
| `modpack.<category>.<id>.compatible-platforms` | `[]` | Restricts the group to matching platforms, for example a group of Windows-only mods. See platforms below. |

### Platforms

A platform is any short lowercase name. Clients detect `windows`, `linux`, and `macos` automatically and preselect the matching entry in the platform dropdown of the Group Selection screen. Any other name a group declares, for example `steamdeck`, is listed there too, so a player on a detected desktop OS can still opt into it. An empty `compatible-platforms` means every platform.

When a client cannot detect a platform at all, groups without `compatible-platforms` behave as usual and platform-restricted groups stay unavailable until the player picks a platform.

## Network and hosting

| Setting | Default | Description |
|---|---|---|
| `connection-mode` | `HOLEPUNCH` | HOLEPUNCH uses the Minecraft port. MAGIC can share it or use `bind-port`. HTTP uses `bind-port`. The modes and their port behavior are described in [hosting](../how-it-works/hosting). |
| `bind-address` | `""` | Local address for a dedicated listener. Empty binds to all interfaces. Used only when the selected mode starts one. |
| `bind-port` | `-1` | Controls built-in listeners according to `connection-mode`; see the [mode matrix](../how-it-works/hosting#connection-modes-and-ports). Values unused by the selected mode are preserved. |
| `advertised-endpoint-host` | `""` | Public hostname or IP sent to clients as the download endpoint. Empty uses the hostname the player connected to. |
| `advertised-endpoint-port` | `-1` | Public TCP port sent to clients. `-1` uses the connected port. |
| `bandwidth-limit` | `0` | Upload speed limit in MiB/s per client. `0` means unlimited. |
| `disable-internal-tls` | `false` | Skips AutoModpack's own TLS termination. Clients always start TLS, so an external terminator must forward decrypted traffic. Expert setting; see [hosting](../how-it-works/hosting#tls). |
| `accept-proxy-protocol` | `false` | Honors HAProxy PROXY protocol headers on dedicated listeners. Enable only behind a trusted proxy: a claimed source address feeds IP bans and audit logs, and a forged one lets a banned player past the ban. |
| `validate-secrets` | `true` | Requires a per-player secret, issued through the Minecraft login, for pack downloads. See [security](../security#download-authorization). A standalone host process has no login to provision secrets, so a fresh standalone config defaults this to `false`. |
| `secret-lifetime` | `336` | How long a download secret stays valid, in hours. 336 hours is 14 days. |
| `export-http-directory` | `""` | Non-empty: after every publish, the URL-contract tree (`head`, `journal`, `objects/`) is exported to this directory, ready to serve with any static HTTPS host. See [HTTP contract export](../how-it-works/hosting#http-contract-export). |
| `export-http-include-all` | `false` | Keeps every object in the HTTP contract export, including files Modrinth or CurseForge still serve to clients directly. Off, the platforms carry those downloads and your mirror holds no fallback for a file a platform later deletes; on, the exported tree stays complete. See [HTTP contract export](../how-it-works/hosting#http-contract-export). |

Setting `modpack-host` to `false` turns off every built-in listener while clients keep receiving connection information. AutoModpack cannot validate external routing from the Minecraft server process, so a reverse proxy setup is your responsibility; the [proxies page](../compatibility/proxies) covers known-good setups.

## Un-modded clients

With `require-modpack` off, players who join without AutoModpack stay in the game, and modded clients are asked whether to sync the pack when they connect.

| Setting | Default | Description |
|---|---|---|
| `nag-un-modded-clients` | `true` | Shows a chat message to players without the mod. |
| `nag-message` | `Install the AutoModpack mod to get this server's modpack!` | The message text. |
| `nag-clickable-message` | `Click here to get the AutoModpack!` | The clickable link text. |
| `nag-clickable-link` | AutoModpack on Modrinth | The URL opened on click. |
