# Interface Object Structure (https://www.librechat.ai/docs/configuration/librechat_yaml/object_structure/interface)

## Overview

The `interface` object allows for customization of various user interface elements within the application, including visibility and behavior settings for components such as menus, panels, and links. This section provides a detailed breakdown of the `interface` object structure.

These are fields under `interface`:

- `mcpServers`
- `privacyPolicy`
- `termsOfService`
- `modelSelect`
- `parameters`
- `contextUsage`
- `contextCost`
- `currency`
- `presets`
- `prompts`
- `bookmarks`
- `memories`
- `multiConvo`
- `agents`
- `remoteAgents`
- `skills`
- `sharedLinks`
- `schedules`
- `temporaryChat`
- `temporaryChatRetention`
- `retentionMode`
- `retainAgentFiles`
- `autoSubmitFromUrl`
- `customWelcome`
- `runCode`
- `webSearch`
- `fileSearch`
- `fileCitations`
- `feedback`
- `defaultPinnedTools`
- `peoplePicker`
- `marketplace`

**Notes:**

- The `interface` configurations are applied globally within the application.
- Default values are provided for most settings but can be overridden based on specific requirements or conditions.
- Conditional logic in the application can further modify these settings based on other configurations like model specifications.

<Callout type="warning" title="Deprecated: permission side-effect fields">
Several fields below (`mcpServers`, `prompts`, `bookmarks`, `memories`, `multiConvo`, `agents`, `remoteAgents`, `skills`, `sharedLinks`, `schedules`, `temporaryChat`, `runCode`, `webSearch`, `fileSearch`, `fileCitations`, `peoplePicker`, `marketplace`) don't just toggle UI, they seed role permissions in the database at startup, and only for the built-in `USER` role.

For ongoing management, use the [**LibreChat Admin Panel**](/docs/features/admin_panel), which edits the permission matrix directly on each role (including custom roles). These YAML fields remain supported for bootstrapping a fresh instance or fully file-driven deployments, but should no longer be used as the primary way to manage feature permissions.

See [Access Control](/docs/features/access_control) for the full permission model.

</Callout>

## Example

```yaml filename="interface"
interface:
  mcpServers:
    placeholder: 'MCP Servers'
    use: true
    create: true
    share: false
    public: false
    configureObo: false
    trustCheckbox:
      label: 'I trust this server'
      subLabel: 'Only enable servers you trust'
  privacyPolicy:
    externalUrl: 'https://example.com/privacy'
    openNewTab: true
  termsOfService:
    externalUrl: 'https://example.com/terms'
    openNewTab: true
    modalAcceptance: true
    modalTitle: 'Terms of Service'
    modalContent: |
      # Terms of Service
      ## Introduction
      Welcome to LibreChat!
  modelSelect: false
  parameters: true
  contextUsage: true
  contextCost: true
  currency:
    code: EUR
    rate: 0.92
  presets: false
  prompts:
    use: true
    create: true
    share: true
    public: false
  bookmarks: true
  multiConvo: true
  agents:
    use: true
    create: true
    share: true
    public: false
  skills:
    use: true
    create: true
    share: false
    public: false
    defaultActiveOnShare: false
  sharedLinks:
    create: true
    share: true
    public: false
    snapshotFiles: true
  schedules:
    use: true
    create: true
    maxPerUser: 10
    minIntervalMinutes: 60
    autoDisableAfterFailures: 5
    fireConcurrency: 5
  customWelcome: 'Hey {{user.name}}! Welcome to LibreChat'
  runCode: true
  webSearch: true
  fileSearch: true
  fileCitations: true
  feedback: true
  defaultPinnedTools:
    - artifacts
    - execute_code
    - mcp
```

## mcpServers

> **Deprecated for permission management.** The `use`, `create`, `share`, and `public` sub-keys seed role permissions at startup. Prefer the [Admin Panel](/docs/features/admin_panel) for managing MCP server permissions per role/group/user. The `placeholder` and `trustCheckbox` sub-keys are unaffected.

**Key:**

<OptionTable
  options={[
    [
      'mcpServers',
      'Object',
      'Contains settings related to the MCP (Model Context Protocol) server selection interface and access control.',
      'Allows for customization of the placeholder text, user permissions, and trust checkbox labels.',
    ],
  ]}
/>

**Sub-keys:**

<OptionTable
  options={[
    [
      'placeholder',
      'String',
      'The placeholder text displayed in the MCP server selection dropdown when no server is selected.',
      'MCP Servers',
    ],
    [
      'use',
      'Boolean',
      'Controls whether users have permission to use existing MCP servers.',
      'true',
    ],
    [
      'create',
      'Boolean',
      'Controls whether users have permission to create new MCP servers.',
      'true',
    ],
    [
      'share',
      'Boolean',
      'Controls whether users have permission to share MCP servers with other users.',
      'false',
    ],
    [
      'public',
      'Boolean',
      'Controls whether users can share MCP servers publicly (visible to all users).',
      'false',
    ],
    [
      'configureObo',
      'Boolean',
      'Controls whether users have permission to configure MCP server On-Behalf-Of token exchange.',
      'false',
    ],
    [
      'trustCheckbox',
      'Object',
      'Customizable labels for the trust checkbox in the MCP server dialog. Supports simple strings or language-keyed objects for internationalization.',
      'See below',
    ],
  ]}
/>

**trustCheckbox Sub-keys:**

<OptionTable
  options={[
    [
      'label',
      'String or Object',
      'The main label for the trust checkbox. Can be a simple string or a language-keyed object (e.g., { en: "I trust this server", es: "Confío en este servidor" }).',
      '',
    ],
    [
      'subLabel',
      'String or Object',
      'The sub-label (help text) for the trust checkbox. Can be a simple string or a language-keyed object for internationalization.',
      '',
    ],
  ]}
/>

**Example:**

```yaml filename="interface / mcpServers"
interface:
  mcpServers:
    placeholder: 'Select MCP Server'
    use: true
    create: true
    share: false
    configureObo: false
    trustCheckbox:
      label:
        en: 'I trust this server'
        es: 'Confío en este servidor'
      subLabel:
        en: 'Only enable servers you trust'
        es: 'Solo habilite servidores en los que confíe'
```

## privacyPolicy

**Key:**

<OptionTable
  options={[
    [
      'privacyPolicy',
      'Object',
      'Contains settings related to the privacy policy link provided in the user interface.',
      'Allows for the specification of a custom URL and the option to open it in a new tab.',
    ],
  ]}
/>

**Sub-keys:**

<OptionTable
  options={[
    ['externalUrl', 'String (URL)', 'The URL pointing to the privacy policy document.', ''],
    ['openNewTab', 'Boolean', 'Specifies whether the link should open in a new tab.', ''],
  ]}
/>

## termsOfService

**Key:**

<OptionTable
  options={[
    [
      'termsOfService',
      'Object',
      'Contains settings related to the terms of service link provided in the user interface.',
      'Allows for the specification of a custom URL and the option to open it in a new tab, as well as a modal acceptance dialog for the terms of service.',
    ],
  ]}
/>

**Sub-keys:**

<OptionTable
  options={[
    [
      'externalUrl',
      'String (URL)',
      'The URL pointing to the terms of service document.',
      'https://librechat.ai/tos',
    ],
    ['openNewTab', 'Boolean', 'Specifies whether the link should open in a new tab.', 'true'],
    [
      'modalAcceptance',
      'Boolean',
      'Specifies whether to show a modal terms and conditions dialog for users to accept in order to be able to use LibreChat.',
      'true',
    ],
    [
      'modalTitle',
      'String',
      'Specifies a custom title for the modal terms and conditions dialog (optional).',
      'Terms of Service',
    ],
    [
      'modalContent',
      'String',
      'Specifies the content of the modal terms and conditions dialog in MarkDown format.',
      'See librechat.yaml.example for how to correctly format the multi-line parameter.',
    ],
  ]}
/>

When modal acceptance is enabled, LibreChat records both the acceptance state and the time it was accepted. After upgrading an existing deployment, run `npm run migrate:terms-timestamp` to backfill accepted users that do not have a timestamp. The migration asks for confirmation, processes all tenants, uses each user's account creation time as the fallback, and exits non-zero if any batch fails. Running `npm run reset-terms` clears both the acceptance state and its timestamp so users must accept again.

## modelSelect

**Key:**

<OptionTable
  options={[
    [
      'modelSelect',
      'Boolean',
      'Determines whether the model selection feature is available in the UI.',
      'Enabling this feature allows users to select different models directly from the interface.',
    ],
  ]}
/>

**Default:** `true`

**Notes:**

- This is required to be `true` if using [`modelSpecs.addedEndpoints`](/docs/configuration/librechat_yaml/object_structure/model_specs#addedendpoints).
- If `modelSpecs.addedEndpoints` is used and `interface.modelSelect` is not explicitly set, it defaults to `true`.

**Example:**

```yaml filename="interface / modelSelect"
interface:
  modelSelect: true
```

## parameters

**Key:**

<OptionTable
  options={[
    [
      'parameters',
      'Boolean',
      'Toggles the visibility of parameter configuration options within the interface.',
      'This setting is crucial for users who need to adjust parameters for specific functionalities within the application.',
    ],
  ]}
/>

**Default:** `true`

**Example:**

```yaml filename="interface / parameters"
interface:
  parameters: false
```

## contextUsage

**Key:**

<OptionTable
  options={[
    [
      'contextUsage',
      'Boolean',
      'Shows or hides the real-time context window and token usage gauge in the conversation UI.',
      'When disabled, users will not see the context usage indicator for chats.',
    ],
  ]}
/>

**Default:** `true`

**Example:**

```yaml filename="interface / contextUsage"
interface:
  contextUsage: true
```

## contextCost

**Key:**

<OptionTable
  options={[
    [
      'contextCost',
      'Boolean',
      'Shows or hides cost values in context and token usage details.',
      'When disabled, users can still see token usage if contextUsage is enabled, but cost values are hidden.',
    ],
  ]}
/>

**Default:** `false`

**Notes:**

- Set `contextCost: true` to opt in to visible cost values. Token usage can remain visible through `contextUsage` while cost values stay hidden.
- `currency` only affects displayed costs when cost display is enabled.

**Example:**

```yaml filename="interface / contextCost"
interface:
  contextCost: true
```

## currency

**Key:**

<OptionTable
  options={[
    [
      'currency',
      'Object',
      'Converts displayed usage costs from USD to another currency using a static conversion rate.',
      'Set code to the display currency and rate to a positive conversion multiplier from USD.',
    ],
  ]}
/>

**Sub-keys:**

<OptionTable
  options={[
    ['code', 'String', 'Currency code shown in usage/cost displays.', 'USD'],
    ['rate', 'Number', 'Positive multiplier applied to USD usage costs.', '1'],
  ]}
/>

**Example:**

```yaml filename="interface / currency"
interface:
  currency:
    code: EUR
    rate: 0.92
```

## presets

**Key:**

<OptionTable
  options={[
    [
      'presets',
      'Boolean',
      "Enables or disables the use of presets in the application's UI.",
      'Presets can simplify user interactions by providing pre-configured settings or operations, enhancing user experience and efficiency.',
    ],
  ]}
/>

**Default:** `true`

**Example:**

```yaml filename="interface / presets"
interface:
  presets: true
```

## prompts

> **Deprecated for permission management.** Seeds the `PROMPTS` role permissions at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel) for managing prompt permissions per role/group/user.

**Key:**

<OptionTable
  options={[
    [
      'prompts',
      'Boolean or Object',
      'Controls prompt-related features for all users. Can be a boolean for simple enable/disable, or an object for granular control over use, creation, sharing, and public visibility.',
      'When set to `false`, users will not have access to create, edit, or use custom prompts.',
    ],
  ]}
/>

**Default:** `true`

**Important: Boolean vs Object Configuration**

- **Boolean (`prompts: true`)**: Only updates the `use` permission. Existing `create`, `share`, and `public` permission values are **preserved** from the database. Use this as a simple feature toggle without affecting other settings configured through the admin panel.

- **Object**: Updates only the sub-permissions that are explicitly specified. Any permissions not included in the config are preserved from the database.

When using the object structure:

**Sub-keys:**

<OptionTable
  options={[
    ['use', 'Boolean', 'Controls whether users can use prompts.', 'true'],
    ['create', 'Boolean', 'Controls whether users can create new prompts.', 'true'],
    [
      'share',
      'Boolean',
      'Controls whether users can share prompts with specific users/groups.',
      'false',
    ],
    [
      'public',
      'Boolean',
      'Controls whether users can share prompts publicly (visible to all users).',
      'false',
    ],
  ]}
/>

**Example (boolean - simple feature toggle):**

```yaml filename="interface / prompts (boolean)"
interface:
  prompts: true # Only updates USE; create/share/public remain unchanged
```

**Example (object - granular control):**

```yaml filename="interface / prompts (object)"
interface:
  prompts:
    use: true
    create: false # Disable creation while allowing use
    # share and public not specified - preserves existing values
```

**Example (object - full control):**

```yaml filename="interface / prompts (object)"
interface:
  prompts:
    use: true
    create: true
    share: true
    public: false
```

## bookmarks

> **Deprecated for permission management.** Seeds the `BOOKMARKS` role permission at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel).

**Key:**

<OptionTable
  options={[
    [
      'bookmarks',
      'Boolean',
      'Enables or disables all bookmarks-related features for all users.',
      'When disabled, users will not be able to create, manage, or access bookmarks within the application.',
    ],
  ]}
/>

**Default:** `true`

**Example:**

```yaml filename="interface / bookmarks"
interface:
  bookmarks: true
```

## memories

> **Deprecated for permission management.** Seeds the `MEMORIES` role permissions at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel). Note this toggle is separate from the [`memory`](/docs/configuration/librechat_yaml/object_structure/memory) behavior configuration.

**Key:**

<OptionTable
  options={[
    [
      'memories',
      'Boolean',
      'Enables or disables the memories feature for all users in the interface.',
      'When disabled, users will not have access to the memories panel or memory-related features.',
    ],
  ]}
/>

**Default:** `true`

**Note:** This controls the UI visibility of the memories feature. For detailed memory behavior configuration (token limits, personalization, agent settings), see the [Memory Configuration](/docs/configuration/librechat_yaml/object_structure/memory).

**Example:**

```yaml filename="interface / memories"
interface:
  memories: true
```

## multiConvo

> **Deprecated for permission management.** Seeds the `MULTI_CONVO` role permission at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel).

**Key:**

<OptionTable
  options={[
    [
      'multiConvo',
      'Boolean',
      'Enables or disables all "multiConvo", AKA multiple response streaming, related features for all users.',
      'When disabled, users will not be able to stream responses from 2 AI models at the same time.',
    ],
  ]}
/>

**Default:** `true`

**Example:**

```yaml filename="interface / multiConvo"
interface:
  multiConvo: true
```

## agents

More info on [Agents](/docs/features/agents)

> **Deprecated for permission management.** Seeds the `AGENTS` role permissions at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel) for managing agent permissions per role/group/user.

**Key:**

<OptionTable
  options={[
    [
      'agents',
      'Boolean or Object',
      'Controls agent-related features for all users. Can be a boolean for simple enable/disable, or an object for granular control over use, creation, sharing, and public visibility.',
      'When set to `false`, users will not have access to agents.',
    ],
  ]}
/>

**Default:** `true`

**Important: Boolean vs Object Configuration**

- **Boolean (`agents: true`)**: Only updates the `use` permission. Existing `create`, `share`, and `public` permission values are **preserved** from the database. Use this as a simple feature toggle without affecting other settings configured through the admin panel.

- **Object**: Updates only the sub-permissions that are explicitly specified. Any permissions not included in the config are preserved from the database.

When using the object structure:

**Sub-keys:**

<OptionTable
  options={[
    ['use', 'Boolean', 'Controls whether users can use agents.', 'true'],
    ['create', 'Boolean', 'Controls whether users can create new agents.', 'true'],
    [
      'share',
      'Boolean',
      'Controls whether users can share agents with specific users/groups.',
      'false',
    ],
    [
      'public',
      'Boolean',
      'Controls whether users can share agents publicly (visible to all users).',
      'false',
    ],
  ]}
/>

**Example (boolean - simple feature toggle):**

```yaml filename="interface / agents (boolean)"
interface:
  agents: true # Only updates USE; create/share/public remain unchanged
```

**Example (object - granular control):**

```yaml filename="interface / agents (object)"
interface:
  agents:
    use: true
    create: false # Disable creation while allowing use
    # share and public not specified - preserves existing values
```

**Example (object - full control):**

```yaml filename="interface / agents (object)"
interface:
  agents:
    use: true
    create: true
    share: true
    public: false
```

## remoteAgents

Controls access to the Agents API (OpenAI-compatible and Open Responses API endpoints), which allows external applications to interact with LibreChat agents programmatically via API keys.

> **Deprecated for permission management.** Seeds the `REMOTE_AGENTS` role permissions at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel).

**Key:**

<OptionTable
  options={[
    [
      'remoteAgents',
      'Object',
      'Configuration for remote agent API access control. All fields default to `false`.',
      '',
    ],
  ]}
/>

**Sub-keys:**

<OptionTable
  options={[
    ['use', 'Boolean', 'Controls whether users can access the remote agents API.', 'false'],
    ['create', 'Boolean', 'Controls whether users can create API keys for remote agents.', 'false'],
    ['share', 'Boolean', 'Controls whether users can share remote agents.', 'false'],
    ['public', 'Boolean', 'Controls whether users can share remote agents publicly.', 'false'],
  ]}
/>

**Default:** All fields default to `false` (disabled).

**Example:**

```yaml filename="interface / remoteAgents"
interface:
  remoteAgents:
    use: true
    create: true
    share: false
    public: false
```

**Note:** Admin users have all remote agent permissions enabled by default regardless of this configuration.

## skills

> **Deprecated for permission management.** Seeds the `SKILLS` role permissions at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel) for managing Skills permissions per role/group/user. `defaultActiveOnShare` is not a permission bit and remains a YAML behavior setting.

**Key:**

<OptionTable
  options={[
    [
      'skills',
      'Boolean or Object',
      'Controls Skills-related permissions and shared-skill activation defaults. Can be a boolean for simple enable/disable, or an object for granular control.',
      'When set to `false`, users cannot use, create, or share Skills.',
    ],
  ]}
/>

**Default:** `true` for `use` and `create`, `false` for `share`, `public`, and `defaultActiveOnShare`.

**Sub-keys:**

<OptionTable
  options={[
    ['use', 'Boolean', 'Controls whether users can use Skills.', 'true'],
    ['create', 'Boolean', 'Controls whether users can create Skills.', 'true'],
    [
      'share',
      'Boolean',
      'Controls whether users can share Skills with specific users/groups.',
      'false',
    ],
    [
      'public',
      'Boolean',
      'Controls whether users can share Skills publicly (visible to all users).',
      'false',
    ],
    [
      'defaultActiveOnShare',
      'Boolean',
      'Controls whether shared Skills default to active for recipients until they override the setting.',
      'false',
    ],
  ]}
/>

**Example:**

```yaml filename="interface / skills"
interface:
  skills:
    use: true
    create: true
    share: false
    public: false
    defaultActiveOnShare: false
```

For Skills behavior and invocation modes, see [Skills](/docs/features/skills).

## sharedLinks

> **Deprecated for permission management.** Seeds the `SHARED_LINKS` role permissions at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel) for managing shared-link permissions per role/group/user.

**Key:**

<OptionTable
  options={[
    [
      'sharedLinks',
      'Boolean or Object',
      'Controls shared-link permissions. Can be a boolean to enable/disable all shared-link permissions, or an object for granular create/share/public control.',
      'When set to `false`, users cannot create or share conversation links.',
    ],
  ]}
/>

**Default:** `create: true`, `share: true`, `public: true`

**Important: Boolean vs Object Configuration**

- **Boolean (`sharedLinks: true`)**: Enables all `SHARED_LINKS` permissions for the default `USER` role.
- **Boolean (`sharedLinks: false`)**: Disables all `SHARED_LINKS` permissions for the default `USER` role.
- **Object**: Updates only the sub-permissions that are explicitly specified. Any permissions not included in the config are preserved from the database.

**Sub-keys:**

<OptionTable
  options={[
    ['create', 'Boolean', 'Controls whether users can create shared conversation links.', 'true'],
    [
      'share',
      'Boolean',
      'Controls whether users can share links with authenticated users.',
      'true',
    ],
    [
      'public',
      'Boolean',
      'Controls whether users can toggle "share with everyone" for a shared link. Anonymous viewing still requires ALLOW_SHARED_LINKS_PUBLIC=true.',
      'true',
    ],
    [
      'snapshotFiles',
      'Boolean',
      'Controls whether newly created shared links can snapshot referenced conversation files so recipients can preview or download them through the link.',
      'true',
    ],
  ]}
/>

**Example:**

```yaml filename="interface / sharedLinks"
interface:
  sharedLinks:
    create: true
    share: true
    public: false
    snapshotFiles: true
```

For user-facing shared-link behavior, see [Shareable Links](/docs/features/shareable_links).

## schedules

Enables the experimental [Scheduled Chats](/docs/features/scheduled_chats) panel and configures its permissions and runtime limits.

> **Deprecated for permission management.** The `use` and `create` sub-keys seed the `SCHEDULES` permissions at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel) for ongoing permission management. The runtime limit fields remain YAML settings.

<Callout type="warning" title="Experimental and default-off">
  The `schedules` field is absent from LibreChat's default interface configuration. Scheduled runs
  can consume model and tool resources, so add this field only after reviewing the deployment
  requirements in [Scheduled Chats](/docs/features/scheduled_chats#deployment-safety).
</Callout>

**Key:**

<OptionTable
  options={[
    [
      'schedules',
      'Boolean or Object',
      'Controls Scheduled Chats permissions and deployment limits.',
      'Omitted by default (disabled).',
    ],
  ]}
/>

**Boolean behavior:**

- `schedules: true` opts in with the default runtime limits without changing stored role permissions.
- `schedules: false` is a deployment-wide stop. It cannot be re-enabled by a role, group, or user configuration override.
- Object form opts in unless `use: false` is set.

**Sub-keys:**

<OptionTable
  options={[
    ['use', 'Boolean', 'Controls whether users can list and view their schedules.', 'true when opted in'],
    [
      'create',
      'Boolean',
      'Controls whether users can create, edit, enable, run, and delete schedules.',
      'true',
    ],
    ['maxPerUser', 'Number', 'Maximum schedules per user. Set to 0 to prevent creation.', '10'],
    ['minIntervalMinutes', 'Number', 'Shortest allowed interval between occurrences.', '60'],
    [
      'autoDisableAfterFailures',
      'Number',
      'Consecutive failed runs before a schedule is disabled.',
      '5',
    ],
    [
      'fireConcurrency',
      'Number',
      'Maximum scheduled runs admitted concurrently across the deployment.',
      '5',
    ],
    [
      'requireProject',
      'Boolean',
      'Requires every schedule to resolve to an owned Chat Project at create/update time and again at each run.',
      'false',
    ],
    [
      'projectId',
      'String',
      'Pins every scheduled conversation to one Chat Project, overriding the stored choice and implying `requireProject`.',
      '',
    ],
  ]}
/>

```yaml filename="interface / schedules"
interface:
  schedules:
    use: true
    create: true
    maxPerUser: 10
    minIntervalMinutes: 60
    autoDisableAfterFailures: 5
    fireConcurrency: 5
    requireProject: false
    # projectId: '000000000000000000000000'
```

The base YAML is authoritative for the global enable state. Configuration overrides can narrow access and tune inherited limits, but cannot re-enable a base `false` or `{ use: false }`. `SCHEDULES_DISABLED=true` is an additional emergency stop for both automatic and manual runs.

`requireProject` is enforced both when a schedule is written and immediately before each run. A schedule that no longer satisfies the requirement is auto-disabled rather than starting an unscoped conversation. `projectId` outranks a schedule's stored selection and is resolved as the schedule owner; because projects are user-owned, it is primarily useful in per-role or per-user configuration overrides rather than as one deployment-wide value.

## temporaryChat

Controls whether the temporary chat feature is available to users. Temporary chats are not saved to conversation history and are automatically deleted after a configurable retention period.

> **Deprecated for permission management.** Seeds the `TEMPORARY_CHAT` role permission at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel). `temporaryChatRetention` below is not a permission and remains the recommended way to configure retention.

**Key:**

<OptionTable
  options={[
    [
      'temporaryChat',
      'Boolean',
      'Enables or disables the temporary chat feature.',
      'When set to `false`, users will not see the option to start temporary chats.',
    ],
  ]}
/>

**Default:** `true`

**Note:** The retention period for temporary chats can be configured using `temporaryChatRetention`.

**Example:**

```yaml filename="interface / temporaryChat"
interface:
  temporaryChat: true
```

## temporaryChatRetention

The `temporaryChatRetention` configuration allows you to customize how long temporary chats are retained before being automatically deleted.

**Key:**

<OptionTable
  options={[
    [
      'temporaryChatRetention',
      'Number',
      'Sets the retention period for temporary chats in hours.',
      'temporaryChatRetention: 168',
    ],
  ]}
/>

**Validation Rules:**

- **Minimum**: 1 hour (prevents immediate deletion)
- **Maximum**: 8760 hours (1 year maximum retention)
- **Default**: 720 hours (30 days)

**Configuration Methods:**

1. **LibreChat.yaml** (recommended): `interface.temporaryChatRetention: 168`
2. **Environment Variable** (deprecated): `TEMP_CHAT_RETENTION_HOURS=168`

> **Note:** The environment variable `TEMP_CHAT_RETENTION_HOURS` is deprecated. Please use the `interface.temporaryChatRetention` config option in `librechat.yaml` instead. The config file value takes precedence over the environment variable.

**Example:**

```yaml filename="interface / temporaryChatRetention"
interface:
  temporaryChatRetention: 168 # Retain temporary chats for 7 days
  retentionMode: 'temporary'
```

**Common Retention Periods:**

- **1 hour**: `temporaryChatRetention: 1` (minimal retention)
- **24 hours**: `temporaryChatRetention: 24` (1 day)
- **168 hours**: `temporaryChatRetention: 168` (1 week)
- **720 hours**: `temporaryChatRetention: 720` (30 days - default)
- **8760 hours**: `temporaryChatRetention: 8760` (1 year - maximum)

## retentionMode

Controls which data receives retention deadlines.

**Key:**

<OptionTable
  options={[
    [
      'retentionMode',
      'String',
      'Set to "temporary" to apply retention only to temporary chats, or "all" to apply retention to all supported retained data, including persistent agent resource files unless retainAgentFiles is true.',
      'retentionMode: "temporary"',
    ],
  ]}
/>

**Default:** `temporary`

<Callout type="warning">
  `retentionMode: "all"` applies retention deadlines beyond temporary chats, including persistent
  agent resource files unless `retainAgentFiles: true` is configured. Confirm your retention policy
  before enabling it.
</Callout>

**Example:**

```yaml filename="interface / retentionMode"
interface:
  temporaryChatRetention: 168
  retentionMode: 'all'
```

## retainAgentFiles

Controls whether persistent agent resource files are exempt from all-data retention.

**Key:**

<OptionTable
  options={[
    [
      'retainAgentFiles',
      'Boolean',
      'When true, persistent agent resource files do not expire under retentionMode: "all". Non-agent files and message attachments still expire.',
      'retainAgentFiles: false',
    ],
  ]}
/>

**Default:** `false`

**Notes:**

- This setting only changes behavior when `retentionMode` is set to `"all"`.
- Set this to `true` when agents should keep their persistent resource files even while conversations, messages, and non-agent files receive retention deadlines.

**Example:**

```yaml filename="interface / retainAgentFiles"
interface:
  temporaryChatRetention: 168
  retentionMode: 'all'
  retainAgentFiles: true
```

## autoSubmitFromUrl

Controls whether a prompt supplied via URL query parameters on `/c/new` is auto-submitted to the model.

When `/c/new?prompt=…&submit=true` is opened by an authenticated user, LibreChat normally pre-fills the composer with the URL-supplied prompt and submits it immediately. This is a convenience feature for crafted deeplinks and shared chat URLs.

For deployments where users may receive crafted links from external sources — and where memory- or tool-enabled models could leak sensitive context if a prompt-injection payload reaches the model — operators can disable auto-submission. With the flag set to `false`, the prompt is still pre-filled in the composer but the user must press **Send** explicitly.

**Key:**

<OptionTable
  options={[
    [
      'autoSubmitFromUrl',
      'Boolean',
      'Controls whether `/c/new?prompt=…&submit=true` auto-submits to the model.',
      'When `false`, the prompt is pre-filled in the composer but not submitted.',
    ],
  ]}
/>

**Default:** `true` (existing behavior is preserved unless explicitly disabled).

**Notes:**

- This setting does not affect URL-driven model spec selection or other URL-driven settings — only the auto-submission step.
- The query parameter accepts both `prompt` and `q` as the prompt source, with `prompt` taking precedence. `submit=true` is the trigger.
- Recommended for instances handling sensitive memory or tool data, where a 1-click prompt-injection vector should require explicit user confirmation.

**Example:**

```yaml filename="interface / autoSubmitFromUrl"
interface:
  autoSubmitFromUrl: false
```

## customWelcome

**Key:**

<OptionTable
  options={[
    [
      'customWelcome',
      'String',
      'Allows administrators to define a custom welcome message for the chat interface, with the option to personalize it using the {{user.name}} parameter.',
    ],
  ]}
/>

**Default:** _None (if not specified, a default greeting is used)_

**Example:**

```yaml filename="interface / customWelcome"
interface:
  customWelcome: 'Hey {{user.name}}! Welcome to LibreChat'
```

**Note:** You can use `{{user.name}}` within the `customWelcome` message to dynamically insert the user's name for a personalized greeting experience.

## runCode

Enables/disables the "Run Code" button for Markdown Code Blocks. More info on the [LibreChat Code Interpreter API](/docs/features/code_interpreter)

**Note:** This setting does not disable the [Agents Code Interpreter Capability](/docs/features/agents#code-interpreter). To disable the Agents Capability, see the [Agents Endpoint configuration](/docs/configuration/librechat_yaml/object_structure/agents) instead.

> **Deprecated for permission management.** Seeds the `RUN_CODE` role permission at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel).

**Key:**

<OptionTable
  options={[
    ['runCode', 'Boolean', 'Enables or disables the "Run Code" button for Markdown Code Blocks.'],
  ]}
/>

**Default:** `true`

**Example:**

```yaml filename="interface / runCode"
interface:
  runCode: true
```

## webSearch

Enables/disables the web search button in the chat interface. More info on [Web Search Configuration](/docs/configuration/librechat_yaml/object_structure/web_search)

**Note:** This setting does not disable the [Agents Web Search capability](/docs/features/agents#agent-capabilities). To disable the Agents capability, see the [Agents endpoint configuration](/docs/configuration/librechat_yaml/object_structure/agents#capabilities) instead.

> **Deprecated for permission management.** Seeds the `WEB_SEARCH` role permission at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel).

**Key:**

<OptionTable
  options={[
    ['webSearch', 'Boolean', 'Enables or disables the web search button in the chat interface.'],
  ]}
/>

**Default:** `true`

**Example:**

```yaml filename="interface / webSearch"
interface:
  webSearch: true
```

## fileSearch

Enables/disables the file search (for RAG API usage via tool) button in the chat interface

**Note:** This setting does not disable the [Agents File Search Capability](/docs/features/agents#file-search). To disable the Agents Capability, see the [Agents Endpoint configuration](/docs/configuration/librechat_yaml/object_structure/agents) instead.

> **Deprecated for permission management.** Seeds the `FILE_SEARCH` role permission at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel).

**Key:**

<OptionTable
  options={[
    ['fileSearch', 'Boolean', 'Enables or disables the file search button in the chat interface.'],
  ]}
/>

**Default:** `true`

**Example:**

```yaml filename="interface / fileSearch"
interface:
  fileSearch: true
```

## fileCitations

Controls the global availability of file citations functionality. When disabled, it effectively removes the `FILE_CITATIONS` permission for all users, preventing any file citations from being displayed when using file search, regardless of individual user permissions.

> **Deprecated for permission management.** Seeds/globally gates the `FILE_CITATIONS` role permission at startup. Prefer the [Admin Panel](/docs/features/admin_panel) for managing citations permissions per role/group/user.

**Note:**

- This setting acts as a global toggle for the `FILE_CITATIONS` permission system-wide.
- When set to `false`, no users will see file citations, even if they have been granted the permission through roles.
- File citations require the `fileSearch` feature to be enabled.
- When using agents with file search capability, citation behavior (quantity and quality) can be configured through the [Agents endpoint configuration](/docs/configuration/librechat_yaml/object_structure/agents#file-citation-configuration-examples).

**Key:**

<OptionTable
  options={[
    [
      'fileCitations',
      'Boolean',
      'Globally enables or disables the FILE_CITATIONS permission for all users, controlling whether file search results can include source citations.',
    ],
  ]}
/>

**Default:** `true`

**Example:**

```yaml filename="interface / fileCitations"
interface:
  fileCitations: true
```

## feedback

Controls whether the thumbs up / thumbs down buttons are shown under responses. When set to `false`, the buttons are removed from the message action row and the server rejects feedback writes, so a deployment that hides the controls also stores no ratings.

**Notes:**

- The other message actions (read aloud, copy, edit, fork, and regenerate) are unaffected, and the action row reflows without leaving a gap.
- With feedback disabled, `PUT /api/messages/:conversationId/:messageId/feedback` responds with `403` and `{"error": "Feedback is disabled"}` before anything is written to the database or exported.
- Ratings collected while the feature was enabled stay on existing messages. The flag stops new writes, it does not delete stored feedback.
- Ratings are only consumed outside LibreChat when Langfuse tracing is configured, where each one is sent as a `user-feedback` score. See [Message Feedback Scores](/docs/configuration/langfuse#message-feedback-scores).
- This is a plain interface flag rather than a role permission, so there is nothing to grant per role in the [Admin Panel](/docs/features/admin_panel).

**Key:**

<OptionTable
  options={[
    [
      'feedback',
      'Boolean',
      'Shows or hides the thumbs up/thumbs down feedback buttons on responses.',
      'When disabled, the buttons are removed for every user and the feedback endpoint rejects writes with a 403.',
    ],
  ]}
/>

**Default:** `true`

**Example:**

```yaml filename="interface / feedback"
interface:
  feedback: false
```

## defaultPinnedTools

Seeds the initial prompt-bar pinned tools for users who have not customized their pinned tool state. Once a user pins or unpins a tool, LibreChat preserves that user's choice.

**Key:**

<OptionTable
  options={[
    [
      'defaultPinnedTools',
      'Array of strings',
      'Tool keys and MCP dropdown/server names that should start pinned in the prompt bar for new or uncustomized users.',
      'When omitted, built-in tools start unpinned and the MCP dropdown keeps its default pinned state.',
    ],
  ]}
/>

**Supported values:**

- Built-in tool keys: `artifacts`, `execute_code`, `web_search`, `file_search`, `skills`
- `mcp` to pin the MCP servers dropdown
- A specific MCP server name to seed that server as pinned

**Example:**

```yaml filename="interface / defaultPinnedTools"
interface:
  defaultPinnedTools:
    - artifacts
    - execute_code
    - mcp
```

## peoplePicker

Controls which principal types (users, groups, roles) are available for selection in the people picker interface, typically used when sharing agents or managing access controls.

> **Deprecated for permission management.** Seeds the `PEOPLE_PICKER` role permissions at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel).

**Key:**

<OptionTable
  options={[
    [
      'peoplePicker',
      'Object',
      'Configuration for which principal types are available in the people picker interface.',
    ],
  ]}
/>

**Sub-keys:**

<OptionTable
  options={[
    ['users', 'Boolean', 'Enables user search in the people picker. Default: true'],
    ['groups', 'Boolean', 'Enables group search in the people picker. Default: true'],
    ['roles', 'Boolean', 'Enables role search in the people picker. Default: true'],
  ]}
/>

**Default:**

```yaml
peoplePicker:
  users: true
  groups: true
  roles: true
```

**Example:**

```yaml filename="interface / peoplePicker"
interface:
  peoplePicker:
    users: true
    groups: true
    roles: false # Disable role selection in people picker
```

## marketplace

Enables/disables access to the Agent Marketplace.

> **Deprecated for permission management.** Seeds the `MARKETPLACE` role permission at startup for the default `USER` role only. Prefer the [Admin Panel](/docs/features/admin_panel).

**Key:**

<OptionTable
  options={[['marketplace', 'Object', 'Configuration for Agent Marketplace access control.']]}
/>

**Sub-keys:**

<OptionTable
  options={[['use', 'Boolean', 'Enables or disables marketplace access. Default: false']]}
/>

**Default:**

```yaml
marketplace:
  use: false
```

**Example:**

```yaml filename="interface / marketplace"
interface:
  marketplace:
    use: true # Enable marketplace access
```
