# Settings

Everything panel-wide that isn't its own admin page lives under `/admin/settings`, split into eleven category tabs. Saving any category requires the `settings.update` permission.

::: info
The **Application** tab has an **Advanced mode** toggle in the top right. It reveals the fields marked *advanced* below, and the preference is saved to your account, so it follows you to other devices.
:::

## Application

![](/docs/panel/features/admin/images/settings/application.webp)

| Field | Description |
| --- | --- |
| **Name** | The name of this panel installation |
| **Language** | The panel's default language |
| **Icon** | URL of the panel icon; suggests files uploaded under [Assets](/docs/panel/features/admin/assets) |
| **Icon (Light Mode)** | Optional separate icon for light mode (*advanced*) |
| **Banner** | Optional banner image URL, also suggested from Assets |
| **Banner (Light Mode)** | Optional separate banner for light mode (*advanced*) |
| **URL** | The public URL of the panel |
| **Session Cookie** | Name of the session cookie (*advanced*) |
| **Session Duration (seconds)** | How long login sessions last (*advanced*) |
| **Two-Factor Authentication Requirement** | Who must enable 2FA: **Admins**, **All Users**, or **None**. Affected users without 2FA are blocked from everything except setting it up and logging out |
| **Email Two-Factor** | Let users receive a one-time login code by email as a second factor. Requires a mail transport |
| **Accepted Two-Factor Methods** | Which enrolled factors satisfy the requirement above: **TOTP**, **Security Key**, and/or **Email**. Defaults to TOTP and security keys |
| **Require Email Verification** | New accounts must open a verification link before they can use the panel, including SFTP and SSH. Requires a mail transport |
| **Enable Telemetry** | Allow Calagopus to collect limited and anonymous usage data to help improve the application |
| **Enable Registration** | Let anyone create an account on this panel |

**Preview Telemetry** (requires `stats.read`) shows exactly what data would be sent, so you can judge for yourself. Disabling telemetry asks for confirmation.

Enabling registration also asks for confirmation and points out that doing it without a [captcha](#captcha) configured may be a mistake.

Two combinations are rejected when you save, with an error rather than a silent fix:

- *"at least one two-factor method must be accepted while two-factor is required"* - you cleared **Accepted Two-Factor Methods** while the requirement is anything other than None.
- *"email two-factor and email verification require a mail transport to be configured"* - one of the two email options is on while [Mail](#mail) is set to no transport.

## Metadata

![](/docs/panel/features/admin/images/settings/metadata.webp)

Controls the `<head>` of the panel's own page: what search engines record and what a link to your panel looks like when it is pasted into Discord, Slack, or a social app. These values are rendered into the HTML the panel serves, so they apply before anyone logs in.

| Field | Description |
| --- | --- |
| **Description** | Shown under the title in search results and link previews. Left empty it falls back to "Manage your game servers and services with *name*." |
| **Preview Image** | The image shown in link previews (`og:image`). Suggests files uploaded under [Assets](/docs/panel/features/admin/assets). Must be a PNG or JPEG, **not** an SVG, since most preview scrapers refuse SVG. A bare path is resolved against the panel **URL**; a full `http(s)://` address is used as is. Empty falls back to the panel's `android-chrome-512x512.png` |
| **Twitter Card Type** | **Summary** for a small square thumbnail, or **Summary with Large Image** for a full-width banner |
| **Theme Color** | Hex color that tints the browser UI on mobile and the accent bar on some link previews. Defaults to `#6c5ce7` |
| **Allow Search Engine Indexing** | On sends `robots: index, follow`; off sends `noindex, nofollow` |

**Autofill** fills **Description** and **Preview Image** with the defaults described above, which is the quickest way back to a working starting point.

::: info
`noindex` is a request, not an access control. It asks well-behaved crawlers to stay out; it does not hide the panel. Keep a private panel behind real authentication rather than relying on this switch.
:::

## Storage

Where the panel stores uploaded files such as profile pictures and admin assets. Pick a **Driver**:

- **Filesystem**: a single **Path** on the panel's disk.
- **S3**: **Access Key**, **Secret Key**, **Bucket**, **Region**, **Public URL**, **Endpoint**, and a **Using path-style URLs** toggle. The `assets/`, `avatars/`, and `publicdata/` subdirectories must be publicly accessible over the **Public URL**; that's where admin assets, user avatars, and extension public data are served from.

::: warning
Changing the driver makes the panel look for existing assets in the new location. Move them over manually, or they'll turn up missing.
:::

## Mail

How the panel sends email. Pick a **Provider**:

| Provider | Fields |
| --- | --- |
| **None** | Outgoing email disabled |
| **SMTP** | **Host**, **Port**, **TLS Mode** (**None**, **STARTTLS**, or **Implicit TLS**), **Skip Certificate Validation**, **HELO/EHLO Domain**, **Username**, **Password**, **From Address**, **From Name** |
| **Sendmail Command** | **Command**, **From Address**, **From Name** |
| **Filesystem** | **Path**, **From Address**, **From Name**; writes messages to files under the path instead of sending them |

**HELO/EHLO Domain** is the name the panel announces itself with when it opens the SMTP connection. Left empty it sends `[127.0.0.1]`, which providers like Google Workspace reject; set it to the panel's own domain in that case.

**Send Test Email** opens a small modal, prefilled with your own address, to verify the configuration actually delivers.

## Mail Templates

The emails the panel sends, editable per template. The tab requires `email-templates.read`; saving requires `email-templates.update`.

![](/docs/panel/features/admin/images/settings/mail-templates.webp)

Pick a template from the **Templates** sidebar to edit its **Subject**, an **Enabled** toggle, and the HTML content in the editor. The built-in templates cover account creation, password resets, email verification, login codes for email two-factor, the connection test, being added to or removed from a server, and server installs and restores.

The **Available Variables** box lists everything you can reference in that template. Templates use the [MiniJinja](https://github.com/mitsuhiko/minijinja) syntax: variables as <code v-pre>{{ variable }}</code>, control structures like `{% if %}` and `{% for %}`.

**Reset to default** discards your custom template and restores the built-in one. This cannot be undone.

### Variables and Languages

Every user receives mail in the language set on their account. Addresses that do not belong to a user get the panel's default language. A template has one layout for all of them: the wording lives in **Variables**, small text fragments the template references as <code v-pre>{{ vars.name }}</code>, and each variable can carry a value per language.

The **Variables** section below the subject lists the fragments a template uses. Built-in templates ship with **System** variables such as `greeting`, `intro`, `button` and `footer`, with translations maintained alongside the panel's own. Pick a language from the selector on a variable to see and edit its value for that language. An empty field uses the default shown inside it, so you only have to fill in what you want to change.

When a user's language has no value of its own, the panel uses your English value if you set one, then the built-in translation for that language, then the built-in English text. So once you customise a variable in English, every language without its own value gets that English wording. Fill in the other languages you serve.

A variable's value is itself a MiniJinja snippet and can use the same variables as the template, for example <code v-pre>Hello <strong>{{ user.username }}</strong>,</code>. The rendered fragment is inserted into the template as is, so HTML inside a variable works, while values like <code v-pre>{{ user.username }}</code> inside it are escaped. The subject is rendered as plain text, so keep HTML out of variables you use there.

**Add Variable** creates a **Custom** variable for the current template, which you can reference from the template's content or subject. Use the reset icon on a system variable to drop your values for every language, and the delete icon to remove a custom one.

**Global Variables** in the sidebar holds variables that every template can reference, handy for a shared signature or support address. A template variable with the same name takes precedence over a global one.

The `language` variable holds the language code a mail is rendered in, which the built-in templates put on the `<html>` tag.

## Captcha

Captcha protection for the panel; set this up before you [enable registration](#application). When configured, the captcha renders on the [login, register, and forgot-password pages](/docs/panel/features/auth) and in the server [subuser invite modal](/docs/panel/features/server/subusers). Pick a **Provider**:

| Provider | Fields |
| --- | --- |
| **None** | No captcha |
| **Turnstile** | **Site Key**, **Secret Key** |
| **reCAPTCHA** | **Site Key**, **Secret Key**, and a **V3** toggle |
| **hCaptcha** | **Site Key**, **Secret Key** |
| **Friendly Captcha** | **Site Key**, **API Key** |

## Webauthn

![](/docs/panel/features/admin/images/settings/webauthn.webp)

The settings behind [Security Keys](/docs/panel/features/dashboard/security-keys) and the login page's [passkey options](/docs/panel/features/auth/login#sign-in-with-a-passkey).

| Field | Description |
| --- | --- |
| **Enable Security Keys** | Allow users to register and sign in with security keys. Existing keys are kept and remain visible, but can't be used to sign in while this is off |
| **Allow Usernameless Login** | Let users store passkeys on their device and pick one from a list instead of typing a username |
| **RP Id** | The WebAuthn relying party ID |
| **RP Origin** | The WebAuthn relying party origin |
| **Authentication Timeout (seconds)** | How long a sign-in prompt waits before giving up |
| **Registration Timeout (seconds)** | How long a registration prompt waits before giving up |

**Autofill** fills **RP Id** and **RP Origin** from the panel's own address. It refuses to run when the panel is served from a bare IP address, since WebAuthn doesn't work there.

::: warning
Changing the **RP Id** breaks all existing WebAuthn credentials and forces users to re-register their devices.
:::

## Server

![](/docs/panel/features/admin/images/settings/server.webp)

Limits and behavior toggles that apply to all servers on the panel.

| Field | Description |
| --- | --- |
| **Max File Manager View Size** | Largest file the file manager will open |
| **Max Schedule Steps** | Maximum number of steps per schedule |
| **Max File Manager Content Search Size** | Largest file the file-content search will look inside |
| **Max File Manager Search Results** | Cap on results returned by a file search |
| **Max Subuser Count** | Maximum subusers per server |
| **Max Backup Groups per Server** | Maximum backup groups each server can have |
| **Max Databases per Database Instance** | Database cap per managed database instance |
| **Max Users per Database Instance** | User cap per managed database instance |
| **Max Firewall Rules** | Maximum [firewall](/docs/panel/features/server/network/firewall) rules per server |
| **Max Firewall Rule Sources** | Maximum sources a single firewall rule may list |
| **Max Private Connections per Server** | Maximum [private network](/docs/panel/features/server/network/connections) connections a server may open to other servers |
| **Max Private Ports per Server** | Maximum ports a server may offer to the servers connected to it privately |
| **Allow Overwriting Custom Docker Image** | Users can pick a different Docker image from the Eggs list even when an admin has set a custom image |
| **Allow Viewing Installation Logs** | Users with console read permission can watch installation logs; otherwise they're admin-only |
| **Allow Acknowledging Installation Failure** | Users can acknowledge a failed install and try starting the server instead of waiting for an admin |
| **Allow Viewing Transfer Progress** | Users with console read permission can watch transfer progress logs; otherwise they're admin-only |
| **Container Prelude** | The terminal prelude used for some status-related messages in the server console |

The database instance limits apply to [managed databases](/docs/db-agent) created through database agent hosts.

## User

![](/docs/panel/features/admin/images/settings/user.webp)

Per-account limits for [Dashboard](/docs/panel/features/dashboard) features.

| Field | Description |
| --- | --- |
| **Max Server Groups** | Cap on [server groups](/docs/panel/features/dashboard/servers) per user |
| **Max API Keys** | Cap on [API keys](/docs/panel/features/dashboard/api-keys) per user |
| **Max Command Snippets** | Cap on [command snippets](/docs/panel/features/dashboard/command-snippets) per user |
| **Max Security Keys** | Cap on [security keys](/docs/panel/features/dashboard/security-keys) per user |
| **Max SSH Keys** | Cap on [SSH keys](/docs/panel/features/dashboard/ssh-keys) per user |
| **Max Synced Settings** | Cap on how many settings an account may sync across devices |
| **Max Synced Setting Size (bytes)** | Largest value a single synced setting may hold |
| **Allow Changing Language** | If enabled, users can change their language preferences |

Below the limits, **Client Route Order** is a collapsible section: enable it to reorder the pages of the user dashboard sidebar for everyone. Drag entries to reorder, and use the row at the bottom to insert extra entries: a **Route**, a **Divider**, or a **Redirect** (a name plus an external URL). It's the same editor egg configurations use for the [server sidebar](/docs/panel/features/admin/egg-configurations#route-configuration).

![](/docs/panel/features/admin/images/settings/client-route-order.webp)

![](/docs/panel/features/admin/images/settings/route-divider-redirect.webp)

## Activity

![](/docs/panel/features/admin/images/settings/activity.webp)

Retention for the three activity logs and what gets logged.

**Admin Activity Retention Days**, **User Activity Retention Days**, and **Server Activity Retention Days** control how many days entries are kept in each log. The matching **Retention Count** fields optionally cap the number of entries kept as well.

| Field | Description |
| --- | --- |
| **Log Server Admin Activity** | Log admin activity on servers where the admin isn't an owner or subuser |
| **Log Server Schedule Activity** | Log activity done by server schedules |

## Ratelimits

![](/docs/panel/features/admin/images/settings/ratelimits.webp)

Per-endpoint API rate limits. Each endpoint card has two values: **Hits**, the maximum number of requests allowed per window, and **Window**, the window duration in seconds.

Endpoints covered: `auth/register`, `auth/login`, `auth/login/checkpoint`, `auth/login/checkpoint/email`, `auth/login/security-key`, `auth/password/forgot`, `auth/password/reset`, `auth/email/verify`, `client`, `client/account/email/resend-verification`, `client/servers/backups/create`, `client/servers/files/pull`, `client/servers/files/pull/query`, `remote`, and `remote/sftp/auth`.

### Exemptions

The **Exemptions** card below the endpoint grid lets trusted callers skip the two broad per-IP limits.

| Field | Description |
| --- | --- |
| **Exempt IPs** | IP addresses or CIDR ranges that skip the `client` and `remote` limits |
| **Exempt API Keys** | UUIDs of API keys that skip the `client` limit; a key only counts as exempt while it is enabled and used from one of its allowed IPs |

Exemptions only cover the `client` and `remote` limits. The login, registration, and password limits still apply to exempt IPs, and the per-server limits (backup creation, file pulls) still apply to exempt keys, since those protect the nodes rather than the panel.

Users can copy a key's UUID from the context menu on their [API Keys](/docs/panel/features/dashboard/api-keys) page. Saving refuses UUIDs that don't belong to an existing key, and a background job removes the UUIDs of keys that were deleted afterwards.

If the panel runs behind a reverse proxy, make sure `APP_TRUSTED_PROXIES` is set correctly, since IP exemptions match against the client address the panel resolves from the forwarded headers.
