{
  "type": "featherpanel.settings.all",
  "generated_at": "2026-10-09T12:14:41.442Z",
  "totals": {
    "categories": 15,
    "settings": 199,
    "constants": 258,
    "sensitive": 14,
    "constants_without_ui": 59
  },
  "api": {
    "list": "GET /api/admin/settings",
    "categories": "GET /api/admin/settings/categories",
    "by_category": "GET /api/admin/settings/category/{category}",
    "one": "GET /api/admin/settings/{setting}",
    "update": "PATCH /api/admin/settings"
  },
  "cli": {
    "interactive": "featherpanel settings",
    "list": "featherpanel saas listsettings",
    "get": "featherpanel saas getsetting <key>",
    "set": "featherpanel saas setsetting <key> <value>"
  },
  "categories": [
    {
      "id": "app",
      "name": "App",
      "description": "Some default settings for the application",
      "icon": "settings",
      "setting_keys": [
        "app_name",
        "app_url",
        "wings_remote_url",
        "app_logo_white",
        "app_logo_dark",
        "app_timezone",
        "app_sso_redirect_path",
        "app_sso_token_lifetime_minutes",
        "app_background_image_url",
        "app_background_lock",
        "app_locale_default",
        "app_locale_lock",
        "app_server_spell_banner_style",
        "app_server_spell_banner_background",
        "app_accent_color_default",
        "app_accent_color_lock",
        "app_theme_default",
        "app_theme_lock",
        "app_theme_pack_default",
        "app_theme_pack_lock",
        "app_ui_pack_default",
        "app_ui_pack_lock",
        "app_background_type_default",
        "app_background_type_lock",
        "app_backdrop_blur_default",
        "app_backdrop_blur_lock",
        "app_backdrop_darken_default",
        "app_backdrop_darken_lock",
        "app_background_image_fit_default",
        "app_background_image_fit_lock",
        "temp_files_enabled",
        "temp_files_api_token"
      ],
      "settings_count": 32
    },
    {
      "id": "links",
      "name": "Links",
      "description": "Public links shown across the panel footer (support, social media, legal)",
      "icon": "link",
      "setting_keys": [
        "app_support_url",
        "website_url",
        "discord_url",
        "linkedin_url",
        "telegram_url",
        "tiktok_url",
        "twitter_url",
        "whatsapp_url",
        "youtube_url",
        "status_page_url",
        "legal_tos",
        "legal_privacy"
      ],
      "settings_count": 12
    },
    {
      "id": "auth_page",
      "name": "Auth Page",
      "description": "Customize the login and register experience, marketing panel, QR sign-in, and method layout",
      "icon": "lock",
      "setting_keys": [
        "auth_shell_tagline",
        "auth_aside_title",
        "auth_login_headline",
        "auth_login_subheadline",
        "auth_register_headline",
        "auth_register_subheadline",
        "auth_sso_headline",
        "auth_sso_subheadline",
        "auth_show_marketing_panel",
        "auth_aside_image_url",
        "auth_show_qr_login",
        "auth_form_density",
        "auth_secondary_layout",
        "auth_show_theme_customizer",
        "auth_footer_style",
        "login_default_method",
        "login_methods_order",
        "login_hidden_methods"
      ],
      "settings_count": 18
    },
    {
      "id": "telemetry",
      "name": "Telemetry",
      "description": "Enable or disable installation reports, browser analytics, heatmaps, and session recordings to FeatherPanel.",
      "icon": "activity",
      "setting_keys": [
        "telemetry"
      ],
      "settings_count": 1
    },
    {
      "id": "security",
      "name": "Security",
      "description": "Security and authentication settings",
      "icon": "shield",
      "setting_keys": [
        "email_login_enabled",
        "captcha_provider",
        "turnstile_enabled",
        "turnstile_key_pub",
        "turnstile_key_priv",
        "hcaptcha_site_key",
        "hcaptcha_secret_key",
        "recaptcha_site_key",
        "recaptcha_secret_key",
        "recaptcha_version",
        "recaptcha_v3_min_score",
        "recaptcha_v3_action",
        "friendly_captcha_site_key",
        "friendly_captcha_secret_key",
        "reforge_captcha_site_key",
        "reforge_captcha_secret_key",
        "reforge_captcha_widget_type",
        "reforge_captcha_theme",
        "reforge_captcha_size",
        "reforge_captcha_lang",
        "reforge_captcha_min_score",
        "registration_enabled",
        "registration_require_email_verification",
        "registration_device_limit_enabled",
        "registration_device_max_accounts",
        "email_domain_blocking_enabled",
        "abuseipdb_enabled",
        "abuseipdb_api_key",
        "abuseipdb_check_on_register",
        "abuseipdb_min_confidence_score",
        "abuseipdb_max_age_days",
        "abuseipdb_register_action",
        "require_two_fa_admins",
        "avatar_provider",
        "avatar_custom_url",
        "user_allow_avatar_change",
        "user_allow_username_change",
        "user_allow_email_change",
        "user_allow_first_name_change",
        "user_allow_last_name_change",
        "user_allow_api_keys_create",
        "user_allow_account_deletion",
        "user_account_deletion_mode",
        "user_account_deletion_delay_days",
        "user_account_deletion_verify_2fa",
        "user_account_deletion_verify_email_otp"
      ],
      "settings_count": 46
    },
    {
      "id": "email",
      "name": "Email",
      "description": "Email configuration settings",
      "icon": "mail",
      "setting_keys": [
        "smtp_enabled",
        "smtp_host",
        "smtp_port",
        "smtp_user",
        "smtp_pass",
        "smtp_from",
        "smtp_encryption"
      ],
      "settings_count": 7
    },
    {
      "id": "status_page",
      "name": "Status Page",
      "description": "User-facing status page configuration",
      "icon": "activity",
      "setting_keys": [
        "status_page_enabled",
        "status_page_public_enabled",
        "status_page_show_node_status",
        "status_page_show_load_usage",
        "status_page_show_total_servers",
        "status_page_show_individual_nodes",
        "status_page_allow_iframe",
        "status_page_show_raw_values",
        "status_page_show_player_count",
        "status_page_servers_visible_by_default"
      ],
      "settings_count": 10
    },
    {
      "id": "knowledgebase",
      "name": "Knowledgebase",
      "description": "Knowledgebase and documentation settings",
      "icon": "book",
      "setting_keys": [
        "knowledgebase_enabled",
        "knowledgebase_public_enabled",
        "knowledgebase_show_categories",
        "knowledgebase_show_articles",
        "knowledgebase_show_attachments",
        "knowledgebase_show_tags"
      ],
      "settings_count": 6
    },
    {
      "id": "oauth",
      "name": "OAuth",
      "description": "Discord OAuth configuration. For OIDC/SSO use Admin → OIDC / SSO Providers.",
      "icon": "shield",
      "setting_keys": [
        "discord_oauth_enabled",
        "discord_oauth_client_id",
        "discord_oauth_client_secret"
      ],
      "settings_count": 3
    },
    {
      "id": "servers",
      "name": "Servers",
      "description": "Servers configuration settings",
      "icon": "server",
      "setting_keys": [
        "server_allow_egg_change",
        "server_allow_startup_change",
        "server_allow_custom_docker_image",
        "server_allow_subusers",
        "server_allow_schedules",
        "server_lifecycle_hooks_enabled",
        "server_lifecycle_hooks_container_shell_enabled",
        "server_run_script_enabled",
        "server_backup_retention_mode",
        "server_allow_user_backup_policy_edit",
        "server_allow_allocation_select",
        "server_allow_user_made_firewall",
        "server_allow_user_made_proxy",
        "server_proxy_max_per_server",
        "server_allow_cross_realm_spell_change",
        "server_allow_user_server_deletion",
        "server_allow_user_made_import",
        "server_allow_user_made_fastdl",
        "server_allow_user_made_subdomains",
        "server_auto_start_on_node_reconnect",
        "server_auto_start_stagger_seconds",
        "server_auto_start_initial_delay_seconds",
        "server_allow_user_auto_start",
        "server_hide_ips",
        "file_trash_enabled",
        "file_trash_max_size_mb",
        "file_trash_retention_days"
      ],
      "settings_count": 27
    },
    {
      "id": "chatbot",
      "name": "Chatbot",
      "description": "AI chatbot configuration settings",
      "icon": "bot",
      "setting_keys": [
        "chatbot_enabled",
        "chatbot_ai_provider",
        "chatbot_temperature",
        "chatbot_max_tokens",
        "chatbot_max_history",
        "chatbot_system_prompt",
        "chatbot_user_prompt",
        "chatbot_google_ai_api_key",
        "chatbot_google_ai_model",
        "chatbot_openrouter_api_key",
        "chatbot_openrouter_model",
        "chatbot_openai_api_key",
        "chatbot_openai_model",
        "chatbot_openai_base_url",
        "chatbot_ollama_base_url",
        "chatbot_ollama_model",
        "chatbot_grok_api_key",
        "chatbot_grok_model",
        "chatbot_perplexity_api_key",
        "chatbot_perplexity_model",
        "chatbot_perplexity_base_url"
      ],
      "settings_count": 21
    },
    {
      "id": "ticket_system",
      "name": "Ticket System",
      "description": "Ticket system configuration settings",
      "icon": "ticket",
      "setting_keys": [
        "ticket_system_enabled",
        "ticket_system_allow_attachments",
        "ticket_system_max_open_tickets"
      ],
      "settings_count": 3
    },
    {
      "id": "seo",
      "name": "SEO",
      "description": "Search Engine Optimization settings",
      "icon": "search",
      "setting_keys": [
        "app_seo_title",
        "app_seo_description",
        "app_seo_keywords",
        "app_seo_indexing"
      ],
      "settings_count": 4
    },
    {
      "id": "pwa",
      "name": "PWA",
      "description": "Progressive Web App settings",
      "icon": "smartphone",
      "setting_keys": [
        "app_pwa_enabled",
        "app_pwa_short_name",
        "app_pwa_description",
        "app_pwa_theme_color",
        "app_pwa_bg_color"
      ],
      "settings_count": 5
    },
    {
      "id": "other",
      "name": "Other",
      "description": "Other configuration settings",
      "icon": "settings",
      "setting_keys": [
        "app_developer_mode",
        "custom_js",
        "custom_css",
        "cache_driver"
      ],
      "settings_count": 4
    }
  ],
  "settings": [
    {
      "key": "abuseipdb_api_key",
      "constant": "ABUSEIPDB_API_KEY",
      "description": "AbuseIPDB API key (stored encrypted). Required when AbuseIPDB is enabled.",
      "type": "password",
      "required": false,
      "placeholder": "Enter API key to change",
      "validation": "string|max:255",
      "options": [],
      "category": "security",
      "sensitive": true
    },
    {
      "key": "abuseipdb_check_on_register",
      "constant": "ABUSEIPDB_CHECK_ON_REGISTER",
      "description": "Check a registering user\\",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "abuseipdb_enabled",
      "constant": "ABUSEIPDB_ENABLED",
      "description": "Enable AbuseIPDB integration for registration checks, user IP scanning, and optional reporting when banning users. Get an API key at https://www.abuseipdb.com/.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "abuseipdb_max_age_days",
      "constant": "ABUSEIPDB_MAX_AGE_DAYS",
      "description": "Only consider AbuseIPDB reports from the last N days when checking an IP (1-365).",
      "type": "number",
      "required": true,
      "placeholder": "90",
      "validation": "required|integer|min:1|max:365",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "abuseipdb_min_confidence_score",
      "constant": "ABUSEIPDB_MIN_CONFIDENCE_SCORE",
      "description": "Minimum AbuseIPDB abuse confidence score (0-100) to treat an IP as reported. AbuseIPDB recommends 75-100 for blocking.",
      "type": "number",
      "required": true,
      "placeholder": "75",
      "validation": "required|integer|min:0|max:100",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "abuseipdb_register_action",
      "constant": "ABUSEIPDB_REGISTER_ACTION",
      "description": "What to do when a registering IP meets the confidence score threshold.",
      "type": "select",
      "required": true,
      "placeholder": "block",
      "validation": "required|string|max:32",
      "options": [
        "block",
        "log",
        "auto_ban"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "app_accent_color_default",
      "constant": "APP_ACCENT_COLOR_DEFAULT",
      "description": "Default accent color for the UI (purple, blue, green, red, orange, pink, teal, yellow, white, violet, cyan, lime, amber, rose, slate)",
      "type": "select",
      "required": true,
      "placeholder": "purple",
      "validation": "required|string|max:255",
      "options": [
        "purple",
        "blue",
        "green",
        "red",
        "orange",
        "pink",
        "teal",
        "yellow",
        "white",
        "violet",
        "cyan",
        "lime",
        "amber",
        "rose",
        "slate"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_accent_color_lock",
      "constant": "APP_ACCENT_COLOR_LOCK",
      "description": "Force the configured accent color for all users (disables per-user accent selection)",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_backdrop_blur_default",
      "constant": "APP_BACKDROP_BLUR_DEFAULT",
      "description": "Default backdrop blur in pixels (0, 4, 8, 12, 16, 24)",
      "type": "number",
      "required": true,
      "placeholder": "0",
      "validation": "required|integer|min:0|max:24",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_backdrop_blur_lock",
      "constant": "APP_BACKDROP_BLUR_LOCK",
      "description": "Force the configured backdrop blur value for all users",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_backdrop_darken_default",
      "constant": "APP_BACKDROP_DARKEN_DEFAULT",
      "description": "Default backdrop darken overlay in percent (0–100)",
      "type": "number",
      "required": true,
      "placeholder": "0",
      "validation": "required|integer|min:0|max:100",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_backdrop_darken_lock",
      "constant": "APP_BACKDROP_DARKEN_LOCK",
      "description": "Force the configured backdrop darken value for all users",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_background_image_fit_default",
      "constant": "APP_BACKGROUND_IMAGE_FIT_DEFAULT",
      "description": "Default background image fit (cover, contain, fill)",
      "type": "select",
      "required": true,
      "placeholder": "cover",
      "validation": "required|string|max:255",
      "options": [
        "cover",
        "contain",
        "fill"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_background_image_fit_lock",
      "constant": "APP_BACKGROUND_IMAGE_FIT_LOCK",
      "description": "Force the configured background image fit for all users",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_background_image_url",
      "constant": "APP_BACKGROUND_IMAGE_URL",
      "description": "Default background image URL for all users (leave empty to use theme defaults)",
      "type": "image",
      "required": false,
      "placeholder": "https://example.com/background.jpg",
      "validation": "string|max:2048",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_background_lock",
      "constant": "APP_BACKGROUND_LOCK",
      "description": "Force the configured background image URL for all users (disables per-user background overrides)",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_background_type_default",
      "constant": "APP_BACKGROUND_TYPE_DEFAULT",
      "description": "Default background type (aurora, gradient, solid, image, pattern) used when no user preference is stored",
      "type": "select",
      "required": true,
      "placeholder": "pattern",
      "validation": "required|string|max:255",
      "options": [
        "aurora",
        "gradient",
        "solid",
        "image",
        "pattern"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_background_type_lock",
      "constant": "APP_BACKGROUND_TYPE_LOCK",
      "description": "Force the configured background type for all users (disables per-user background mode selection)",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_developer_mode",
      "constant": "APP_DEVELOPER_MODE",
      "description": "Is the application in developer mode?",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_locale_default",
      "constant": "APP_LOCALE_DEFAULT",
      "description": "Default panel language for users who have not chosen one (must match an installed translation code, e.g. en, de, fr)",
      "type": "select",
      "required": true,
      "placeholder": "en",
      "validation": "required|string|max:16",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_locale_lock",
      "constant": "APP_LOCALE_LOCK",
      "description": "Force the configured language for all users (disables per-user language selection)",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_logo_dark",
      "constant": "APP_LOGO_DARK",
      "description": "The logo of the application (sidebar & UI, dark mode)",
      "type": "image",
      "required": true,
      "placeholder": "https://github.com/featherpanel-com.png",
      "validation": "required|string|max:2048",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_logo_white",
      "constant": "APP_LOGO_WHITE",
      "description": "The logo of the application (sidebar & UI, light mode)",
      "type": "image",
      "required": true,
      "placeholder": "https://github.com/mythicalltd.png",
      "validation": "required|string|max:2048",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_name",
      "constant": "APP_NAME",
      "description": "The name of the application (shown in the sidebar and browser title)",
      "type": "text",
      "required": true,
      "placeholder": "FeatherPanel",
      "validation": "required|string|max:255",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_pwa_bg_color",
      "constant": "APP_PWA_BG_COLOR",
      "description": "Background color for the PWA splash screen",
      "type": "text",
      "required": true,
      "placeholder": "#ffffff",
      "validation": "required|string|max:7",
      "options": [],
      "category": "pwa",
      "sensitive": false
    },
    {
      "key": "app_pwa_description",
      "constant": "APP_PWA_DESCRIPTION",
      "description": "PWA description (falls back to SEO description, then app name)",
      "type": "textarea",
      "required": false,
      "placeholder": "Manage your servers on the go.",
      "validation": "nullable|string|max:500",
      "options": [],
      "category": "pwa",
      "sensitive": false
    },
    {
      "key": "app_pwa_enabled",
      "constant": "APP_PWA_ENABLED",
      "description": "Allow users to install the panel as an app on desktop, Android, and iOS",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "pwa",
      "sensitive": false
    },
    {
      "key": "app_pwa_short_name",
      "constant": "APP_PWA_SHORT_NAME",
      "description": "Short name under the home-screen icon (falls back to app name)",
      "type": "text",
      "required": false,
      "placeholder": "My Panel",
      "validation": "nullable|string|max:12",
      "options": [],
      "category": "pwa",
      "sensitive": false
    },
    {
      "key": "app_pwa_theme_color",
      "constant": "APP_PWA_THEME_COLOR",
      "description": "Theme color for the PWA browser bar",
      "type": "text",
      "required": true,
      "placeholder": "#000000",
      "validation": "required|string|max:7",
      "options": [],
      "category": "pwa",
      "sensitive": false
    },
    {
      "key": "app_seo_description",
      "constant": "APP_SEO_DESCRIPTION",
      "description": "The default description for the application pages",
      "type": "textarea",
      "required": true,
      "placeholder": "A powerful game server management panel.",
      "validation": "required|string|max:500",
      "options": [],
      "category": "seo",
      "sensitive": false
    },
    {
      "key": "app_seo_indexing",
      "constant": "APP_SEO_INDEXING",
      "description": "Allow search engines to index this panel (when disabled, we send noindex,nofollow).",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "seo",
      "sensitive": false
    },
    {
      "key": "app_seo_keywords",
      "constant": "APP_SEO_KEYWORDS",
      "description": "Comma-separated keywords for SEO",
      "type": "textarea",
      "required": true,
      "placeholder": "game, server, management, panel, hosting",
      "validation": "required|string|max:500",
      "options": [],
      "category": "seo",
      "sensitive": false
    },
    {
      "key": "app_seo_title",
      "constant": "APP_SEO_TITLE",
      "description": "The default title for the application pages",
      "type": "text",
      "required": true,
      "placeholder": "FeatherPanel",
      "validation": "required|string|max:255",
      "options": [],
      "category": "seo",
      "sensitive": false
    },
    {
      "key": "app_server_spell_banner_background",
      "constant": "APP_SERVER_SPELL_BANNER_BACKGROUND",
      "description": "Use the spell/egg banner as the full panel background on server pages (same layer as the dashboard theme background): off, blend (soft over current theme), or replace (spell image instead of theme background)",
      "type": "select",
      "required": true,
      "placeholder": "off",
      "validation": "required|string|max:32",
      "options": [
        "off",
        "blend",
        "replace"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_server_spell_banner_style",
      "constant": "APP_SERVER_SPELL_BANNER_STYLE",
      "description": "How spell/egg banners appear on the server console header: off, cover (side art), strip (top bar), or hero (image behind header controls)",
      "type": "select",
      "required": true,
      "placeholder": "off",
      "validation": "required|string|max:32",
      "options": [
        "off",
        "cover",
        "strip",
        "hero"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_sso_redirect_path",
      "constant": "APP_SSO_REDIRECT_PATH",
      "description": "Path used by generated SSO login links after authentication (must start with /, e.g. /dashboard)",
      "type": "text",
      "required": true,
      "placeholder": "/dashboard",
      "validation": "required|string|max:255",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_sso_token_lifetime_minutes",
      "constant": "APP_SSO_TOKEN_LIFETIME_MINUTES",
      "description": "Default lifetime in minutes for admin-generated SSO login tokens (1–1440)",
      "type": "number",
      "required": true,
      "placeholder": "5",
      "validation": "required|integer|min:1|max:1440",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_support_url",
      "constant": "APP_SUPPORT_URL",
      "description": "The support URL of the application",
      "type": "text",
      "required": true,
      "placeholder": "https://mythical.systems",
      "validation": "required|string|max:255",
      "options": [],
      "category": "links",
      "sensitive": false
    },
    {
      "key": "app_theme_default",
      "constant": "APP_THEME_DEFAULT",
      "description": "Default theme (light or dark)",
      "type": "select",
      "required": true,
      "placeholder": "dark",
      "validation": "required|string|max:255",
      "options": [
        "light",
        "dark"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_theme_lock",
      "constant": "APP_THEME_LOCK",
      "description": "Force the configured theme (light/dark) for all users (disables per-user theme toggle)",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_theme_pack_default",
      "constant": "APP_THEME_PACK_DEFAULT",
      "description": "Default plugin theme pack id (default or pluginId:themeId)",
      "type": "text",
      "required": false,
      "placeholder": "default",
      "validation": "nullable|string|max:255",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_theme_pack_lock",
      "constant": "APP_THEME_PACK_LOCK",
      "description": "Force the configured theme pack for all users",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_timezone",
      "constant": "APP_TIMEZONE",
      "description": "The timezone of the application",
      "type": "select",
      "required": true,
      "placeholder": "UTC",
      "validation": "required|string|max:255",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_ui_pack_default",
      "constant": "APP_UI_PACK_DEFAULT",
      "description": "Active UI pack id for layout takeovers (empty = none, or pluginId:packId)",
      "type": "text",
      "required": false,
      "placeholder": "",
      "validation": "nullable|string|max:255",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_ui_pack_lock",
      "constant": "APP_UI_PACK_LOCK",
      "description": "Force the configured UI pack for all users",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "app_url",
      "constant": "APP_URL",
      "description": "The URL of the application",
      "type": "text",
      "required": true,
      "placeholder": "https://featherpanel.mythical.systems",
      "validation": "required|string|max:255",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "auth_aside_image_url",
      "constant": "AUTH_ASIDE_IMAGE_URL",
      "description": "Optional hero image for the auth marketing panel (shown behind brand/QR). Leave empty for gradient atmosphere only.",
      "type": "image",
      "required": false,
      "placeholder": "https://example.com/auth-hero.jpg",
      "validation": "nullable|string|max:2048",
      "options": [],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_aside_title",
      "constant": "AUTH_ASIDE_TITLE",
      "description": "Optional bold heading under the brand name on the marketing panel (e.g. “Welcome to our panel”). Leave empty to hide.",
      "type": "text",
      "required": false,
      "placeholder": "Welcome",
      "validation": "nullable|string|max:120",
      "options": [],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_footer_style",
      "constant": "AUTH_FOOTER_STYLE",
      "description": "Auth footer under the form: full (links + powered-by), minimal (links only), or hidden.",
      "type": "select",
      "required": true,
      "placeholder": "full",
      "validation": "required|string|max:32",
      "options": [
        "full",
        "minimal",
        "hidden"
      ],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_form_density",
      "constant": "AUTH_FORM_DENSITY",
      "description": "Vertical spacing on auth forms: comfortable (roomy), compact (default), or dense (minimal scroll).",
      "type": "select",
      "required": true,
      "placeholder": "compact",
      "validation": "required|string|max:32",
      "options": [
        "comfortable",
        "compact",
        "dense"
      ],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_login_headline",
      "constant": "AUTH_LOGIN_HEADLINE",
      "description": "Override the login form title (default: Welcome back). Leave empty for the translated default.",
      "type": "text",
      "required": false,
      "placeholder": "Welcome back",
      "validation": "nullable|string|max:120",
      "options": [],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_login_subheadline",
      "constant": "AUTH_LOGIN_SUBHEADLINE",
      "description": "Override the login form subtitle. Leave empty for the translated default.",
      "type": "text",
      "required": false,
      "placeholder": "Enter your credentials to access your account",
      "validation": "nullable|string|max:240",
      "options": [],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_register_headline",
      "constant": "AUTH_REGISTER_HEADLINE",
      "description": "Override the register page title. Leave empty for the translated default.",
      "type": "text",
      "required": false,
      "placeholder": "Create an account",
      "validation": "nullable|string|max:120",
      "options": [],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_register_subheadline",
      "constant": "AUTH_REGISTER_SUBHEADLINE",
      "description": "Override the register page subtitle. Leave empty for the translated default.",
      "type": "text",
      "required": false,
      "placeholder": "Get started with us today",
      "validation": "nullable|string|max:240",
      "options": [],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_secondary_layout",
      "constant": "AUTH_SECONDARY_LAYOUT",
      "description": "How alternate login methods appear: chips (compact wrap), stack (full-width rows), or collapsed (hidden behind “More ways to sign in”).",
      "type": "select",
      "required": true,
      "placeholder": "chips",
      "validation": "required|string|max:32",
      "options": [
        "chips",
        "stack",
        "collapsed"
      ],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_shell_tagline",
      "constant": "AUTH_SHELL_TAGLINE",
      "description": "Short marketing line under the brand on the auth left panel. This is auth-only copy — it does NOT use SEO description. Leave empty for the default translated tagline.",
      "type": "textarea",
      "required": false,
      "placeholder": "Manage your game servers from anywhere.",
      "validation": "nullable|string|max:500",
      "options": [],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_show_marketing_panel",
      "constant": "AUTH_SHOW_MARKETING_PANEL",
      "description": "Show the full-bleed left marketing column on large screens (brand, tagline, QR). When false, auth pages use a centered form column only.",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:16",
      "options": [
        "true",
        "false"
      ],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_show_qr_login",
      "constant": "AUTH_SHOW_QR_LOGIN",
      "description": "Enable Discord-style QR code login (phone already signed in approves the desktop session).",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:16",
      "options": [
        "true",
        "false"
      ],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_show_theme_customizer",
      "constant": "AUTH_SHOW_THEME_CUSTOMIZER",
      "description": "Show the theme/appearance button on auth pages (top-right).",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:16",
      "options": [
        "true",
        "false"
      ],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_sso_headline",
      "constant": "AUTH_SSO_HEADLINE",
      "description": "Headline when Discord/OIDC is the primary login panel (third-party SSO portal). Leave empty for the default “Continue with SSO” style copy.",
      "type": "text",
      "required": false,
      "placeholder": "Sign in with your organization",
      "validation": "nullable|string|max:120",
      "options": [],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "auth_sso_subheadline",
      "constant": "AUTH_SSO_SUBHEADLINE",
      "description": "Supporting text under the SSO portal headline. Leave empty for the translated default.",
      "type": "text",
      "required": false,
      "placeholder": "Use your company or Discord account to continue.",
      "validation": "nullable|string|max:240",
      "options": [],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "avatar_custom_url",
      "constant": "AVATAR_CUSTOM_URL",
      "description": "Custom avatar URL template (only used when avatar provider is custom). Placeholders: {email}, {username}, {name}, {hash}, {app_url}",
      "type": "text",
      "required": false,
      "placeholder": "https://example.com/avatar/{hash}",
      "validation": "nullable|string|max:2048",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "avatar_provider",
      "constant": "AVATAR_PROVIDER",
      "description": "Default avatar provider for users without a custom profile picture",
      "type": "select",
      "required": true,
      "placeholder": "gravatar",
      "validation": "required|string|max:255",
      "options": [
        "gravatar",
        "panel_logo",
        "ui_avatars",
        "robohash",
        "dicebear",
        "custom"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "cache_driver",
      "constant": "CACHE_DRIVER",
      "description": "Cache driver to use (file, redis) (redis is recommended for production) but redis can be unstable in some cases",
      "type": "select",
      "required": true,
      "placeholder": "file",
      "validation": "required|string|max:255",
      "options": [
        "file",
        "redis"
      ],
      "category": "other",
      "sensitive": false
    },
    {
      "key": "captcha_provider",
      "constant": "CAPTCHA_PROVIDER",
      "description": "Captcha service provider (Turnstile, hCaptcha, Google reCAPTCHA, Friendly Captcha, or reForge Captcha)",
      "type": "select",
      "required": true,
      "placeholder": "turnstile",
      "validation": "required|string|max:255",
      "options": [
        "turnstile",
        "hcaptcha",
        "recaptcha",
        "friendlycaptcha",
        "reforge"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "chatbot_ai_provider",
      "constant": "CHATBOT_AI_PROVIDER",
      "description": "AI provider for the chatbot",
      "type": "select",
      "required": true,
      "placeholder": "basic",
      "validation": "required|string|max:255",
      "options": [
        "basic",
        "google_gemini",
        "openrouter",
        "openai",
        "ollama",
        "grok",
        "perplexity"
      ],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_enabled",
      "constant": "CHATBOT_ENABLED",
      "description": "Enable the AI chatbot",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_google_ai_api_key",
      "constant": "CHATBOT_GOOGLE_AI_API_KEY",
      "description": "Google AI Studio API key for Gemini",
      "type": "password",
      "required": false,
      "placeholder": "Enter API key to change",
      "validation": "",
      "options": [],
      "category": "chatbot",
      "sensitive": true
    },
    {
      "key": "chatbot_google_ai_model",
      "constant": "CHATBOT_GOOGLE_AI_MODEL",
      "description": "Google Gemini model to use (e.g., gemini-2.5-flash, gemini-2.5-pro)",
      "type": "text",
      "required": false,
      "placeholder": "gemini-2.5-flash",
      "validation": "string|max:255",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_grok_api_key",
      "constant": "CHATBOT_GROK_API_KEY",
      "description": "xAI (Grok) API key",
      "type": "password",
      "required": false,
      "placeholder": "xai-...",
      "validation": "string|max:255",
      "options": [],
      "category": "chatbot",
      "sensitive": true
    },
    {
      "key": "chatbot_grok_model",
      "constant": "CHATBOT_GROK_MODEL",
      "description": "xAI (Grok) model to use (e.g., grok-2-1212, grok-beta, grok-vision-beta)",
      "type": "text",
      "required": false,
      "placeholder": "grok-2-1212",
      "validation": "string|max:255",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_max_history",
      "constant": "CHATBOT_MAX_HISTORY",
      "description": "Maximum number of previous messages to include in context",
      "type": "number",
      "required": false,
      "placeholder": "10",
      "validation": "integer|min:1|max:50",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_max_tokens",
      "constant": "CHATBOT_MAX_TOKENS",
      "description": "Maximum number of tokens in AI responses",
      "type": "number",
      "required": false,
      "placeholder": "2048",
      "validation": "integer|min:1|max:8192",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_ollama_base_url",
      "constant": "CHATBOT_OLLAMA_BASE_URL",
      "description": "Ollama server base URL (e.g., http://localhost:11434)",
      "type": "text",
      "required": false,
      "placeholder": "http://localhost:11434",
      "validation": "string|max:255",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_ollama_model",
      "constant": "CHATBOT_OLLAMA_MODEL",
      "description": "Ollama model to use (e.g., llama3.2, mistral, codellama)",
      "type": "text",
      "required": false,
      "placeholder": "llama3.2",
      "validation": "string|max:255",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_openai_api_key",
      "constant": "CHATBOT_OPENAI_API_KEY",
      "description": "OpenAI API key",
      "type": "password",
      "required": false,
      "placeholder": "Enter API key to change",
      "validation": "",
      "options": [],
      "category": "chatbot",
      "sensitive": true
    },
    {
      "key": "chatbot_openai_base_url",
      "constant": "CHATBOT_OPENAI_BASE_URL",
      "description": "OpenAI base URL (e.g., https://api.openai.com)",
      "type": "text",
      "required": false,
      "placeholder": "https://api.openai.com",
      "validation": "string|max:255",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_openai_model",
      "constant": "CHATBOT_OPENAI_MODEL",
      "description": "OpenAI model to use (e.g., gpt-4o-mini, gpt-4o, gpt-3.5-turbo)",
      "type": "text",
      "required": false,
      "placeholder": "gpt-4o-mini",
      "validation": "string|max:255",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_openrouter_api_key",
      "constant": "CHATBOT_OPENROUTER_API_KEY",
      "description": "OpenRouter API key",
      "type": "password",
      "required": false,
      "placeholder": "Enter API key to change",
      "validation": "",
      "options": [],
      "category": "chatbot",
      "sensitive": true
    },
    {
      "key": "chatbot_openrouter_model",
      "constant": "CHATBOT_OPENROUTER_MODEL",
      "description": "OpenRouter model to use (e.g., openai/gpt-4o-mini, anthropic/claude-3-haiku)",
      "type": "text",
      "required": false,
      "placeholder": "openai/gpt-4o-mini",
      "validation": "string|max:255",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_perplexity_api_key",
      "constant": "CHATBOT_PERPLEXITY_API_KEY",
      "description": "Perplexity API key",
      "type": "password",
      "required": false,
      "placeholder": "Enter API key to change",
      "validation": "string|max:255",
      "options": [],
      "category": "chatbot",
      "sensitive": true
    },
    {
      "key": "chatbot_perplexity_base_url",
      "constant": "CHATBOT_PERPLEXITY_BASE_URL",
      "description": "Perplexity base URL (e.g., https://api.perplexity.ai)",
      "type": "text",
      "required": false,
      "placeholder": "https://api.perplexity.ai",
      "validation": "string|max:255",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_perplexity_model",
      "constant": "CHATBOT_PERPLEXITY_MODEL",
      "description": "Perplexity model to use (e.g., sonar-pro, sonar-small-chat)",
      "type": "text",
      "required": false,
      "placeholder": "sonar-pro",
      "validation": "string|max:255",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_system_prompt",
      "constant": "CHATBOT_SYSTEM_PROMPT",
      "description": "System prompt to prepend to all messages (optional)",
      "type": "textarea",
      "required": false,
      "placeholder": "You are a helpful assistant for FeatherPanel...",
      "validation": "string|max:1000",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_temperature",
      "constant": "CHATBOT_TEMPERATURE",
      "description": "Temperature for AI responses (0.0-1.0). Lower = more focused, Higher = more creative",
      "type": "number",
      "required": false,
      "placeholder": "0.7",
      "validation": "numeric|min:0|max:1",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "chatbot_user_prompt",
      "constant": "CHATBOT_USER_PROMPT",
      "description": "User context prompt to append to all messages (optional)",
      "type": "textarea",
      "required": false,
      "placeholder": "User is an admin with full access...",
      "validation": "string|max:1000",
      "options": [],
      "category": "chatbot",
      "sensitive": false
    },
    {
      "key": "custom_css",
      "constant": "CUSTOM_CSS",
      "description": "Custom CSS to inject into the page",
      "type": "textarea",
      "required": false,
      "placeholder": "/* dummy css - does nothing */",
      "validation": "string",
      "options": [],
      "category": "other",
      "sensitive": false
    },
    {
      "key": "custom_js",
      "constant": "CUSTOM_JS",
      "description": "Custom JavaScript to inject into the page",
      "type": "textarea",
      "required": false,
      "placeholder": "// dummy script - does nothing",
      "validation": "string",
      "options": [],
      "category": "other",
      "sensitive": false
    },
    {
      "key": "discord_oauth_client_id",
      "constant": "DISCORD_OAUTH_CLIENT_ID",
      "description": "The Discord OAuth client ID of the application",
      "type": "text",
      "required": false,
      "placeholder": "",
      "validation": "required|string|max:255",
      "options": [],
      "category": "oauth",
      "sensitive": false
    },
    {
      "key": "discord_oauth_client_secret",
      "constant": "DISCORD_OAUTH_CLIENT_SECRET",
      "description": "The Discord OAuth client secret of the application",
      "type": "password",
      "required": false,
      "placeholder": "Enter client secret to change",
      "validation": "",
      "options": [],
      "category": "oauth",
      "sensitive": true
    },
    {
      "key": "discord_oauth_enabled",
      "constant": "DISCORD_OAUTH_ENABLED",
      "description": "The Discord OAuth enabled of the application Callback URL: ",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "oauth",
      "sensitive": false
    },
    {
      "key": "discord_url",
      "constant": "DISCORD_URL",
      "description": "Discord invite or community server URL",
      "type": "text",
      "required": false,
      "placeholder": "https://discord.gg/example",
      "validation": "string|max:255",
      "options": [],
      "category": "links",
      "sensitive": false
    },
    {
      "key": "email_domain_blocking_enabled",
      "constant": "EMAIL_DOMAIN_BLOCKING_ENABLED",
      "description": "When enabled, registration and email changes are rejected if the address domain matches a row in Admin → Blocked email domains (suffix match). Manage the list on that page.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "email_login_enabled",
      "constant": "EMAIL_LOGIN_ENABLED",
      "description": "Enable passwordless email login with 6-digit OTP codes sent to user email addresses (requires SMTP to be configured)",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "file_trash_enabled",
      "constant": "FILE_TRASH_ENABLED",
      "description": "Enable a trash bin for server file deletions. Deleted files are moved to trash instead of being permanently removed, and users can restore or empty trash from the file manager.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "file_trash_max_size_mb",
      "constant": "FILE_TRASH_MAX_SIZE_MB",
      "description": "Maximum total size of trashed files per server, in megabytes. When exceeded, the oldest trashed items are permanently deleted. Use 0 for no size limit.",
      "type": "number",
      "required": true,
      "placeholder": "512",
      "validation": "required|integer|min:0",
      "options": [],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "file_trash_retention_days",
      "constant": "FILE_TRASH_RETENTION_DAYS",
      "description": "Automatically purge trashed files older than this many days. Use 0 to keep items until manually deleted or the size limit is reached.",
      "type": "number",
      "required": true,
      "placeholder": "30",
      "validation": "required|integer|min:0",
      "options": [],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "friendly_captcha_secret_key",
      "constant": "FRIENDLY_CAPTCHA_SECRET_KEY",
      "description": "The Friendly Captcha secret key of the application",
      "type": "password",
      "required": false,
      "placeholder": "Enter secret key to change",
      "validation": "string|max:255",
      "options": [],
      "category": "security",
      "sensitive": true
    },
    {
      "key": "friendly_captcha_site_key",
      "constant": "FRIENDLY_CAPTCHA_SITE_KEY",
      "description": "The Friendly Captcha site key of the application",
      "type": "text",
      "required": false,
      "placeholder": "",
      "validation": "string|max:255",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "hcaptcha_secret_key",
      "constant": "HCAPTCHA_SECRET_KEY",
      "description": "The hCaptcha secret key of the application",
      "type": "password",
      "required": false,
      "placeholder": "Enter secret key to change",
      "validation": "string|max:255",
      "options": [],
      "category": "security",
      "sensitive": true
    },
    {
      "key": "hcaptcha_site_key",
      "constant": "HCAPTCHA_SITE_KEY",
      "description": "The hCaptcha site key of the application",
      "type": "text",
      "required": false,
      "placeholder": "",
      "validation": "string|max:255",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "knowledgebase_enabled",
      "constant": "KNOWLEDGEBASE_ENABLED",
      "description": "Enable the knowledgebase feature for users",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "knowledgebase",
      "sensitive": false
    },
    {
      "key": "knowledgebase_public_enabled",
      "constant": "KNOWLEDGEBASE_PUBLIC_ENABLED",
      "description": "Allow unauthenticated users to access /knowledgebase and /api/knowledgebase/* publicly",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "knowledgebase",
      "sensitive": false
    },
    {
      "key": "knowledgebase_show_articles",
      "constant": "KNOWLEDGEBASE_SHOW_ARTICLES",
      "description": "Show article listings in knowledgebase",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "knowledgebase",
      "sensitive": false
    },
    {
      "key": "knowledgebase_show_attachments",
      "constant": "KNOWLEDGEBASE_SHOW_ATTACHMENTS",
      "description": "Show downloadable attachments in articles",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "knowledgebase",
      "sensitive": false
    },
    {
      "key": "knowledgebase_show_categories",
      "constant": "KNOWLEDGEBASE_SHOW_CATEGORIES",
      "description": "Show category listings in knowledgebase",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "knowledgebase",
      "sensitive": false
    },
    {
      "key": "knowledgebase_show_tags",
      "constant": "KNOWLEDGEBASE_SHOW_TAGS",
      "description": "Show article tags in knowledgebase",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "knowledgebase",
      "sensitive": false
    },
    {
      "key": "legal_privacy",
      "constant": "LEGAL_PRIVACY",
      "description": "The legal privacy of the application",
      "type": "text",
      "required": true,
      "placeholder": "/privacy",
      "validation": "required|string|max:255",
      "options": [],
      "category": "links",
      "sensitive": false
    },
    {
      "key": "legal_tos",
      "constant": "LEGAL_TOS",
      "description": "The legal TOS of the application",
      "type": "text",
      "required": true,
      "placeholder": "/tos",
      "validation": "required|string|max:255",
      "options": [],
      "category": "links",
      "sensitive": false
    },
    {
      "key": "linkedin_url",
      "constant": "LINKEDIN_URL",
      "description": "LinkedIn profile or page URL",
      "type": "text",
      "required": false,
      "placeholder": "https://linkedin.com/company/example",
      "validation": "string|max:255",
      "options": [],
      "category": "links",
      "sensitive": false
    },
    {
      "key": "login_default_method",
      "constant": "LOGIN_DEFAULT_METHOD",
      "description": "Default sign-in panel on the login page (local, ldap, email_code, discord, or oidc). Falls back to the first available method if the choice is hidden or unavailable.",
      "type": "select",
      "required": true,
      "placeholder": "local",
      "validation": "required|string|max:64",
      "options": [
        "local",
        "ldap",
        "email_code",
        "discord",
        "oidc"
      ],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "login_hidden_methods",
      "constant": "LOGIN_HIDDEN_METHODS",
      "description": "Comma-separated login method ids to hide on the login page (e.g. passkey, local, ldap, email_code, discord, oidc). Leave empty to show all configured methods.",
      "type": "text",
      "required": false,
      "placeholder": "passkey",
      "validation": "nullable|string|max:255",
      "options": [],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "login_methods_order",
      "constant": "LOGIN_METHODS_ORDER",
      "description": "Comma-separated order of login methods on the page. Valid ids: local, passkey, ldap, email_code, discord, oidc",
      "type": "text",
      "required": true,
      "placeholder": "local,passkey,ldap,email_code,discord,oidc",
      "validation": "required|string|max:255",
      "options": [],
      "category": "auth_page",
      "sensitive": false
    },
    {
      "key": "recaptcha_secret_key",
      "constant": "RECAPTCHA_SECRET_KEY",
      "description": "The reCAPTCHA secret key of the application",
      "type": "password",
      "required": false,
      "placeholder": "Enter secret key to change",
      "validation": "string|max:255",
      "options": [],
      "category": "security",
      "sensitive": true
    },
    {
      "key": "recaptcha_site_key",
      "constant": "RECAPTCHA_SITE_KEY",
      "description": "The reCAPTCHA site key of the application",
      "type": "text",
      "required": false,
      "placeholder": "",
      "validation": "string|max:255",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "recaptcha_v3_action",
      "constant": "RECAPTCHA_V3_ACTION",
      "description": "reCAPTCHA v3 action name (must match what the frontend sends). Use letters, numbers, underscores, and slashes only.",
      "type": "text",
      "required": true,
      "placeholder": "submit",
      "validation": "required|string|max:100",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "recaptcha_v3_min_score",
      "constant": "RECAPTCHA_V3_MIN_SCORE",
      "description": "Minimum v3 score (0.0–1.0). Higher is stricter. Ignored when version is v2.",
      "type": "text",
      "required": true,
      "placeholder": "0.5",
      "validation": "required|string|max:10",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "recaptcha_version",
      "constant": "RECAPTCHA_VERSION",
      "description": "Use reCAPTCHA v2 (checkbox) or v3 (invisible score). Keys must match the version in Google Admin.",
      "type": "select",
      "required": true,
      "placeholder": "v2",
      "validation": "required|string|max:10",
      "options": [
        "v2",
        "v3"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "reforge_captcha_lang",
      "constant": "REFORGE_CAPTCHA_LANG",
      "description": "Optional reForge Captcha widget UI language (e.g. en, nl, de). Leave empty for default.",
      "type": "text",
      "required": false,
      "placeholder": "en",
      "validation": "string|max:16",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "reforge_captcha_min_score",
      "constant": "REFORGE_CAPTCHA_MIN_SCORE",
      "description": "Minimum reForge Captcha verify score (0.0–1.0) when the verify API returns a score (stricter = higher)",
      "type": "text",
      "required": true,
      "placeholder": "0.5",
      "validation": "required|string|max:10",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "reforge_captcha_secret_key",
      "constant": "REFORGE_CAPTCHA_SECRET_KEY",
      "description": "reForge Captcha secret key (server-side only; never expose to the browser)",
      "type": "password",
      "required": false,
      "placeholder": "Enter secret key to change",
      "validation": "string|max:255",
      "options": [],
      "category": "security",
      "sensitive": true
    },
    {
      "key": "reforge_captcha_site_key",
      "constant": "REFORGE_CAPTCHA_SITE_KEY",
      "description": "reForge Captcha public site key (from dashboard → Sites)",
      "type": "text",
      "required": false,
      "placeholder": "site_...",
      "validation": "string|max:255",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "reforge_captcha_size",
      "constant": "REFORGE_CAPTCHA_SIZE",
      "description": "reForge Captcha widget size",
      "type": "select",
      "required": true,
      "placeholder": "normal",
      "validation": "required|string|max:16",
      "options": [
        "normal",
        "compact"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "reforge_captcha_theme",
      "constant": "REFORGE_CAPTCHA_THEME",
      "description": "reForge Captcha widget colour theme",
      "type": "select",
      "required": true,
      "placeholder": "auto",
      "validation": "required|string|max:16",
      "options": [
        "auto",
        "dark",
        "light"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "reforge_captcha_widget_type",
      "constant": "REFORGE_CAPTCHA_WIDGET_TYPE",
      "description": "reForge Captcha widget challenge type (checkbox or image)",
      "type": "select",
      "required": true,
      "placeholder": "checkbox",
      "validation": "required|string|max:32",
      "options": [
        "checkbox",
        "image"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "registration_device_limit_enabled",
      "constant": "REGISTRATION_DEVICE_LIMIT_ENABLED",
      "description": "Block new registrations when a browser/device already has the maximum number of panel accounts.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "registration_device_max_accounts",
      "constant": "REGISTRATION_DEVICE_MAX_ACCOUNTS",
      "description": "Maximum number of accounts allowed per browser/device before registration is blocked (main account is the oldest account seen on that device).",
      "type": "number",
      "required": true,
      "placeholder": "1",
      "validation": "required|integer|min:1|max:10",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "registration_enabled",
      "constant": "REGISTRATION_ENABLED",
      "description": "Can users register themselves?",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "registration_require_email_verification",
      "constant": "REGISTRATION_REQUIRE_EMAIL_VERIFICATION",
      "description": "Require users to verify their email before they can log in after registration.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "require_two_fa_admins",
      "constant": "REQUIRE_TWO_FA_ADMINS",
      "description": "Require two-factor authentication for admins",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "server_allow_allocation_select",
      "constant": "SERVER_ALLOW_ALLOCATION_SELECT",
      "description": "Allow users to select which allocation to assign when auto-allocating",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_cross_realm_spell_change",
      "constant": "SERVER_ALLOW_CROSS_REALM_SPELL_CHANGE",
      "description": "Allow users to change server spells/eggs across different realms. When disabled, users can only select spells from the same realm as their server.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_custom_docker_image",
      "constant": "SERVER_ALLOW_CUSTOM_DOCKER_IMAGE",
      "description": "Allow users to enter a custom Docker image on the startup page. When disabled, users may only select images configured on the spell.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_egg_change",
      "constant": "SERVER_ALLOW_EGG_CHANGE",
      "description": "Allow users to change the server spells/eggs",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_schedules",
      "constant": "SERVER_ALLOW_SCHEDULES",
      "description": "Allow users to create and manage schedules for their servers",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_startup_change",
      "constant": "SERVER_ALLOW_STARTUP_CHANGE",
      "description": "Allow users to change the server startup",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_subusers",
      "constant": "SERVER_ALLOW_SUBUSERS",
      "description": "Allow users to add subusers to their servers",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_user_auto_start",
      "constant": "SERVER_ALLOW_USER_AUTO_START",
      "description": "Allow server owners to toggle Auto Start after node reboot from the server settings page. Admins can always configure this per server.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_user_backup_policy_edit",
      "constant": "SERVER_ALLOW_USER_BACKUP_POLICY_EDIT",
      "description": "Allow server owners to change backup retention mode (inherit / hard limit / FIFO) from the panel and user API. Backup slot count (backup limit) is admin-only. Admins can always edit servers and VM instances.",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_user_made_fastdl",
      "constant": "SERVER_ALLOW_USER_MADE_FASTDL",
      "description": "Allow users to create and manage their own FastDL configurations",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_user_made_firewall",
      "constant": "SERVER_ALLOW_USER_MADE_FIREWALL",
      "description": "Allow users to create and manage their own server firewall rules",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_user_made_import",
      "constant": "SERVER_ALLOW_USER_MADE_IMPORT",
      "description": "Allow users to import server files from remote SFTP or FTP servers. The server must be offline for imports to work.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_user_made_proxy",
      "constant": "SERVER_ALLOW_USER_MADE_PROXY",
      "description": "Allow users to create and manage their own server reverse proxy configurations",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_user_made_subdomains",
      "constant": "SERVER_ALLOW_USER_MADE_SUBDOMAINS",
      "description": "Allow users to create and manage server subdomains",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_allow_user_server_deletion",
      "constant": "SERVER_ALLOW_USER_SERVER_DELETION",
      "description": "Allow users to delete their servers. When disabled, users can only delete their servers via the admin panel.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_auto_start_initial_delay_seconds",
      "constant": "SERVER_AUTO_START_INITIAL_DELAY_SECONDS",
      "description": "Seconds to wait after Wings reconnects before starting the first auto-start server (gives Docker time to settle).",
      "type": "number",
      "required": true,
      "placeholder": "15",
      "validation": "required|integer|min:0|max:600",
      "options": [],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_auto_start_on_node_reconnect",
      "constant": "SERVER_AUTO_START_ON_NODE_RECONNECT",
      "description": "When a game node reconnects after reboot or downtime, automatically start servers that have Auto Start enabled (skips manually stopped and suspended servers). Configure stagger delays below instead of Wings YAML.",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_auto_start_stagger_seconds",
      "constant": "SERVER_AUTO_START_STAGGER_SECONDS",
      "description": "Seconds between each auto-started server on the same node after reconnect. Prevents starting every server at once.",
      "type": "number",
      "required": true,
      "placeholder": "5",
      "validation": "required|integer|min:0|max:300",
      "options": [],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_backup_retention_mode",
      "constant": "SERVER_BACKUP_RETENTION_MODE",
      "description": "Default backup retention when limit is reached (servers/VMs can override per entity). Hard limit blocks new backups. FIFO rolling removes the oldest eligible backup to make room.",
      "type": "select",
      "required": true,
      "placeholder": "hard_limit",
      "validation": "required|string|max:255",
      "options": [
        "hard_limit",
        "fifo_rolling"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_hide_ips",
      "constant": "SERVER_HIDE_IPS",
      "description": "Hide IP addresses in server activity logs and other views. When enabled, IPs will be masked with \"***.***.***.***\" to protect user privacy.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_lifecycle_hooks_container_shell_enabled",
      "constant": "SERVER_LIFECYCLE_HOOKS_CONTAINER_SHELL_ENABLED",
      "description": "Allow Container Shell lifecycle hook steps and Container Shell schedule tasks (docker exec /bin/sh -c inside the server container). This is a security-sensitive capability: users with schedule.update (and control.console for schedule tasks) can run arbitrary shell commands in running containers when hooks fire or schedules run. Default off. Lifecycle hook steps additionally require Lifecycle Hooks Enabled; schedule tasks additionally require Schedules to be allowed. Existing Container Shell steps and tasks will not execute while this is disabled.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_lifecycle_hooks_enabled",
      "constant": "SERVER_LIFECYCLE_HOOKS_ENABLED",
      "description": "Show the Lifecycle Hooks page in server navigation and allow configuration. Uses the same schedule permissions as tasks (schedule.read / schedule.update). When disabled, the menu entry is hidden, hooks do not run on power actions or server crashes, and API changes are rejected. Independent of schedules: you can enable hooks without enabling cron schedules.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_proxy_max_per_server",
      "constant": "SERVER_PROXY_MAX_PER_SERVER",
      "description": "Maximum number of reverse proxy configurations per server",
      "type": "number",
      "required": true,
      "placeholder": "5",
      "validation": "required|integer|min:1|max:10",
      "options": [],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "server_run_script_enabled",
      "constant": "SERVER_RUN_SCRIPT_ENABLED",
      "description": "Allow the \"run a custom container script\" endpoint, which runs an arbitrary script inside a spell-allowed Docker image. Separate from the lifecycle Container Shell setting. Security-sensitive capability, default off.",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "servers",
      "sensitive": false
    },
    {
      "key": "smtp_enabled",
      "constant": "SMTP_ENABLED",
      "description": "The SMTP enabled of the application",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "email",
      "sensitive": false
    },
    {
      "key": "smtp_encryption",
      "constant": "SMTP_ENCRYPTION",
      "description": "SMTP encryption: starttls/tls for port 587 (e.g. Brevo), ssl for port 465 SMTPS, none for plain SMTP",
      "type": "select",
      "required": true,
      "placeholder": "starttls",
      "validation": "required|string|in:starttls,tls,ssl,none",
      "options": [
        "starttls",
        "tls",
        "ssl",
        "none"
      ],
      "category": "email",
      "sensitive": false
    },
    {
      "key": "smtp_from",
      "constant": "SMTP_FROM",
      "description": "The SMTP from of the application",
      "type": "text",
      "required": true,
      "placeholder": "noreply@featherpanel.com",
      "validation": "required|string|max:255",
      "options": [],
      "category": "email",
      "sensitive": false
    },
    {
      "key": "smtp_host",
      "constant": "SMTP_HOST",
      "description": "The SMTP host of the application",
      "type": "text",
      "required": true,
      "placeholder": "localhost",
      "validation": "required|string|max:255",
      "options": [],
      "category": "email",
      "sensitive": false
    },
    {
      "key": "smtp_pass",
      "constant": "SMTP_PASS",
      "description": "The SMTP password of the application",
      "type": "password",
      "required": true,
      "placeholder": "Enter password to change",
      "validation": "string|max:255",
      "options": [],
      "category": "email",
      "sensitive": true
    },
    {
      "key": "smtp_port",
      "constant": "SMTP_PORT",
      "description": "The SMTP port of the application",
      "type": "number",
      "required": true,
      "placeholder": "587",
      "validation": "required|integer|min:1|max:65535",
      "options": [],
      "category": "email",
      "sensitive": false
    },
    {
      "key": "smtp_user",
      "constant": "SMTP_USER",
      "description": "The SMTP user of the application",
      "type": "text",
      "required": true,
      "placeholder": "example@example.com",
      "validation": "required|string|max:255",
      "options": [],
      "category": "email",
      "sensitive": false
    },
    {
      "key": "status_page_allow_iframe",
      "constant": "STATUS_PAGE_ALLOW_IFRAME",
      "description": "Allow the status page to be embedded in an iframe (disables X-Frame-Options: SAMEORIGIN)",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "status_page",
      "sensitive": false
    },
    {
      "key": "status_page_enabled",
      "constant": "STATUS_PAGE_ENABLED",
      "description": "Enable the user-facing status page",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "status_page",
      "sensitive": false
    },
    {
      "key": "status_page_public_enabled",
      "constant": "STATUS_PAGE_PUBLIC_ENABLED",
      "description": "Allow unauthenticated users to access /status and /api/status publicly",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "status_page",
      "sensitive": false
    },
    {
      "key": "status_page_servers_visible_by_default",
      "constant": "STATUS_PAGE_SERVERS_VISIBLE_BY_DEFAULT",
      "description": "Default \"Show on Status Page\" value for newly created servers. Existing servers are unchanged; set false to hide new servers from the public status page unless explicitly opted in.",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "status_page",
      "sensitive": false
    },
    {
      "key": "status_page_show_individual_nodes",
      "constant": "STATUS_PAGE_SHOW_INDIVIDUAL_NODES",
      "description": "Show individual node details on status page",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "status_page",
      "sensitive": false
    },
    {
      "key": "status_page_show_load_usage",
      "constant": "STATUS_PAGE_SHOW_LOAD_USAGE",
      "description": "Show CPU, memory, and disk usage on status page",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "status_page",
      "sensitive": false
    },
    {
      "key": "status_page_show_node_status",
      "constant": "STATUS_PAGE_SHOW_NODE_STATUS",
      "description": "Show node status (healthy/unhealthy counts) on status page",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "status_page",
      "sensitive": false
    },
    {
      "key": "status_page_show_player_count",
      "constant": "STATUS_PAGE_SHOW_PLAYER_COUNT",
      "description": "Show total online player count per node (sum of all players on all servers of that node)",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "status_page",
      "sensitive": false
    },
    {
      "key": "status_page_show_raw_values",
      "constant": "STATUS_PAGE_SHOW_RAW_VALUES",
      "description": "Show raw resource values (CPU core count, RAM in GB, disk in GB) alongside percentage values on the status page",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "status_page",
      "sensitive": false
    },
    {
      "key": "status_page_show_total_servers",
      "constant": "STATUS_PAGE_SHOW_TOTAL_SERVERS",
      "description": "Show total server count on status page",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "status_page",
      "sensitive": false
    },
    {
      "key": "status_page_url",
      "constant": "STATUS_PAGE_URL",
      "description": "Status page URL (e.g., status.example.com)",
      "type": "text",
      "required": false,
      "placeholder": "https://status.example.com",
      "validation": "string|max:255",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "telegram_url",
      "constant": "TELEGRAM_URL",
      "description": "Telegram channel or group URL",
      "type": "text",
      "required": false,
      "placeholder": "https://t.me/example",
      "validation": "string|max:255",
      "options": [],
      "category": "links",
      "sensitive": false
    },
    {
      "key": "telemetry",
      "constant": "TELEMETRY",
      "description": "Send daily aggregate counts to Umami: resource totals, backup outcomes, scheduling, databases, shared access, API keys, SSH keys, mounts, tickets, mailboxes, and feature usage over the last 30 days. No installation identifiers or individual activity records are sent. Browser tracking, recordings, and external error reporting remain disabled. The collector receives the server connection IP. Disable to stop reports.",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|in:true,false",
      "options": [
        "true",
        "false"
      ],
      "category": "telemetry",
      "sensitive": false
    },
    {
      "key": "temp_files_api_token",
      "constant": "TEMP_FILES_API_TOKEN",
      "description": "Optional temp uploads API token (tf_…). Empty = anonymous uploads (15 GB max). With token = 30 GB max.",
      "type": "text",
      "required": false,
      "placeholder": "tf_…",
      "validation": "nullable|string|max:255",
      "options": [],
      "category": "app",
      "sensitive": true
    },
    {
      "key": "temp_files_enabled",
      "constant": "TEMP_FILES_ENABLED",
      "description": "Allow users to share server files via temp uploads (uploaded from Wings, not through the panel).",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "ticket_system_allow_attachments",
      "constant": "TICKET_SYSTEM_ALLOW_ATTACHMENTS",
      "description": "Allow users to attach files to tickets",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "ticket_system",
      "sensitive": false
    },
    {
      "key": "ticket_system_enabled",
      "constant": "TICKET_SYSTEM_ENABLED",
      "description": "Enable or disable the ticket system feature",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "ticket_system",
      "sensitive": false
    },
    {
      "key": "ticket_system_max_open_tickets",
      "constant": "TICKET_SYSTEM_MAX_OPEN_TICKETS",
      "description": "Maximum number of open tickets a user can have at once (0 = unlimited)",
      "type": "number",
      "required": true,
      "placeholder": "10",
      "validation": "required|integer|min:0|max:1000",
      "options": [],
      "category": "ticket_system",
      "sensitive": false
    },
    {
      "key": "tiktok_url",
      "constant": "TIKTOK_URL",
      "description": "TikTok profile URL",
      "type": "text",
      "required": false,
      "placeholder": "https://tiktok.com/@example",
      "validation": "string|max:255",
      "options": [],
      "category": "links",
      "sensitive": false
    },
    {
      "key": "turnstile_enabled",
      "constant": "TURNSTILE_ENABLED",
      "description": "The Turnstile enabled of the application",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "turnstile_key_priv",
      "constant": "TURNSTILE_KEY_PRIV",
      "description": "The Turnstile private key of the application",
      "type": "password",
      "required": false,
      "placeholder": "Enter private key to change",
      "validation": "string|max:255",
      "options": [],
      "category": "security",
      "sensitive": true
    },
    {
      "key": "turnstile_key_pub",
      "constant": "TURNSTILE_KEY_PUB",
      "description": "The Turnstile key pub of the application",
      "type": "text",
      "required": false,
      "placeholder": "",
      "validation": "string|max:255",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "twitter_url",
      "constant": "TWITTER_URL",
      "description": "Twitter/X profile URL",
      "type": "text",
      "required": false,
      "placeholder": "https://twitter.com/example",
      "validation": "string|max:255",
      "options": [],
      "category": "links",
      "sensitive": false
    },
    {
      "key": "user_account_deletion_delay_days",
      "constant": "USER_ACCOUNT_DELETION_DELAY_DAYS",
      "description": "Days to wait before hard-deleting when mode is delayed (1-365)",
      "type": "text",
      "required": true,
      "placeholder": "7",
      "validation": "required|string|max:10",
      "options": [],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "user_account_deletion_mode",
      "constant": "USER_ACCOUNT_DELETION_MODE",
      "description": "How account deletions are processed: instant, delayed, or after active services expire",
      "type": "select",
      "required": true,
      "placeholder": "instant",
      "validation": "required|string|max:64",
      "options": [
        "instant",
        "delayed",
        "after_services"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "user_account_deletion_verify_2fa",
      "constant": "USER_ACCOUNT_DELETION_VERIFY_2FA",
      "description": "Require two-factor authentication to confirm account deletion",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "user_account_deletion_verify_email_otp",
      "constant": "USER_ACCOUNT_DELETION_VERIFY_EMAIL_OTP",
      "description": "Require email one-time password to confirm account deletion",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "user_allow_account_deletion",
      "constant": "USER_ALLOW_ACCOUNT_DELETION",
      "description": "Allow users to permanently delete their own account",
      "type": "select",
      "required": true,
      "placeholder": "false",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "user_allow_api_keys_create",
      "constant": "USER_ALLOW_API_KEYS_CREATE",
      "description": "Allow users to create API keys",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "user_allow_avatar_change",
      "constant": "USER_ALLOW_AVATAR_CHANGE",
      "description": "Allow users to change their avatar",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "user_allow_email_change",
      "constant": "USER_ALLOW_EMAIL_CHANGE",
      "description": "Allow users to change their email address",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "user_allow_first_name_change",
      "constant": "USER_ALLOW_FIRST_NAME_CHANGE",
      "description": "Allow users to change their first name",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "user_allow_last_name_change",
      "constant": "USER_ALLOW_LAST_NAME_CHANGE",
      "description": "Allow users to change their last name",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "user_allow_username_change",
      "constant": "USER_ALLOW_USERNAME_CHANGE",
      "description": "Allow users to change their username",
      "type": "select",
      "required": true,
      "placeholder": "true",
      "validation": "required|string|max:255",
      "options": [
        "true",
        "false"
      ],
      "category": "security",
      "sensitive": false
    },
    {
      "key": "website_url",
      "constant": "WEBSITE_URL",
      "description": "Main website URL",
      "type": "text",
      "required": false,
      "placeholder": "https://example.com",
      "validation": "string|max:255",
      "options": [],
      "category": "links",
      "sensitive": false
    },
    {
      "key": "whatsapp_url",
      "constant": "WHATSAPP_URL",
      "description": "WhatsApp contact or group URL",
      "type": "text",
      "required": false,
      "placeholder": "https://wa.me/1234567890",
      "validation": "string|max:255",
      "options": [],
      "category": "links",
      "sensitive": false
    },
    {
      "key": "wings_remote_url",
      "constant": "WINGS_REMOTE_URL",
      "description": "Optional URL Wings uses for panel callbacks (SFTP auth, remote APIs). Set to a DNS-only (grey-cloud) hostname when Cloudflare Precursor Maximize Security or Under Attack Mode blocks daemon traffic to App URL. Leave empty to use App URL. Re-fetch each node config after changing.",
      "type": "text",
      "required": false,
      "placeholder": "https://panel-origin.example.com",
      "validation": "nullable|string|max:255",
      "options": [],
      "category": "app",
      "sensitive": false
    },
    {
      "key": "youtube_url",
      "constant": "YOUTUBE_URL",
      "description": "YouTube channel URL",
      "type": "text",
      "required": false,
      "placeholder": "https://youtube.com/@example",
      "validation": "string|max:255",
      "options": [],
      "category": "links",
      "sensitive": false
    }
  ],
  "sensitive_keys": [
    "smtp_pass",
    "turnstile_key_priv",
    "chatbot_google_ai_api_key",
    "chatbot_openrouter_api_key",
    "chatbot_openai_api_key",
    "chatbot_grok_api_key",
    "chatbot_perplexity_api_key",
    "discord_oauth_client_secret",
    "hcaptcha_secret_key",
    "recaptcha_secret_key",
    "friendly_captcha_secret_key",
    "reforge_captcha_secret_key",
    "abuseipdb_api_key",
    "temp_files_api_token"
  ],
  "constants": {
    "APP_NAME": "app_name",
    "APP_URL": "app_url",
    "WINGS_REMOTE_URL": "wings_remote_url",
    "APP_DEVELOPER_MODE": "app_developer_mode",
    "APP_TIMEZONE": "app_timezone",
    "APP_LOGO_WHITE": "app_logo_white",
    "APP_LOGO_DARK": "app_logo_dark",
    "APP_SUPPORT_URL": "app_support_url",
    "APP_SSO_REDIRECT_PATH": "app_sso_redirect_path",
    "APP_SSO_TOKEN_LIFETIME_MINUTES": "app_sso_token_lifetime_minutes",
    "VNC_PROXY_VIA_PANEL": "vnc_proxy_via_panel",
    "VNC_USE_PVE_REDIRECT": "vnc_use_pve_redirect",
    "APP_BACKGROUND_IMAGE_URL": "app_background_image_url",
    "APP_BACKGROUND_LOCK": "app_background_lock",
    "APP_LOCALE_DEFAULT": "app_locale_default",
    "APP_LOCALE_LOCK": "app_locale_lock",
    "APP_SERVER_SPELL_BANNER_ENABLED": "app_server_spell_banner_enabled",
    "APP_SERVER_SPELL_BANNER_STYLE": "app_server_spell_banner_style",
    "APP_SERVER_SPELL_BANNER_BACKGROUND": "app_server_spell_banner_background",
    "APP_ACCENT_COLOR_DEFAULT": "app_accent_color_default",
    "APP_ACCENT_COLOR_LOCK": "app_accent_color_lock",
    "APP_THEME_DEFAULT": "app_theme_default",
    "APP_THEME_LOCK": "app_theme_lock",
    "APP_THEME_PACK_DEFAULT": "app_theme_pack_default",
    "APP_THEME_PACK_LOCK": "app_theme_pack_lock",
    "APP_UI_PACK_DEFAULT": "app_ui_pack_default",
    "APP_UI_PACK_LOCK": "app_ui_pack_lock",
    "APP_BACKGROUND_TYPE_DEFAULT": "app_background_type_default",
    "APP_BACKGROUND_TYPE_LOCK": "app_background_type_lock",
    "BRANDING_SHOW_POWERED_BY": "branding_show_powered_by",
    "BRANDING_SHOW_VERSION": "branding_show_version",
    "APP_BACKDROP_BLUR_DEFAULT": "app_backdrop_blur_default",
    "APP_BACKDROP_BLUR_LOCK": "app_backdrop_blur_lock",
    "APP_BACKDROP_DARKEN_DEFAULT": "app_backdrop_darken_default",
    "APP_BACKDROP_DARKEN_LOCK": "app_backdrop_darken_lock",
    "APP_BACKGROUND_IMAGE_FIT_DEFAULT": "app_background_image_fit_default",
    "APP_BACKGROUND_IMAGE_FIT_LOCK": "app_background_image_fit_lock",
    "LINKEDIN_URL": "linkedin_url",
    "TELEGRAM_URL": "telegram_url",
    "TIKTOK_URL": "tiktok_url",
    "TWITTER_URL": "twitter_url",
    "WHATSAPP_URL": "whatsapp_url",
    "YOUTUBE_URL": "youtube_url",
    "DISCORD_URL": "discord_url",
    "WEBSITE_URL": "website_url",
    "STATUS_PAGE_URL": "status_page_url",
    "CAPTCHA_PROVIDER": "captcha_provider",
    "TURNSTILE_ENABLED": "turnstile_enabled",
    "TURNSTILE_KEY_PUB": "turnstile_key_pub",
    "TURNSTILE_KEY_PRIV": "turnstile_key_priv",
    "HCAPTCHA_SITE_KEY": "hcaptcha_site_key",
    "HCAPTCHA_SECRET_KEY": "hcaptcha_secret_key",
    "RECAPTCHA_SITE_KEY": "recaptcha_site_key",
    "RECAPTCHA_SECRET_KEY": "recaptcha_secret_key",
    "RECAPTCHA_VERSION": "recaptcha_version",
    "RECAPTCHA_V3_MIN_SCORE": "recaptcha_v3_min_score",
    "RECAPTCHA_V3_ACTION": "recaptcha_v3_action",
    "FRIENDLY_CAPTCHA_SITE_KEY": "friendly_captcha_site_key",
    "FRIENDLY_CAPTCHA_SECRET_KEY": "friendly_captcha_secret_key",
    "REFORGE_CAPTCHA_SITE_KEY": "reforge_captcha_site_key",
    "REFORGE_CAPTCHA_SECRET_KEY": "reforge_captcha_secret_key",
    "REFORGE_CAPTCHA_WIDGET_TYPE": "reforge_captcha_widget_type",
    "REFORGE_CAPTCHA_THEME": "reforge_captcha_theme",
    "REFORGE_CAPTCHA_SIZE": "reforge_captcha_size",
    "REFORGE_CAPTCHA_LANG": "reforge_captcha_lang",
    "REFORGE_CAPTCHA_MIN_SCORE": "reforge_captcha_min_score",
    "SMTP_ENABLED": "smtp_enabled",
    "SMTP_HOST": "smtp_host",
    "SMTP_PORT": "smtp_port",
    "SMTP_USER": "smtp_user",
    "SMTP_PASS": "smtp_pass",
    "SMTP_FROM": "smtp_from",
    "SMTP_ENCRYPTION": "smtp_encryption",
    "LEGAL_TOS": "legal_tos",
    "LEGAL_PRIVACY": "legal_privacy",
    "REGISTRATION_ENABLED": "registration_enabled",
    "REGISTRATION_REQUIRE_EMAIL_VERIFICATION": "registration_require_email_verification",
    "REGISTRATION_DEVICE_LIMIT_ENABLED": "registration_device_limit_enabled",
    "REGISTRATION_DEVICE_MAX_ACCOUNTS": "registration_device_max_accounts",
    "EMAIL_DOMAIN_BLOCKING_ENABLED": "email_domain_blocking_enabled",
    "REQUIRE_TWO_FA_ADMINS": "require_two_fa_admins",
    "ABUSEIPDB_ENABLED": "abuseipdb_enabled",
    "ABUSEIPDB_API_KEY": "abuseipdb_api_key",
    "ABUSEIPDB_CHECK_ON_REGISTER": "abuseipdb_check_on_register",
    "ABUSEIPDB_MIN_CONFIDENCE_SCORE": "abuseipdb_min_confidence_score",
    "ABUSEIPDB_MAX_AGE_DAYS": "abuseipdb_max_age_days",
    "ABUSEIPDB_REGISTER_ACTION": "abuseipdb_register_action",
    "EMAIL_LOGIN_ENABLED": "email_login_enabled",
    "LOGIN_DEFAULT_METHOD": "login_default_method",
    "LOGIN_METHODS_ORDER": "login_methods_order",
    "LOGIN_HIDDEN_METHODS": "login_hidden_methods",
    "AUTH_SHELL_TAGLINE": "auth_shell_tagline",
    "AUTH_ASIDE_TITLE": "auth_aside_title",
    "AUTH_LOGIN_HEADLINE": "auth_login_headline",
    "AUTH_LOGIN_SUBHEADLINE": "auth_login_subheadline",
    "AUTH_REGISTER_HEADLINE": "auth_register_headline",
    "AUTH_REGISTER_SUBHEADLINE": "auth_register_subheadline",
    "AUTH_SSO_HEADLINE": "auth_sso_headline",
    "AUTH_SSO_SUBHEADLINE": "auth_sso_subheadline",
    "AUTH_SHOW_QR_LOGIN": "auth_show_qr_login",
    "AUTH_SHOW_MARKETING_PANEL": "auth_show_marketing_panel",
    "AUTH_ASIDE_IMAGE_URL": "auth_aside_image_url",
    "AUTH_FORM_DENSITY": "auth_form_density",
    "AUTH_SECONDARY_LAYOUT": "auth_secondary_layout",
    "AUTH_SHOW_THEME_CUSTOMIZER": "auth_show_theme_customizer",
    "AUTH_FOOTER_STYLE": "auth_footer_style",
    "TELEMETRY": "telemetry",
    "APP_SEO_TITLE": "app_seo_title",
    "APP_SEO_DESCRIPTION": "app_seo_description",
    "APP_SEO_KEYWORDS": "app_seo_keywords",
    "APP_SEO_INDEXING": "app_seo_indexing",
    "APP_PWA_ENABLED": "app_pwa_enabled",
    "APP_PWA_SHORT_NAME": "app_pwa_short_name",
    "APP_PWA_DESCRIPTION": "app_pwa_description",
    "APP_PWA_THEME_COLOR": "app_pwa_theme_color",
    "APP_PWA_BG_COLOR": "app_pwa_bg_color",
    "DISCORD_OAUTH_ENABLED": "discord_oauth_enabled",
    "DISCORD_OAUTH_CLIENT_ID": "discord_oauth_client_id",
    "DISCORD_OAUTH_CLIENT_SECRET": "discord_oauth_client_secret",
    "OIDC_ENABLED": "oidc_enabled",
    "OIDC_PROVIDER_NAME": "oidc_provider_name",
    "OIDC_ISSUER_URL": "oidc_issuer_url",
    "OIDC_CLIENT_ID": "oidc_client_id",
    "OIDC_CLIENT_SECRET": "oidc_client_secret",
    "OIDC_SCOPES": "oidc_scopes",
    "OIDC_AUTO_PROVISION": "oidc_auto_provision",
    "OIDC_REQUIRE_EMAIL_VERIFIED": "oidc_require_email_verified",
    "OIDC_EMAIL_CLAIM": "oidc_email_claim",
    "OIDC_SUBJECT_CLAIM": "oidc_subject_claim",
    "OIDC_ALLOWED_GROUP_CLAIM": "oidc_allowed_group_claim",
    "OIDC_ALLOWED_GROUP_VALUE": "oidc_allowed_group_value",
    "OIDC_DISABLE_LOCAL_LOGIN": "oidc_disable_local_login",
    "SERVER_ALLOW_EGG_CHANGE": "server_allow_egg_change",
    "SERVER_ALLOW_USER_SERVER_DELETION": "server_allow_user_server_deletion",
    "SERVER_ALLOW_STARTUP_CHANGE": "server_allow_startup_change",
    "SERVER_ALLOW_CUSTOM_DOCKER_IMAGE": "server_allow_custom_docker_image",
    "SERVER_ALLOW_SUBUSERS": "server_allow_subusers",
    "SERVER_ALLOW_SCHEDULES": "server_allow_schedules",
    "SERVER_BACKUP_RETENTION_MODE": "server_backup_retention_mode",
    "SERVER_ALLOW_USER_BACKUP_POLICY_EDIT": "server_allow_user_backup_policy_edit",
    "SERVER_ALLOW_ALLOCATION_SELECT": "server_allow_allocation_select",
    "SERVER_ALLOW_USER_MADE_FIREWALL": "server_allow_user_made_firewall",
    "SERVER_ALLOW_USER_MADE_PROXY": "server_allow_user_made_proxy",
    "SERVER_PROXY_MAX_PER_SERVER": "server_proxy_max_per_server",
    "SERVER_ALLOW_CROSS_REALM_SPELL_CHANGE": "server_allow_cross_realm_spell_change",
    "SERVER_ALLOW_USER_MADE_IMPORT": "server_allow_user_made_import",
    "SERVER_ALLOW_USER_MADE_FASTDL": "server_allow_user_made_fastdl",
    "SERVER_ALLOW_USER_MADE_SUBDOMAINS": "server_allow_user_made_subdomains",
    "SERVER_AUTO_START_ON_NODE_RECONNECT": "server_auto_start_on_node_reconnect",
    "SERVER_AUTO_START_STAGGER_SECONDS": "server_auto_start_stagger_seconds",
    "SERVER_AUTO_START_INITIAL_DELAY_SECONDS": "server_auto_start_initial_delay_seconds",
    "SERVER_ALLOW_USER_AUTO_START": "server_allow_user_auto_start",
    "SERVER_HIDE_IPS": "server_hide_ips",
    "SERVER_LIFECYCLE_HOOKS_ENABLED": "server_lifecycle_hooks_enabled",
    "SERVER_LIFECYCLE_HOOKS_CONTAINER_SHELL_ENABLED": "server_lifecycle_hooks_container_shell_enabled",
    "SERVER_RUN_SCRIPT_ENABLED": "server_run_script_enabled",
    "FILE_TRASH_ENABLED": "file_trash_enabled",
    "FILE_TRASH_MAX_SIZE_MB": "file_trash_max_size_mb",
    "FILE_TRASH_RETENTION_DAYS": "file_trash_retention_days",
    "AVATAR_PROVIDER": "avatar_provider",
    "AVATAR_CUSTOM_URL": "avatar_custom_url",
    "USER_ALLOW_AVATAR_CHANGE": "user_allow_avatar_change",
    "USER_ALLOW_USERNAME_CHANGE": "user_allow_username_change",
    "USER_ALLOW_EMAIL_CHANGE": "user_allow_email_change",
    "USER_ALLOW_FIRST_NAME_CHANGE": "user_allow_first_name_change",
    "USER_ALLOW_LAST_NAME_CHANGE": "user_allow_last_name_change",
    "USER_ALLOW_API_KEYS_CREATE": "user_allow_api_keys_create",
    "USER_ALLOW_ACCOUNT_DELETION": "user_allow_account_deletion",
    "USER_ACCOUNT_DELETION_MODE": "user_account_deletion_mode",
    "USER_ACCOUNT_DELETION_DELAY_DAYS": "user_account_deletion_delay_days",
    "USER_ACCOUNT_DELETION_VERIFY_2FA": "user_account_deletion_verify_2fa",
    "USER_ACCOUNT_DELETION_VERIFY_EMAIL_OTP": "user_account_deletion_verify_email_otp",
    "SUBDOMAIN_CF_EMAIL": "subdomain_cf_email",
    "SUBDOMAIN_CF_API_KEY": "subdomain_cf_api_key",
    "SUBDOMAIN_MAX_PER_SERVER": "subdomain_max_per_server",
    "FEATHERCLOUD_ACCESS_PUBLIC_KEY": "feathercloud_access_public_key",
    "FEATHERCLOUD_ACCESS_PRIVATE_KEY": "feathercloud_access_private_key",
    "FEATHERCLOUD_ACCESS_LAST_ROTATED": "feathercloud_access_last_rotated",
    "FEATHERCLOUD_CLOUD_PUBLIC_KEY": "feathercloud_cloud_public_key",
    "FEATHERCLOUD_CLOUD_PRIVATE_KEY": "feathercloud_cloud_private_key",
    "FEATHERCLOUD_CLOUD_LAST_ROTATED": "feathercloud_cloud_last_rotated",
    "FEATHERCLOUD_API_BASE_URL": "feathercloud_api_base_url",
    "FEATHERCLOUD_OAUTH_URL": "feathercloud_oauth_url",
    "FEATHERCLOUD_MEMBER_USER_UUID": "feathercloud_member_user_uuid",
    "FEATHERCLOUD_TEAM_UUID": "feathercloud_team_uuid",
    "FEATHERCLOUD_AUTHORIZER_MYTHIC_USER_ID": "feathercloud_authorizer_mythic_user_id",
    "FEATHERCLOUD_AUTHORIZER_FEATHER_UUID": "feathercloud_authorizer_feather_uuid",
    "FEATHERCLOUD_MEMBER_MAP": "feathercloud_member_map",
    "FEATHERCLOUD_LINKED_AT": "feathercloud_linked_at",
    "FEATHERCLOUD_RELINK_PENDING_AT": "feathercloud_relink_pending_at",
    "FEATHERCLOUD_CLOUD_ID": "feathercloud_cloud_id",
    "FEATHERCLOUD_CLOUD_NAME": "feathercloud_cloud_name",
    "FEATHERCLOUD_TEAM_NAME": "feathercloud_team_name",
    "FEATHERCLOUD_TEAM_SLUG": "feathercloud_team_slug",
    "FEATHERCLOUD_AUTHORIZER_EMAIL": "feathercloud_authorizer_email",
    "FEATHERCLOUD_AUTHORIZER_NAME": "feathercloud_authorizer_name",
    "FEATHERCLOUD_MARKETPLACE_ENABLED": "feathercloud_marketplace_enabled",
    "FEATHERCLOUD_EGGS_ENABLED": "feathercloud_eggs_enabled",
    "FEATHERCLOUD_EGGS_BASE_URL": "feathercloud_eggs_base_url",
    "FEATHERCLOUD_PASTES_ENABLED": "feathercloud_pastes_enabled",
    "FEATHERCLOUD_ISSUES_ENABLED": "feathercloud_issues_enabled",
    "FEATHERCLOUD_LAST_SYNCED_AT": "feathercloud_last_synced_at",
    "FEATHERCLOUD_TRANSLATE_BASE_URL": "feathercloud_translate_base_url",
    "FEATHERCLOUD_TRANSLATE_PROJECT": "feathercloud_translate_project",
    "FEATHERPANEL_PREMIUM_ACTIVE": "featherpanel_premium_active",
    "FEATHERPANEL_PREMIUM_FEATURES": "featherpanel_premium_features",
    "FEATHERPANEL_PREMIUM_CHECKED_AT": "featherpanel_premium_checked_at",
    "FEATHERPANEL_PREMIUM_EXPIRES_AT": "featherpanel_premium_expires_at",
    "FEATHERPANEL_PREMIUM_LAST_FAILURE_AT": "featherpanel_premium_last_failure_at",
    "TEMP_FILES_ENABLED": "temp_files_enabled",
    "TEMP_FILES_API_TOKEN": "temp_files_api_token",
    "CHATBOT_ENABLED": "chatbot_enabled",
    "CHATBOT_AI_PROVIDER": "chatbot_ai_provider",
    "CHATBOT_TEMPERATURE": "chatbot_temperature",
    "CHATBOT_MAX_TOKENS": "chatbot_max_tokens",
    "CHATBOT_MAX_HISTORY": "chatbot_max_history",
    "CHATBOT_GOOGLE_AI_API_KEY": "chatbot_google_ai_api_key",
    "CHATBOT_GOOGLE_AI_MODEL": "chatbot_google_ai_model",
    "CHATBOT_OPENROUTER_API_KEY": "chatbot_openrouter_api_key",
    "CHATBOT_OPENROUTER_MODEL": "chatbot_openrouter_model",
    "CHATBOT_OPENAI_API_KEY": "chatbot_openai_api_key",
    "CHATBOT_OPENAI_MODEL": "chatbot_openai_model",
    "CHATBOT_OPENAI_BASE_URL": "chatbot_openai_base_url",
    "CHATBOT_PERPLEXITY_API_KEY": "chatbot_perplexity_api_key",
    "CHATBOT_PERPLEXITY_MODEL": "chatbot_perplexity_model",
    "CHATBOT_PERPLEXITY_BASE_URL": "chatbot_perplexity_base_url",
    "CHATBOT_OLLAMA_BASE_URL": "chatbot_ollama_base_url",
    "CHATBOT_OLLAMA_MODEL": "chatbot_ollama_model",
    "CHATBOT_GROK_API_KEY": "chatbot_grok_api_key",
    "CHATBOT_GROK_MODEL": "chatbot_grok_model",
    "CHATBOT_SYSTEM_PROMPT": "chatbot_system_prompt",
    "CHATBOT_USER_PROMPT": "chatbot_user_prompt",
    "CHATBOT_DISPLAY_NAME": "chatbot_display_name",
    "CHATBOT_AVATAR_URL": "chatbot_avatar_url",
    "SIDEBAR_NAVIGATION_CONFIG": "sidebar_navigation_config",
    "STATUS_PAGE_ENABLED": "status_page_enabled",
    "STATUS_PAGE_PUBLIC_ENABLED": "status_page_public_enabled",
    "STATUS_PAGE_SHOW_NODE_STATUS": "status_page_show_node_status",
    "STATUS_PAGE_SHOW_LOAD_USAGE": "status_page_show_load_usage",
    "STATUS_PAGE_SHOW_TOTAL_SERVERS": "status_page_show_total_servers",
    "STATUS_PAGE_SHOW_INDIVIDUAL_NODES": "status_page_show_individual_nodes",
    "STATUS_PAGE_ALLOW_IFRAME": "status_page_allow_iframe",
    "STATUS_PAGE_SHOW_RAW_VALUES": "status_page_show_raw_values",
    "STATUS_PAGE_SHOW_PLAYER_COUNT": "status_page_show_player_count",
    "STATUS_PAGE_SERVERS_VISIBLE_BY_DEFAULT": "status_page_servers_visible_by_default",
    "KNOWLEDGEBASE_ENABLED": "knowledgebase_enabled",
    "KNOWLEDGEBASE_PUBLIC_ENABLED": "knowledgebase_public_enabled",
    "KNOWLEDGEBASE_SHOW_CATEGORIES": "knowledgebase_show_categories",
    "KNOWLEDGEBASE_SHOW_ARTICLES": "knowledgebase_show_articles",
    "KNOWLEDGEBASE_SHOW_ATTACHMENTS": "knowledgebase_show_attachments",
    "KNOWLEDGEBASE_SHOW_TAGS": "knowledgebase_show_tags",
    "TICKET_SYSTEM_ENABLED": "ticket_system_enabled",
    "TICKET_SYSTEM_ALLOW_ATTACHMENTS": "ticket_system_allow_attachments",
    "TICKET_SYSTEM_MAX_OPEN_TICKETS": "ticket_system_max_open_tickets",
    "CUSTOM_JS": "custom_js",
    "CUSTOM_CSS": "custom_css",
    "CACHE_DRIVER": "cache_driver",
    "APP_DEMO_YES": "app_demo_yes"
  }
}
