{
  "type": "featherpanel.settings.category",
  "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,
  "settings": [
    {
      "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_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": "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": "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_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_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_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_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_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_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_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_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_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_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_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_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": "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": "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
    }
  ]
}
