> ## Documentation Index
> Fetch the complete documentation index at: https://mintlify.com/discordplace/discord.place/llms.txt
> Use this file to discover all available pages before exploring further.

# Client Configuration

> Customize the discord.place client using config.js.

The client configuration lives in `client/config.js`. Open this file and update the values to match your deployment. The options most commonly changed during self-hosting are documented below.

## Full config structure

```javascript client/config.js theme={null}
const config = {
  availableLocales: [
    {
      name: 'English',
      code: 'en',
      dateFnsKey: 'enUS',
      flag: '🇺🇸',
      default: true,
      countryCode: 'us'
    },
    {
      name: 'Turkish',
      code: 'tr',
      dateFnsKey: 'tr',
      flag: '🇹🇷',
      countryCode: 'tr'
    },
    {
      name: 'Azerbaijani',
      code: 'az',
      dateFnsKey: 'az',
      flag: '🇦🇿',
      countryCode: 'az'
    }
  ],
  supportInviteUrl: 'https://invite.discord.place',
  docsUrl: 'https://docs.discord.place',
  statusUrl: 'https://status.discord.place',
  statusBadgeUrl: 'https://status.discord.place/badge',
  api: {
    url: process.env.NODE_ENV === 'development'
      ? 'http://localhost:3001'
      : 'https://api.discord.place'
  },
  analytics: {
    script: 'https://analytics.skyhan.cloud/api/script.js',
    siteId: '1'
  },
  botTestGuildId: '1239320384441159751',
  botInviteURL: 'https://bot.discord.place',
  customHostnames: ['dsc.lat', 'dsc.gay', 'dsc.wtf', 'dsc.baby'],
  // ... (category lists, icon maps, deny reasons — rarely need changing)
};

export default config;
```

## Options reference

<ParamField path="availableLocales" type="object[]" required>
  Array of locale objects defining all languages available on the site. Each object has the following shape:

  | Field         | Type    | Description                                                    |
  | ------------- | ------- | -------------------------------------------------------------- |
  | `name`        | string  | Human-readable language name, e.g. `"English"`                 |
  | `code`        | string  | BCP 47 language code, e.g. `"en"`, `"tr"`                      |
  | `dateFnsKey`  | string  | Key used to load the matching `date-fns` locale, e.g. `"enUS"` |
  | `flag`        | string  | Flag emoji for the language picker                             |
  | `default`     | boolean | Set to `true` on exactly one locale to mark it as the default  |
  | `countryCode` | string  | ISO 3166-1 alpha-2 country code used for display               |

  Locale JSON files must exist in `client/locales/` matching each `code`. See [Localization](/self-hosting/localization) for adding new languages.

  <Warning>
    To change the default locale, set `default: true` on the desired locale object (and remove it from the current default). You must also update the `DEFAULT_LOCALE_CODE` environment variable in `.github/workflows/validate-locale-files.yml` to avoid spurious GitHub Actions errors.
  </Warning>
</ParamField>

<ParamField path="supportInviteUrl" type="string" required>
  Invite URL for your Discord support server. Displayed in navigation menus, error pages, and other places throughout the site where users are directed to get help.
</ParamField>

<ParamField path="docsUrl" type="string" required>
  URL of your documentation site. Linked from the main navigation and various help prompts.
</ParamField>

<ParamField path="statusUrl" type="string" required>
  URL of your status page (e.g. a Better Stack or Instatus page). Displayed in the footer and error states.
</ParamField>

<ParamField path="statusBadgeUrl" type="string" required>
  URL of the embeddable status badge image for your status page. Rendered as an inline image in the footer.
</ParamField>

<ParamField path="api.url" type="string" required>
  Base URL of the backend API server. The client uses this for all API requests.

  The default config already handles the development vs production split:

  ```javascript theme={null}
  api: {
    url: process.env.NODE_ENV === 'development'
      ? 'http://localhost:3001'
      : 'https://api.discord.place'
  }
  ```

  Replace the production value with your own API domain. Use a domain name (not a bare IP address), and ensure both client and server domains are behind Cloudflare.
</ParamField>

<ParamField path="analytics.script" type="string">
  URL of the [Rybbit Analytics](https://rybbit.io) script to load. If you are not using Rybbit, update or remove this value — no other analytics providers are natively supported.
</ParamField>

<ParamField path="analytics.siteId" type="string">
  Your Rybbit site ID. Assigned when you create a site in the Rybbit dashboard.
</ParamField>

<ParamField path="botTestGuildId" type="string">
  Discord guild ID used for quickly inviting newly submitted bots during review. Set this to a guild you control for testing purposes.
</ParamField>

<ParamField path="botInviteURL" type="string" required>
  Public invite URL for the discord.place bot itself. Shown in multiple places across the site wherever users are prompted to add the bot to their server.
</ParamField>

<ParamField path="customHostnames" type="string[]" required>
  List of custom hostnames that can be used as vanity profile URLs (e.g. `dsc.lat/username`). Update this list to the hostnames you control and have pointed at your deployment.

  <Note>
    Each hostname in this list must be DNS-pointed to the same server that hosts the client, using a reverse proxy (e.g. nginx or Caddy) to route requests to the correct port. The server's `customHostnames` in `config.yml` must contain the same list.
  </Note>
</ParamField>
