use Mix.Config
alias Pleroma.Docs.Generator

websocket_config = [
  path: "/websocket",
  serializer: [
    {Phoenix.Socket.V1.JSONSerializer, "~> 1.0.0"},
    {Phoenix.Socket.V2.JSONSerializer, "~> 2.0.0"}
  ],
  timeout: 60_000,
  transport_log: false,
  compress: false
]

config :pleroma, :config_description, [
  %{
    group: :pleroma,
    key: Pleroma.Upload,
    type: :group,
    description: "Upload general settings",
    children: [
      %{
        key: :uploader,
        type: :module,
        description: "Module which will be used for uploads",
        suggestions: [
          Generator.uploaders_list()
        ]
      },
      %{
        key: :filters,
        type: {:list, :module},
        description: "List of filter modules for uploads",
        suggestions: [
          Generator.filters_list()
        ]
      },
      %{
        key: :link_name,
        type: :boolean,
        description:
          "If enabled, a name parameter will be added to the url of the upload. For example `https://instance.tld/media/imagehash.png?name=realname.png`",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :base_url,
        type: :string,
        description: "Base url for the uploads, needed if you use CDN",
        suggestions: [
          "https://cdn-host.com"
        ]
      },
      %{
        key: :proxy_remote,
        type: :boolean,
        description:
          "If enabled, requests to media stored using a remote uploader will be proxied instead of being redirected.",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :proxy_opts,
        type: :keyword,
        description: "Proxy options, see `Pleroma.ReverseProxy` documentation"
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.Uploaders.Local,
    type: :group,
    description: "Local uploader-related settings",
    children: [
      %{
        key: :uploads,
        type: :string,
        description: "Path where user uploads will be saved",
        suggestions: [
          "uploads"
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.Uploaders.S3,
    type: :group,
    description: "S3 uploader-related settings",
    children: [
      %{
        key: :bucket,
        type: :string,
        description: "S3 bucket",
        suggestions: [
          "bucket"
        ]
      },
      %{
        key: :bucket_namespace,
        type: :string,
        description: "S3 bucket namespace",
        suggestions: ["pleroma"]
      },
      %{
        key: :public_endpoint,
        type: :string,
        description: "S3 endpoint",
        suggestions: ["https://s3.amazonaws.com"]
      },
      %{
        key: :truncated_namespace,
        type: :string,
        description:
          "If you use S3 compatible service such as Digital Ocean Spaces or CDN, set folder name or \"\" etc." <>
            " For example, when using CDN to S3 virtual host format, set \"\". At this time, write CNAME to CDN in public_endpoint.",
        suggestions: [""]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.Upload.Filter.Mogrify,
    type: :group,
    description: "Uploads mogrify filter settings",
    children: [
      %{
        key: :args,
        type: [:string, {:list, :string}, {:list, :tuple}],
        description: "List of actions for the mogrify command",
        suggestions: [
          "strip",
          ["strip", "auto-orient"],
          [{"implode", "1"}],
          ["strip", "auto-orient", {"implode", "1"}]
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.Upload.Filter.AnonymizeFilename,
    type: :group,
    description: "Filter replaces the filename of the upload",
    children: [
      %{
        key: :text,
        type: :string,
        description:
          "Text to replace filenames in links. If no setting, {random}.extension will be used. You can get the original" <>
            " filename extension by using {extension}, for example custom-file-name.{extension}",
        suggestions: [
          "custom-file-name.{extension}",
          nil
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.Emails.Mailer,
    type: :group,
    description: "Mailer-related settings",
    children: [
      %{
        key: :adapter,
        type: :module,
        description:
          "One of the mail adapters listed in [Swoosh readme](https://github.com/swoosh/swoosh#adapters)," <>
            " or Swoosh.Adapters.Local for in-memory mailbox",
        suggestions: [
          Swoosh.Adapters.SMTP,
          Swoosh.Adapters.Sendgrid,
          Swoosh.Adapters.Sendmail,
          Swoosh.Adapters.Mandrill,
          Swoosh.Adapters.Mailgun,
          Swoosh.Adapters.Mailjet,
          Swoosh.Adapters.Postmark,
          Swoosh.Adapters.SparkPost,
          Swoosh.Adapters.AmazonSES,
          Swoosh.Adapters.Dyn,
          Swoosh.Adapters.SocketLabs,
          Swoosh.Adapters.Gmail
        ]
      },
      %{
        key: :enabled,
        type: :boolean,
        description: "Allow/disallow send emails",
        suggestions: [
          true,
          false
        ]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SMTP},
        key: :relay,
        type: :string,
        description: "`Swoosh.Adapters.SMTP` adapter specific setting",
        suggestions: ["smtp.gmail.com"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SMTP},
        key: :username,
        type: :string,
        description: "`Swoosh.Adapters.SMTP` adapter specific setting",
        suggestions: ["pleroma"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SMTP},
        key: :password,
        type: :string,
        description: "`Swoosh.Adapters.SMTP` adapter specific setting",
        suggestions: ["password"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SMTP},
        key: :ssl,
        type: :boolean,
        description: "`Swoosh.Adapters.SMTP` adapter specific setting",
        suggestions: [true, false]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SMTP},
        key: :tls,
        type: :atom,
        description: "`Swoosh.Adapters.SMTP` adapter specific setting",
        suggestions: [:always, :never, :if_available]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SMTP},
        key: :auth,
        type: :atom,
        description: "`Swoosh.Adapters.SMTP` adapter specific setting",
        suggestions: [:always, :never, :if_available]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SMTP},
        key: :port,
        type: :integer,
        description: "`Swoosh.Adapters.SMTP` adapter specific setting",
        suggestions: [1025]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SMTP},
        key: :retries,
        type: :integer,
        description: "`Swoosh.Adapters.SMTP` adapter specific setting",
        suggestions: [5]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SMTP},
        key: :no_mx_lookups,
        type: :boolean,
        description: "`Swoosh.Adapters.SMTP` adapter specific setting",
        suggestions: [true, false]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.Sendgrid},
        key: :api_key,
        type: :string,
        description: "`Swoosh.Adapters.Sendgrid` adapter specific setting",
        suggestions: ["my-api-key"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.Sendmail},
        key: :cmd_path,
        type: :string,
        description: "`Swoosh.Adapters.Sendmail` adapter specific setting",
        suggestions: ["/usr/bin/sendmail"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.Sendmail},
        key: :cmd_args,
        type: :string,
        description: "`Swoosh.Adapters.Sendmail` adapter specific setting",
        suggestions: ["-N delay,failure,success"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.Sendmail},
        key: :qmail,
        type: :boolean,
        description: "`Swoosh.Adapters.Sendmail` adapter specific setting",
        suggestions: [true, false]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.Mandrill},
        key: :api_key,
        type: :string,
        description: "`Swoosh.Adapters.Mandrill` adapter specific setting",
        suggestions: ["my-api-key"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.Mailgun},
        key: :api_key,
        type: :string,
        description: "`Swoosh.Adapters.Mailgun` adapter specific setting",
        suggestions: ["my-api-key"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.Mailgun},
        key: :domain,
        type: :string,
        description: "`Swoosh.Adapters.Mailgun` adapter specific setting",
        suggestions: ["pleroma.com"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.Mailjet},
        key: :api_key,
        type: :string,
        description: "`Swoosh.Adapters.Mailjet` adapter specific setting",
        suggestions: ["my-api-key"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.Mailjet},
        key: :secret,
        type: :string,
        description: "`Swoosh.Adapters.Mailjet` adapter specific setting",
        suggestions: ["my-secret-key"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.Postmark},
        key: :api_key,
        type: :string,
        description: "`Swoosh.Adapters.Postmark` adapter specific setting",
        suggestions: ["my-api-key"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SparkPost},
        key: :api_key,
        type: :string,
        description: "`Swoosh.Adapters.SparkPost` adapter specific setting",
        suggestions: ["my-api-key"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SparkPost},
        key: :endpoint,
        type: :string,
        description: "`Swoosh.Adapters.SparkPost` adapter specific setting",
        suggestions: ["https://api.sparkpost.com/api/v1"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.AmazonSES},
        key: :region,
        type: {:string},
        description: "`Swoosh.Adapters.AmazonSES` adapter specific setting",
        suggestions: ["us-east-1", "us-east-2"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.AmazonSES},
        key: :access_key,
        type: :string,
        description: "`Swoosh.Adapters.AmazonSES` adapter specific setting",
        suggestions: ["aws-access-key"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.AmazonSES},
        key: :secret,
        type: :string,
        description: "`Swoosh.Adapters.AmazonSES` adapter specific setting",
        suggestions: ["aws-secret-key"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.Dyn},
        key: :api_key,
        type: :string,
        description: "`Swoosh.Adapters.Dyn` adapter specific setting",
        suggestions: ["my-api-key"]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SocketLabs},
        key: :server_id,
        type: :string,
        description: "`Swoosh.Adapters.SocketLabs` adapter specific setting",
        suggestions: [""]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.SocketLabs},
        key: :api_key,
        type: :string,
        description: "`Swoosh.Adapters.SocketLabs` adapter specific setting",
        suggestions: [""]
      },
      %{
        group: {:subgroup, Swoosh.Adapters.Gmail},
        key: :access_token,
        type: :string,
        description: "`Swoosh.Adapters.Gmail` adapter specific setting",
        suggestions: [""]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :uri_schemes,
    type: :group,
    description: "URI schemes related settings",
    children: [
      %{
        key: :valid_schemes,
        type: {:list, :string},
        description: "List of the scheme part that is considered valid to be an URL",
        suggestions: [
          [
            "https",
            "http",
            "dat",
            "dweb",
            "gopher",
            "ipfs",
            "ipns",
            "irc",
            "ircs",
            "magnet",
            "mailto",
            "mumble",
            "ssb",
            "xmpp"
          ]
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :instance,
    type: :group,
    description: "Instance-related settings",
    children: [
      %{
        key: :name,
        type: :string,
        description: "Name of the instance",
        suggestions: [
          "Pleroma"
        ]
      },
      %{
        key: :email,
        type: :string,
        description: "Email used to reach an Administrator/Moderator of the instance",
        suggestions: [
          "email@example.com"
        ]
      },
      %{
        key: :notify_email,
        type: :string,
        description: "Email used for notifications",
        suggestions: [
          "notify@example.com"
        ]
      },
      %{
        key: :description,
        type: :string,
        description: "The instance's description, can be seen in nodeinfo and /api/v1/instance",
        suggestions: [
          "Very cool instance"
        ]
      },
      %{
        key: :limit,
        type: :integer,
        description: "Posts character limit (CW/Subject included in the counter)",
        suggestions: [
          5_000
        ]
      },
      %{
        key: :remote_limit,
        type: :integer,
        description: "Hard character limit beyond which remote posts will be dropped",
        suggestions: [
          100_000
        ]
      },
      %{
        key: :upload_limit,
        type: :integer,
        description: "File size limit of uploads (except for avatar, background, banner)",
        suggestions: [
          16_000_000
        ]
      },
      %{
        key: :avatar_upload_limit,
        type: :integer,
        description: "File size limit of user's profile avatars",
        suggestions: [
          2_000_000
        ]
      },
      %{
        key: :background_upload_limit,
        type: :integer,
        description: "File size limit of user's profile backgrounds",
        suggestions: [
          4_000_000
        ]
      },
      %{
        key: :banner_upload_limit,
        type: :integer,
        description: "File size limit of user's profile banners",
        suggestions: [
          4_000_000
        ]
      },
      %{
        key: :poll_limits,
        type: :map,
        description: "A map with poll limits for local polls",
        suggestions: [
          %{
            max_options: 20,
            max_option_chars: 200,
            min_expiration: 0,
            max_expiration: 31_536_000
          }
        ],
        children: [
          %{
            key: :max_options,
            type: :integer,
            description: "Maximum number of options",
            suggestions: [20]
          },
          %{
            key: :max_option_chars,
            type: :integer,
            description: "Maximum number of characters per option",
            suggestions: [200]
          },
          %{
            key: :min_expiration,
            type: :integer,
            description: "Minimum expiration time (in seconds)",
            suggestions: [0]
          },
          %{
            key: :max_expiration,
            type: :integer,
            description: "Maximum expiration time (in seconds)",
            suggestions: [3600]
          }
        ]
      },
      %{
        key: :registrations_open,
        type: :boolean,
        description: "Enable registrations for anyone, invitations can be enabled when false",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :invites_enabled,
        type: :boolean,
        description: "Enable user invitations for admins (depends on registrations_open: false)",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :account_activation_required,
        type: :boolean,
        description: "Require users to confirm their emails before signing in",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :federating,
        type: :boolean,
        description: "Enable federation with other instances",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :federation_incoming_replies_max_depth,
        type: :integer,
        description:
          "Max. depth of reply-to activities fetching on incoming federation, to prevent out-of-memory situations while" <>
            " fetching very long threads. If set to nil, threads of any depth will be fetched. Lower this value if you experience out-of-memory crashes",
        suggestions: [
          100
        ]
      },
      %{
        key: :federation_reachability_timeout_days,
        type: :integer,
        description:
          "Timeout (in days) of each external federation target being unreachable prior to pausing federating to it",
        suggestions: [
          7
        ]
      },
      %{
        key: :federation_publisher_modules,
        type: [:list, :module],
        description: "List of modules for federation publishing",
        suggestions: [
          Pleroma.Web.ActivityPub.Publisher,
          Pleroma.Web.Websub,
          Pleroma.Web.Salmo
        ]
      },
      %{
        key: :allow_relay,
        type: :boolean,
        description: "Enable Pleroma's Relay, which makes it possible to follow a whole instance",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :rewrite_policy,
        type: {:list, :module},
        description: "A list of MRF policies enabled",
        suggestions: [
          Pleroma.Web.ActivityPub.MRF.NoOpPolicy,
          Generator.mrf_list()
        ]
      },
      %{
        key: :public,
        type: :boolean,
        description:
          "Makes the client API in authentificated mode-only except for user-profiles." <>
            " Useful for disabling the Local Timeline and The Whole Known Network",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :quarantined_instances,
        type: {:list, :string},
        description:
          "List of ActivityPub instances where private(DMs, followers-only) activities will not be send",
        suggestions: [
          "quarantined.com",
          "*.quarantined.com"
        ]
      },
      %{
        key: :managed_config,
        type: :boolean,
        description:
          "Whenether the config for pleroma-fe is configured in this config or in static/config.json",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :static_dir,
        type: :string,
        description: "Instance static directory",
        suggestions: [
          "instance/static/"
        ]
      },
      %{
        key: :allowed_post_formats,
        type: {:list, :string},
        description: "MIME-type list of formats allowed to be posted (transformed into HTML)",
        suggestions: [
          [
            "text/plain",
            "text/html",
            "text/markdown",
            "text/bbcode"
          ]
        ]
      },
      %{
        key: :mrf_transparency,
        type: :boolean,
        description:
          "Make the content of your Message Rewrite Facility settings public (via nodeinfo)",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :mrf_transparency_exclusions,
        type: {:list, :string},
        description:
          "Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value",
        suggestions: [
          ["exclusion.com"]
        ]
      },
      %{
        key: :extended_nickname_format,
        type: :boolean,
        description:
          "Set to true to use extended local nicknames format (allows underscores/dashes)." <>
            " This will break federation with older software for theses nicknames",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :max_pinned_statuses,
        type: :integer,
        description: "The maximum number of pinned statuses. 0 will disable the feature",
        suggestions: [
          0,
          1,
          3
        ]
      },
      %{
        key: :autofollowed_nicknames,
        type: {:list, :string},
        description:
          "Set to nicknames of (local) users that every new user should automatically follow",
        suggestions: [
          "lain",
          "kaniini",
          "lanodan",
          "rinpatch"
        ]
      },
      %{
        key: :no_attachment_links,
        type: :boolean,
        description:
          "Set to true to disable automatically adding attachment link text to statuses",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :welcome_message,
        type: :string,
        description:
          "A message that will be send to a newly registered users as a direct message",
        suggestions: [
          "Hi, @username! Welcome to the board!",
          nil
        ]
      },
      %{
        key: :welcome_user_nickname,
        type: :string,
        description: "The nickname of the local user that sends the welcome message",
        suggestions: [
          "lain",
          nil
        ]
      },
      %{
        key: :max_report_comment_size,
        type: :integer,
        description: "The maximum size of the report comment (Default: 1000)",
        suggestions: [
          1_000
        ]
      },
      %{
        key: :safe_dm_mentions,
        type: :boolean,
        description:
          "If set to true, only mentions at the beginning of a post will be used to address people in direct messages." <>
            " This is to prevent accidental mentioning of people when talking about them (e.g. \"@friend hey i really don't like @enemy\")." <>
            " Default: false",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :healthcheck,
        type: :boolean,
        description: "If set to true, system data will be shown on /api/pleroma/healthcheck",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :remote_post_retention_days,
        type: :integer,
        description:
          "The default amount of days to retain remote posts when pruning the database",
        suggestions: [
          90
        ]
      },
      %{
        key: :user_bio_length,
        type: :integer,
        description: "A user bio maximum length (default: 5000)",
        suggestions: [
          5_000
        ]
      },
      %{
        key: :user_name_length,
        type: :integer,
        description: "A user name maximum length (default: 100)",
        suggestions: [
          100
        ]
      },
      %{
        key: :skip_thread_containment,
        type: :boolean,
        description: "Skip filter out broken threads. The default is true",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :limit_to_local_content,
        type: [:atom, false],
        description:
          "Limit unauthenticated users to search for local statutes and users only. The default is :unauthenticated ",
        suggestions: [
          :unauthenticated,
          :all,
          false
        ]
      },
      %{
        key: :dynamic_configuration,
        type: :boolean,
        description:
          "Allow transferring configuration to DB with the subsequent customization from Admin api. Defaults to `false`",
        suggestions: [
          true,
          false
        ]
      },
      %{
        key: :max_account_fields,
        type: :integer,
        description: "The maximum number of custom fields in the user profile (default: 10)",
        suggestions: [
          10
        ]
      },
      %{
        key: :max_remote_account_fields,
        type: :integer,
        description:
          "The maximum number of custom fields in the remote user profile (default: 20)",
        suggestions: [
          20
        ]
      },
      %{
        key: :account_field_name_length,
        type: :integer,
        description: "An account field name maximum length (default: 512)",
        suggestions: [
          512
        ]
      },
      %{
        key: :account_field_value_length,
        type: :integer,
        description: "An account field value maximum length (default: 2048)",
        suggestions: [
          2048
        ]
      },
      %{
        key: :external_user_synchronization,
        type: :boolean,
        description: "Enabling following/followers counters synchronization for external users",
        suggestions: [
          true,
          false
        ]
      }
    ]
  },
  %{
    group: :logger,
    type: :group,
    description: "Logger-related settings",
    children: [
      %{
        key: :backends,
        type: [:atom, :tuple, :module],
        description:
          "Where logs will be send, :console - send logs to stdout, {ExSyslogger, :ex_syslogger} - to syslog, Quack.Logger - to Slack.",
        suggestions: [[:console, {ExSyslogger, :ex_syslogger}, Quack.Logger]]
      }
    ]
  },
  %{
    group: :logger,
    type: :group,
    key: :ex_syslogger,
    description: "ExSyslogger-related settings",
    children: [
      %{
        key: :level,
        type: :atom,
        description: "Log level",
        suggestions: [:debug, :info, :warn, :error]
      },
      %{
        key: :ident,
        type: :string,
        description:
          "A string that's prepended to every message, and is typically set to the app name",
        suggestions: ["pleroma"]
      },
      %{
        key: :format,
        type: :string,
        description: "It defaults to \"$date $time [$level] $levelpad$node $metadata $message\"",
        suggestions: ["$metadata[$level] $message"]
      },
      %{
        key: :metadata,
        type: {:list, :atom},
        description: "",
        suggestions: [[:request_id]]
      }
    ]
  },
  %{
    group: :logger,
    type: :group,
    key: :console,
    description: "Console logger settings",
    children: [
      %{
        key: :level,
        type: :atom,
        description: "Log level",
        suggestions: [:debug, :info, :warn, :error]
      },
      %{
        key: :format,
        type: :string,
        description: "It defaults to \"$date $time [$level] $levelpad$node $metadata $message\"",
        suggestions: ["$metadata[$level] $message"]
      },
      %{
        key: :metadata,
        type: {:list, :atom},
        description: "",
        suggestions: [[:request_id]]
      }
    ]
  },
  %{
    group: :quack,
    type: :group,
    description: "Quack-related settings",
    children: [
      %{
        key: :level,
        type: :atom,
        description: "Log level",
        suggestions: [:debug, :info, :warn, :error]
      },
      %{
        key: :meta,
        type: {:list, :atom},
        description: "Configure which metadata you want to report on",
        suggestions: [
          :application,
          :module,
          :file,
          :function,
          :line,
          :pid,
          :crash_reason,
          :initial_call,
          :registered_name,
          :all,
          :none
        ]
      },
      %{
        key: :webhook_url,
        type: :string,
        description: "Configure the Slack incoming webhook",
        suggestions: ["https://hooks.slack.com/services/YOUR-KEY-HERE"]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :frontend_configurations,
    type: :group,
    description: "A keyword list that keeps the configuration data for any kind of frontend",
    children: [
      %{
        key: :pleroma_fe,
        type: :map,
        description: "Settings for Pleroma FE",
        suggestions: [
          %{
            theme: "pleroma-dark",
            logo: "/static/logo.png",
            background: "/images/city.jpg",
            redirectRootNoLogin: "/main/all",
            redirectRootLogin: "/main/friends",
            showInstanceSpecificPanel: true,
            scopeOptionsEnabled: false,
            formattingOptionsEnabled: false,
            collapseMessageWithSubject: false,
            hidePostStats: false,
            hideUserStats: false,
            scopeCopy: true,
            subjectLineBehavior: "email",
            alwaysShowSubjectInput: true
          }
        ],
        children: [
          %{
            key: :theme,
            type: :string,
            description: "Which theme to use, they are defined in styles.json",
            suggestions: ["pleroma-dark"]
          },
          %{
            key: :logo,
            type: :string,
            description: "URL of the logo, defaults to Pleroma's logo",
            suggestions: ["/static/logo.png"]
          },
          %{
            key: :background,
            type: :string,
            description:
              "URL of the background, unless viewing a user profile with a background that is set",
            suggestions: ["/images/city.jpg"]
          },
          %{
            key: :redirectRootNoLogin,
            type: :string,
            description:
              "relative URL which indicates where to redirect when a user isn't logged in",
            suggestions: ["/main/all"]
          },
          %{
            key: :redirectRootLogin,
            type: :string,
            description:
              "relative URL which indicates where to redirect when a user is logged in",
            suggestions: ["/main/friends"]
          },
          %{
            key: :showInstanceSpecificPanel,
            type: :boolean,
            description: "Whenether to show the instance's specific panel",
            suggestions: [true, false]
          },
          %{
            key: :scopeOptionsEnabled,
            type: :boolean,
            description: "Enable setting an notice visibility and subject/CW when posting",
            suggestions: [true, false]
          },
          %{
            key: :formattingOptionsEnabled,
            type: :boolean,
            description:
              "Enable setting a formatting different than plain-text (ie. HTML, Markdown) when posting, relates to :instance, allowed_post_formats",
            suggestions: [true, false]
          },
          %{
            key: :collapseMessageWithSubject,
            type: :boolean,
            description:
              "When a message has a subject(aka Content Warning), collapse it by default",
            suggestions: [true, false]
          },
          %{
            key: :hidePostStats,
            type: :boolean,
            description: "Hide notices statistics(repeats, favorites, ...)",
            suggestions: [true, false]
          },
          %{
            key: :hideUserStats,
            type: :boolean,
            description:
              "Hide profile statistics(posts, posts per day, followers, followings, ...)",
            suggestions: [true, false]
          },
          %{
            key: :scopeCopy,
            type: :boolean,
            description:
              "Copy the scope (private/unlisted/public) in replies to posts by default",
            suggestions: [true, false]
          },
          %{
            key: :subjectLineBehavior,
            type: :string,
            description: "Allows changing the default behaviour of subject lines in replies.
          `email`: Copy and preprend re:, as in email,
          `masto`: Copy verbatim, as in Mastodon,
          `noop`: Don't copy the subjec",
            suggestions: ["email", "masto", "noop"]
          },
          %{
            key: :alwaysShowSubjectInput,
            type: :boolean,
            description: "When set to false, auto-hide the subject field when it's empty",
            suggestions: [true, false]
          }
        ]
      },
      %{
        key: :masto_fe,
        type: :map,
        description: "Settings for Masto FE",
        suggestions: [
          %{
            showInstanceSpecificPanel: true
          }
        ],
        children: [
          %{
            key: :showInstanceSpecificPanel,
            type: :boolean,
            description: "Whenether to show the instance's specific panel",
            suggestions: [true, false]
          }
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :assets,
    type: :group,
    description:
      "This section configures assets to be used with various frontends. Currently the only option relates to mascots on the mastodon frontend",
    children: [
      %{
        key: :mascots,
        type: :keyword,
        description:
          "Keyword of mascots, each element MUST contain both a url and a mime_type key",
        suggestions: [
          [
            pleroma_fox_tan: %{
              url: "/images/pleroma-fox-tan-smol.png",
              mime_type: "image/png"
            },
            pleroma_fox_tan_shy: %{
              url: "/images/pleroma-fox-tan-shy.png",
              mime_type: "image/png"
            }
          ]
        ]
      },
      %{
        key: :default_mascot,
        type: :atom,
        description:
          "This will be used as the default mascot on MastoFE (default: :pleroma_fox_tan)",
        suggestions: [
          :pleroma_fox_tan
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :mrf_simple,
    type: :group,
    description: "Message Rewrite Facility",
    children: [
      %{
        key: :media_removal,
        type: {:list, :string},
        description: "List of instances to remove medias from",
        suggestions: ["example.com", "*.example.com"]
      },
      %{
        key: :media_nsfw,
        type: {:list, :string},
        description: "List of instances to put medias as NSFW(sensitive) from",
        suggestions: ["example.com", "*.example.com"]
      },
      %{
        key: :federated_timeline_removal,
        type: {:list, :string},
        description:
          "List of instances to remove from Federated (aka The Whole Known Network) Timeline",
        suggestions: ["example.com", "*.example.com"]
      },
      %{
        key: :reject,
        type: {:list, :string},
        description: "List of instances to reject any activities from",
        suggestions: ["example.com", "*.example.com"]
      },
      %{
        key: :accept,
        type: {:list, :string},
        description: "List of instances to accept any activities from",
        suggestions: ["example.com", "*.example.com"]
      },
      %{
        key: :report_removal,
        type: {:list, :string},
        description: "List of instances to reject reports from",
        suggestions: ["example.com", "*.example.com"]
      },
      %{
        key: :avatar_removal,
        type: {:list, :string},
        description: "List of instances to strip avatars from",
        suggestions: ["example.com", "*.example.com"]
      },
      %{
        key: :banner_removal,
        type: {:list, :string},
        description: "List of instances to strip banners from",
        suggestions: ["example.com", "*.example.com"]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :mrf_subchain,
    type: :group,
    description:
      "This policy processes messages through an alternate pipeline when a given message matches certain criteria." <>
        " All criteria are configured as a map of regular expressions to lists of policy modules.",
    children: [
      %{
        key: :match_actor,
        type: :map,
        description: "Matches a series of regular expressions against the actor field",
        suggestions: [
          %{
            ~r/https:\/\/example.com/s => [Pleroma.Web.ActivityPub.MRF.DropPolicy]
          }
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :mrf_rejectnonpublic,
    type: :group,
    description: "",
    children: [
      %{
        key: :allow_followersonly,
        type: :boolean,
        description: "whether to allow followers-only posts",
        suggestions: [true, false]
      },
      %{
        key: :allow_direct,
        type: :boolean,
        description: "whether to allow direct messages",
        suggestions: [true, false]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :mrf_hellthread,
    type: :group,
    description: "Block messages with too much mentions",
    children: [
      %{
        key: :delist_threshold,
        type: :integer,
        description:
          "Number of mentioned users after which the message gets delisted (the message can still be seen, " <>
            " but it will not show up in public timelines and mentioned users won't get notifications about it). Set to 0 to disable",
        suggestions: [10]
      },
      %{
        key: :reject_threshold,
        type: :integer,
        description:
          "Number of mentioned users after which the messaged gets rejected. Set to 0 to disable",
        suggestions: [20]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :mrf_keyword,
    type: :group,
    description: "Reject or Word-Replace messages with a keyword or regex",
    children: [
      %{
        key: :reject,
        type: [:string, :regex],
        description:
          "A list of patterns which result in message being rejected, each pattern can be a string or a regular expression",
        suggestions: ["foo", ~r/foo/iu]
      },
      %{
        key: :federated_timeline_removal,
        type: [:string, :regex],
        description:
          "A list of patterns which result in message being removed from federated timelines (a.k.a unlisted), each pattern can be a string or a regular expression",
        suggestions: ["foo", ~r/foo/iu]
      },
      %{
        key: :replace,
        type: [{:string, :string}, {:regex, :string}],
        description:
          "A list of patterns which result in message being removed from federated timelines (a.k.a unlisted), each pattern can be a string or a regular expression",
        suggestions: [{"foo", "bar"}, {~r/foo/iu, "bar"}]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :mrf_mention,
    type: :group,
    description: "Block messages which mention a user",
    children: [
      %{
        key: :actors,
        type: {:list, :string},
        description: "A list of actors, for which to drop any posts mentioning",
        suggestions: [["actor1", "actor2"]]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :mrf_vocabulary,
    type: :group,
    description: "Filter messages which belong to certain activity vocabularies",
    children: [
      %{
        key: :accept,
        type: {:list, :string},
        description:
          "A list of ActivityStreams terms to accept. If empty, all supported messages are accepted",
        suggestions: [["Create", "Follow", "Mention", "Announce", "Like"]]
      },
      %{
        key: :reject,
        type: {:list, :string},
        description:
          "A list of ActivityStreams terms to reject. If empty, no messages are rejected",
        suggestions: [["Create", "Follow", "Mention", "Announce", "Like"]]
      }
    ]
  },
  # %{
  #   group: :pleroma,
  #   key: :mrf_user_allowlist,
  #   type: :group,
  #   description:
  #     "The keys in this section are the domain names that the policy should apply to." <>
  #       " Each key should be assigned a list of users that should be allowed through by their ActivityPub ID",
  #   children: [
  #     ["example.org": ["https://example.org/users/admin"]],
  #     suggestions: [
  #       ["example.org": ["https://example.org/users/admin"]]
  #     ]
  #   ]
  # },
  %{
    group: :pleroma,
    key: :media_proxy,
    type: :group,
    description: "Media proxy",
    children: [
      %{
        key: :enabled,
        type: :boolean,
        description: "Enables proxying of remote media to the instance's proxy",
        suggestions: [true, false]
      },
      %{
        key: :base_url,
        type: :string,
        description:
          "The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host/CDN fronts",
        suggestions: ["https://example.com"]
      },
      %{
        key: :proxy_opts,
        type: :keyword,
        description: "Options for Pleroma.ReverseProxy",
        suggestions: [[max_body_length: 25 * 1_048_576, redirect_on_failure: false]]
      },
      %{
        key: :whitelist,
        type: {:list, :string},
        description: "List of domains to bypass the mediaproxy",
        suggestions: ["example.com"]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :gopher,
    type: :group,
    description: "Gopher settings",
    children: [
      %{
        key: :enabled,
        type: :boolean,
        description: "Enables the gopher interface",
        suggestions: [true, false]
      },
      %{
        key: :ip,
        type: :tuple,
        description: "IP address to bind to",
        suggestions: [{0, 0, 0, 0}]
      },
      %{
        key: :port,
        type: :integer,
        description: "Port to bind to",
        suggestions: [9999]
      },
      %{
        key: :dstport,
        type: :integer,
        description: "Port advertised in urls (optional, defaults to port)",
        suggestions: [9999]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.Web.Endpoint,
    type: :group,
    description: "Phoenix endpoint configuration",
    children: [
      %{
        key: :http,
        type: :keyword,
        description: "http protocol configuration",
        suggestions: [
          [port: 8080, ip: {127, 0, 0, 1}]
        ],
        children: [
          %{
            key: :dispatch,
            type: {:list, :tuple},
            description: "dispatch settings",
            suggestions: [
              [
                {:_,
                 [
                   {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
                   {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
                    {Phoenix.Transports.WebSocket,
                     {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, websocket_config}}},
                   {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
                 ]}
                # end copied from config.exs
              ]
            ]
          },
          %{
            key: :ip,
            type: :tuple,
            description: "ip",
            suggestions: [
              {0, 0, 0, 0}
            ]
          },
          %{
            key: :port,
            type: :integer,
            description: "port",
            suggestions: [
              2020
            ]
          }
        ]
      },
      %{
        key: :url,
        type: :keyword,
        description: "configuration for generating urls",
        suggestions: [
          [host: "example.com", port: 2020, scheme: "https"]
        ],
        children: [
          %{
            key: :host,
            type: :string,
            description: "Host",
            suggestions: [
              "example.com"
            ]
          },
          %{
            key: :port,
            type: :integer,
            description: "port",
            suggestions: [
              2020
            ]
          },
          %{
            key: :scheme,
            type: :string,
            description: "Scheme",
            suggestions: [
              "https",
              "https"
            ]
          }
        ]
      },
      %{
        key: :instrumenters,
        type: {:list, :module},
        description: "",
        suggestions: [Pleroma.Web.Endpoint.Instrumenter]
      },
      %{
        key: :protocol,
        type: :string,
        description: "",
        suggestions: ["https"]
      },
      %{
        key: :secret_key_base,
        type: :string,
        description: "",
        suggestions: ["aK4Abxf29xU9TTDKre9coZPUgevcVCFQJe/5xP/7Lt4BEif6idBIbjupVbOrbKxl"]
      },
      %{
        key: :signing_salt,
        type: :string,
        description: "",
        suggestions: ["CqaoopA2"]
      },
      %{
        key: :render_errors,
        type: :keyword,
        description: "",
        suggestions: [[view: Pleroma.Web.ErrorView, accepts: ~w(json)]],
        children: [
          %{
            key: :view,
            type: :module,
            description: "",
            suggestions: [Pleroma.Web.ErrorView]
          },
          %{
            key: :accepts,
            type: {:list, :string},
            description: "",
            suggestions: ["json"]
          }
        ]
      },
      %{
        key: :pubsub,
        type: :keyword,
        description: "",
        suggestions: [[name: Pleroma.PubSub, adapter: Phoenix.PubSub.PG2]],
        children: [
          %{
            key: :name,
            type: :module,
            description: "",
            suggestions: [Pleroma.PubSub]
          },
          %{
            key: :adapter,
            type: :module,
            description: "",
            suggestions: [Phoenix.PubSub.PG2]
          }
        ]
      },
      %{
        key: :secure_cookie_flag,
        type: :boolean,
        description: "",
        suggestions: [true, false]
      },
      %{
        key: :extra_cookie_attrs,
        type: {:list, :string},
        description: "",
        suggestions: ["SameSite=Lax"]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :activitypub,
    type: :group,
    description: "ActivityPub-related settings",
    children: [
      %{
        key: :unfollow_blocked,
        type: :boolean,
        description: "Whether blocks result in people getting unfollowed",
        suggestions: [true, false]
      },
      %{
        key: :outgoing_blocks,
        type: :boolean,
        description: "Whether to federate blocks to other instances",
        suggestions: [true, false]
      },
      %{
        key: :sign_object_fetches,
        type: :boolean,
        description: "Sign object fetches with HTTP signatures",
        suggestions: [true, false]
      },
      %{
        key: :follow_handshake_timeout,
        type: :integer,
        description: "Following handshake timeout",
        suggestions: [500]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :http_security,
    type: :group,
    description: "HTTP security settings",
    children: [
      %{
        key: :enabled,
        type: :boolean,
        description: "Whether the managed content security policy is enabled",
        suggestions: [true, false]
      },
      %{
        key: :sts,
        type: :boolean,
        description: "Whether to additionally send a Strict-Transport-Security header",
        suggestions: [true, false]
      },
      %{
        key: :sts_max_age,
        type: :integer,
        description: "The maximum age for the Strict-Transport-Security header if sent",
        suggestions: [31_536_000]
      },
      %{
        key: :ct_max_age,
        type: :integer,
        description: "The maximum age for the Expect-CT header if sent",
        suggestions: [2_592_000]
      },
      %{
        key: :referrer_policy,
        type: :string,
        description: "The referrer policy to use, either \"same-origin\" or \"no-referrer\"",
        suggestions: ["same-origin", "no-referrer"]
      },
      %{
        key: :report_uri,
        type: :string,
        description: "Adds the specified url to report-uri and report-to group in CSP header",
        suggestions: ["https://example.com/report-uri"]
      }
    ]
  },
  %{
    group: :web_push_encryption,
    key: :vapid_details,
    type: :group,
    description:
      "Web Push Notifications configuration. You can use the mix task mix web_push.gen.keypair to generate it",
    children: [
      %{
        key: :subject,
        type: :string,
        description:
          "a mailto link for the administrative contact." <>
            " It's best if this email is not a personal email address, but rather a group email so that if a person leaves an organization," <>
            " is unavailable for an extended period, or otherwise can't respond, someone else on the list can",
        suggestions: ["Subject"]
      },
      %{
        key: :public_key,
        type: :string,
        description: "VAPID public key",
        suggestions: ["Public key"]
      },
      %{
        key: :private_key,
        type: :string,
        description: "VAPID private keyn",
        suggestions: ["Private key"]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.Captcha,
    type: :group,
    description: "Captcha-related settings",
    children: [
      %{
        key: :enabled,
        type: :boolean,
        description: "Whether the captcha should be shown on registration",
        suggestions: [true, false]
      },
      %{
        key: :method,
        type: :module,
        description: "The method/service to use for captcha",
        suggestions: [Pleroma.Captcha.Kocaptcha]
      },
      %{
        key: :seconds_valid,
        type: :integer,
        description: "The time in seconds for which the captcha is valid",
        suggestions: [60]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.Captcha.Kocaptcha,
    type: :group,
    description:
      "Kocaptcha is a very simple captcha service with a single API endpoint, the source code is" <>
        " here: https://github.com/koto-bank/kocaptcha. The default endpoint https://captcha.kotobank.ch is hosted by the developer",
    children: [
      %{
        key: :endpoint,
        type: :string,
        description: "the kocaptcha endpoint to use",
        suggestions: ["https://captcha.kotobank.ch"]
      }
    ]
  },
  %{
    group: :pleroma,
    type: :group,
    description:
      "Allows to set a token that can be used to authenticate with the admin api without using an actual user by giving it as the 'admin_token' parameter",
    children: [
      %{
        key: :admin_token,
        type: :string,
        description: "Token",
        suggestions: ["some_random_token"]
      }
    ]
  },
  %{
    group: :pleroma_job_queue,
    key: :queues,
    type: :group,
    description: "[Deprecated] Replaced with `Oban`/`:queues` (keeping the same format)",
    children: []
  },
  %{
    group: :pleroma,
    key: Pleroma.Web.Federator.RetryQueue,
    type: :group,
    description: "[Deprecated] See `Oban` and `:workers` sections for configuration notes",
    children: [
      %{
        key: :max_retries,
        type: :integer,
        description: "[Deprecated] Replaced as `Oban`/`:queues`/`:outgoing_federation` value",
        suggestions: []
      }
    ]
  },
  %{
    group: :pleroma,
    key: Oban,
    type: :group,
    description: """
    [Oban](https://github.com/sorentwo/oban) asynchronous job processor configuration.

    Note: if you are running PostgreSQL in [`silent_mode`](https://postgresqlco.nf/en/doc/param/silent_mode?version=9.1),
      it's advised to set [`log_destination`](https://postgresqlco.nf/en/doc/param/log_destination?version=9.1) to `syslog`,
      otherwise `postmaster.log` file may grow because of "you don't own a lock of type ShareLock" warnings
      (see https://github.com/sorentwo/oban/issues/52).
    """,
    children: [
      %{
        key: :repo,
        type: :module,
        description: "Application's Ecto repo",
        suggestions: [Pleroma.Repo]
      },
      %{
        key: :verbose,
        type: :boolean,
        description: "Logs verbose mode",
        suggestions: [false, true]
      },
      %{
        key: :prune,
        type: [:atom, :tuple],
        description:
          "Non-retryable jobs [pruning settings](https://github.com/sorentwo/oban#pruning)",
        suggestions: [:disabled, {:maxlen, 1500}, {:maxage, 60 * 60}]
      },
      %{
        key: :queues,
        type: :keyword,
        description:
          "Background jobs queues (keys: queues, values: max numbers of concurrent jobs)",
        suggestions: [
          [
            activity_expiration: 10,
            background: 5,
            federator_incoming: 50,
            federator_outgoing: 50,
            mailer: 10,
            scheduled_activities: 10,
            transmogrifier: 20,
            web_push: 50
          ]
        ],
        children: [
          %{
            key: :activity_expiration,
            type: :integer,
            description: "Activity expiration queue",
            suggestions: [10]
          },
          %{
            key: :background,
            type: :integer,
            description: "Background queue",
            suggestions: [5]
          },
          %{
            key: :federator_incoming,
            type: :integer,
            description: "Incoming federation queue",
            suggestions: [50]
          },
          %{
            key: :federator_outgoing,
            type: :integer,
            description: "Outgoing federation queue",
            suggestions: [50]
          },
          %{
            key: :mailer,
            type: :integer,
            description: "Email sender queue, see Pleroma.Emails.Mailer",
            suggestions: [10]
          },
          %{
            key: :scheduled_activities,
            type: :integer,
            description: "Scheduled activities queue, see Pleroma.ScheduledActivities",
            suggestions: [10]
          },
          %{
            key: :transmogrifier,
            type: :integer,
            description: "Transmogrifier queue",
            suggestions: [20]
          },
          %{
            key: :web_push,
            type: :integer,
            description: "Web push notifications queue",
            suggestions: [50]
          }
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :workers,
    type: :group,
    description: "Includes custom worker options not interpretable directly by `Oban`",
    children: [
      %{
        key: :retries,
        type: :keyword,
        description: "Max retry attempts for failed jobs, per `Oban` queue",
        suggestions: [
          [
            federator_incoming: 5,
            federator_outgoing: 5
          ]
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.Web.Metadata,
    type: :group,
    decsription: "Metadata-related settings",
    children: [
      %{
        key: :providers,
        type: {:list, :module},
        description: "List of metadata providers to enable",
        suggestions: [
          [
            Pleroma.Web.Metadata.Providers.OpenGraph,
            Pleroma.Web.Metadata.Providers.TwitterCard,
            Pleroma.Web.Metadata.Providers.RelMe
          ]
        ]
      },
      %{
        key: :unfurl_nsfw,
        type: :boolean,
        description: "If set to true nsfw attachments will be shown in previews",
        suggestions: [
          true,
          false
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :rich_media,
    type: :group,
    description: "",
    children: [
      %{
        key: :enabled,
        type: :boolean,
        description:
          "if enabled the instance will parse metadata from attached links to generate link previews",
        suggestions: [true, false]
      },
      %{
        key: :ignore_hosts,
        type: {:list, :string},
        description: "list of hosts which will be ignored by the metadata parser",
        suggestions: [["accounts.google.com", "xss.website"]]
      },
      %{
        key: :ignore_tld,
        type: {:list, :string},
        description: "list TLDs (top-level domains) which will ignore for parse metadata",
        suggestions: [["local", "localdomain", "lan"]]
      },
      %{
        key: :parsers,
        type: {:list, :module},
        description: "list of Rich Media parsers",
        suggestions: [
          Generator.richmedia_parsers()
        ]
      },
      %{
        key: :ttl_setters,
        type: {:list, :module},
        description: "list of rich media ttl setters",
        suggestions: [
          [Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl]
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :fetch_initial_posts,
    type: :group,
    description: "Fetching initial posts settings",
    children: [
      %{
        key: :enabled,
        type: :boolean,
        description:
          "if enabled, when a new user is federated with, fetch some of their latest posts",
        suggestions: [true, false]
      },
      %{
        key: :pages,
        type: :integer,
        description: "the amount of pages to fetch",
        suggestions: [5]
      }
    ]
  },
  %{
    group: :auto_linker,
    key: :opts,
    type: :group,
    description: "Configuration for the auto_linker library",
    children: [
      %{
        key: :class,
        type: [:string, false],
        description: "specify the class to be added to the generated link. false to clear",
        suggestions: ["auto-linker", false]
      },
      %{
        key: :rel,
        type: [:string, false],
        description: "override the rel attribute. false to clear",
        suggestions: ["noopener noreferrer", false]
      },
      %{
        key: :new_window,
        type: :boolean,
        description: "set to false to remove target='_blank' attribute",
        suggestions: [true, false]
      },
      %{
        key: :scheme,
        type: :boolean,
        description: "Set to true to link urls with schema http://google.com",
        suggestions: [true, false]
      },
      %{
        key: :truncate,
        type: [:integer, false],
        description:
          "Set to a number to truncate urls longer then the number. Truncated urls will end in `..`",
        suggestions: [15, false]
      },
      %{
        key: :strip_prefix,
        type: :boolean,
        description: "Strip the scheme prefix",
        suggestions: [true, false]
      },
      %{
        key: :extra,
        type: :boolean,
        description: "link urls with rarely used schemes (magnet, ipfs, irc, etc.)",
        suggestions: [true, false]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.ScheduledActivity,
    type: :group,
    description: "Scheduled activities settings",
    children: [
      %{
        key: :daily_user_limit,
        type: :integer,
        description:
          "the number of scheduled activities a user is allowed to create in a single day (Default: 25)",
        suggestions: [25]
      },
      %{
        key: :total_user_limit,
        type: :integer,
        description:
          "the number of scheduled activities a user is allowed to create in total (Default: 300)",
        suggestions: [300]
      },
      %{
        key: :enabled,
        type: :boolean,
        description: "whether scheduled activities are sent to the job queue to be executed",
        suggestions: [true, false]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.ActivityExpiration,
    type: :group,
    description: "Expired activity settings",
    children: [
      %{
        key: :enabled,
        type: :boolean,
        description: "whether expired activities will be sent to the job queue to be deleted",
        suggestions: [true, false]
      }
    ]
  },
  %{
    group: :pleroma,
    type: :group,
    description: "Authenticator",
    children: [
      %{
        key: Pleroma.Web.Auth.Authenticator,
        type: :module,
        description: "",
        suggestions: [Pleroma.Web.Auth.PleromaAuthenticator, Pleroma.Web.Auth.LDAPAuthenticator]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :ldap,
    type: :group,
    description:
      "Use LDAP for user authentication. When a user logs in to the Pleroma instance, the name and password" <>
        " will be verified by trying to authenticate (bind) to an LDAP server." <>
        " If a user exists in the LDAP directory but there is no account with the same name yet on the" <>
        " Pleroma instance then a new Pleroma account will be created with the same name as the LDAP user name.",
    children: [
      %{
        key: :enabled,
        type: :boolean,
        description: "enables LDAP authentication",
        suggestions: [true, false]
      },
      %{
        key: :host,
        type: :string,
        description: "LDAP server hostname",
        suggestions: ["localhosts"]
      },
      %{
        key: :port,
        type: :integer,
        description: "LDAP port, e.g. 389 or 636",
        suggestions: [389, 636]
      },
      %{
        key: :ssl,
        type: :boolean,
        description: "true to use SSL, usually implies the port 636",
        suggestions: [true, false]
      },
      %{
        key: :sslopts,
        type: :keyword,
        description: "additional SSL options",
        suggestions: []
      },
      %{
        key: :tls,
        type: :boolean,
        description: "true to start TLS, usually implies the port 389",
        suggestions: [true, false]
      },
      %{
        key: :tlsopts,
        type: :keyword,
        description: "additional TLS options",
        suggestions: []
      },
      %{
        key: :base,
        type: :string,
        description: "LDAP base, e.g. \"dc=example,dc=com\"",
        suggestions: ["dc=example,dc=com"]
      },
      %{
        key: :uid,
        type: :string,
        description:
          "LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter will be \"cn=username,base\"",
        suggestions: ["cn"]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :auth,
    type: :group,
    description: "Authentication / authorization settings",
    children: [
      %{
        key: :auth_template,
        type: :string,
        description:
          "authentication form template. By default it's show.html which corresponds to lib/pleroma/web/templates/o_auth/o_auth/show.html.ee",
        suggestions: ["show.html"]
      },
      %{
        key: :oauth_consumer_template,
        type: :string,
        description:
          "OAuth consumer mode authentication form template. By default it's consumer.html which corresponds to" <>
            " lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex",
        suggestions: ["consumer.html"]
      },
      %{
        key: :oauth_consumer_strategies,
        type: :string,
        description:
          "the list of enabled OAuth consumer strategies; by default it's set by OAUTH_CONSUMER_STRATEGIES environment variable." <>
            " Each entry in this space-delimited string should be of format <strategy> or <strategy>:<dependency>" <>
            " (e.g. twitter or keycloak:ueberauth_keycloak_strategy in case dependency is named differently than ueberauth_<strategy>).",
        suggestions: ["twitter", "keycloak:ueberauth_keycloak_strategy"]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :email_notifications,
    type: :group,
    description: "Email notifications settings",
    children: [
      %{
        key: :digest,
        type: :map,
        description:
          "emails of \"what you've missed\" for users who have been inactive for a while",
        suggestions: [
          %{
            active: false,
            schedule: "0 0 * * 0",
            interval: 7,
            inactivity_threshold: 7
          }
        ],
        children: [
          %{
            key: :active,
            type: :boolean,
            description: "globally enable or disable digest emails",
            suggestions: [true, false]
          },
          %{
            key: :schedule,
            type: :string,
            description:
              "When to send digest email, in crontab format. \"0 0 0\" is the default, meaning \"once a week at midnight on Sunday morning\"",
            suggestions: ["0 0 * * 0"]
          },
          %{
            key: :interval,
            type: :ininteger,
            description: "Minimum interval between digest emails to one user",
            suggestions: [7]
          },
          %{
            key: :inactivity_threshold,
            type: :integer,
            description: "Minimum user inactivity threshold",
            suggestions: [7]
          }
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.Emails.UserEmail,
    type: :group,
    description: "Email template settings",
    children: [
      %{
        key: :logo,
        # type: [:string, nil],
        description: "a path to a custom logo. Set it to nil to use the default Pleroma logo",
        suggestions: ["some/path/logo.png", nil]
      },
      %{
        key: :styling,
        type: :map,
        description: "a map with color settings for email templates.",
        suggestions: [
          %{
            link_color: "#d8a070",
            background_color: "#2C3645",
            content_background_color: "#1B2635",
            header_color: "#d8a070",
            text_color: "#b9b9ba",
            text_muted_color: "#b9b9ba"
          }
        ],
        children: [
          %{
            key: :link_color,
            type: :string,
            description: "",
            suggestions: ["#d8a070"]
          },
          %{
            key: :background_color,
            type: :string,
            description: "",
            suggestions: ["#2C3645"]
          },
          %{
            key: :content_background_color,
            type: :string,
            description: "",
            suggestions: ["#1B2635"]
          },
          %{
            key: :header_color,
            type: :string,
            description: "",
            suggestions: ["#d8a070"]
          },
          %{
            key: :text_color,
            type: :string,
            description: "",
            suggestions: ["#b9b9ba"]
          },
          %{
            key: :text_muted_color,
            type: :string,
            description: "",
            suggestions: ["#b9b9ba"]
          }
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :oauth2,
    type: :group,
    description: "Configure OAuth 2 provider capabilities",
    children: [
      %{
        key: :token_expires_in,
        type: :integer,
        description: "The lifetime in seconds of the access token",
        suggestions: [600]
      },
      %{
        key: :issue_new_refresh_token,
        type: :boolean,
        description:
          "Keeps old refresh token or generate new refresh token when to obtain an access token",
        suggestions: [true, false]
      },
      %{
        key: :clean_expired_tokens,
        type: :boolean,
        description: "Enable a background job to clean expired oauth tokens. Defaults to false",
        suggestions: [true, false]
      },
      %{
        key: :clean_expired_tokens_interval,
        type: :integer,
        description:
          "Interval to run the job to clean expired tokens. Defaults to 86_400_000 (24 hours).",
        suggestions: [86_400_000]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :emoji,
    type: :group,
    description: "",
    children: [
      %{
        key: :shortcode_globs,
        type: {:list, :string},
        description: "Location of custom emoji files. * can be used as a wildcard",
        suggestions: [["/emoji/custom/**/*.png"]]
      },
      %{
        key: :pack_extensions,
        type: {:list, :string},
        description:
          "A list of file extensions for emojis, when no emoji.txt for a pack is present",
        suggestions: [[".png", ".gif"]]
      },
      %{
        key: :groups,
        type: :keyword,
        description:
          "Emojis are ordered in groups (tags). This is an array of key-value pairs where the key is the groupname" <>
            " and the value the location or array of locations. * can be used as a wildcard",
        suggestions: [
          [
            # Put groups that have higher priority than defaults here. Example in `docs/config/custom_emoji.md`
            Custom: ["/emoji/*.png", "/emoji/**/*.png"]
          ]
        ]
      },
      %{
        key: :default_manifest,
        type: :string,
        description:
          "Location of the JSON-manifest. This manifest contains information about the emoji-packs you can download." <>
            " Currently only one manifest can be added (no arrays)",
        suggestions: ["https://git.pleroma.social/pleroma/emoji-index/raw/master/index.json"]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :database,
    type: :group,
    description: "Database related settings",
    children: [
      %{
        key: :rum_enabled,
        type: :boolean,
        description: "If RUM indexes should be used. Defaults to false",
        suggestions: [true, false]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :rate_limit,
    type: :group,
    description: "Rate limit settings. This is an advanced feature and disabled by default.",
    children: [
      %{
        key: :search,
        type: [:tuple, {:list, :tuple}],
        description: "for the search requests (account & status search etc.)",
        suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
      },
      %{
        key: :app_account_creation,
        type: [:tuple, {:list, :tuple}],
        description: "for registering user accounts from the same IP address",
        suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
      },
      %{
        key: :relations_actions,
        type: [:tuple, {:list, :tuple}],
        description: "for actions on relations with all users (follow, unfollow)",
        suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
      },
      %{
        key: :relation_id_action,
        type: [:tuple, {:list, :tuple}],
        description: "for actions on relation with a specific user (follow, unfollow)",
        suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
      },
      %{
        key: :statuses_actions,
        type: [:tuple, {:list, :tuple}],
        description:
          "for create / delete / fav / unfav / reblog / unreblog actions on any statuses",
        suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
      },
      %{
        key: :status_id_action,
        type: [:tuple, {:list, :tuple}],
        description:
          "for fav / unfav or reblog / unreblog actions on the same status by the same user",
        suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
      }
    ]
  },
  %{
    group: :esshd,
    type: :group,
    description:
      "To enable simple command line interface accessible over ssh, add a setting like this to your configuration file",
    children: [
      %{
        key: :enabled,
        type: :boolean,
        description: "Enables ssh",
        suggestions: [true, false]
      },
      %{
        key: :priv_dir,
        type: :string,
        description: "Dir with ssh keys",
        suggestions: ["/some/path/ssh_keys"]
      },
      %{
        key: :handler,
        type: :string,
        description: "Handler module",
        suggestions: ["Pleroma.BBS.Handler"]
      },
      %{
        key: :port,
        type: :integer,
        description: "Port to connect",
        suggestions: [10_022]
      },
      %{
        key: :password_authenticator,
        type: :string,
        description: "Authenticator module",
        suggestions: ["Pleroma.BBS.Authenticator"]
      }
    ]
  },
  %{
    group: :mime,
    type: :group,
    description: "Mime types",
    children: [
      %{
        key: :types,
        type: :map,
        description: "",
        suggestions: [
          %{
            "application/xml" => ["xml"],
            "application/xrd+xml" => ["xrd+xml"],
            "application/jrd+json" => ["jrd+json"],
            "application/activity+json" => ["activity+json"],
            "application/ld+json" => ["activity+json"]
          }
        ],
        children: [
          %{
            key: "application/xml",
            type: {:list, :string},
            description: "",
            suggestions: [["xml"]]
          },
          %{
            key: "application/xrd+xml",
            type: {:list, :string},
            description: "",
            suggestions: [["xrd+xml"]]
          },
          %{
            key: "application/jrd+json",
            type: {:list, :string},
            description: "",
            suggestions: [["jrd+json"]]
          },
          %{
            key: "application/activity+json",
            type: {:list, :string},
            description: "",
            suggestions: [["activity+json"]]
          },
          %{
            key: "application/ld+json",
            type: {:list, :string},
            description: "",
            suggestions: [["activity+json"]]
          }
        ]
      }
    ]
  },
  %{
    group: :tesla,
    type: :group,
    description: "Tesla settings",
    children: [
      %{
        key: :adapter,
        type: :module,
        description: "Tesla adapter",
        suggestions: [Tesla.Adapter.Hackney]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :chat,
    type: :group,
    description: "Pleroma chat settings",
    children: [
      %{
        key: :enabled,
        type: :boolean,
        description: "",
        suggestions: [true, false]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :suggestions,
    type: :group,
    description: "",
    children: [
      %{
        key: :enabled,
        type: :boolean,
        description: "Enables suggestions",
        suggestions: []
      },
      %{
        key: :third_party_engine,
        type: :string,
        description: "URL for third party engine",
        suggestions: [
          "http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-suggestions-api.cgi?{{host}}+{{user}}"
        ]
      },
      %{
        key: :timeout,
        type: :integer,
        description: "Request timeout to third party engine",
        suggestions: [300_000]
      },
      %{
        key: :limit,
        type: :integer,
        description: "Limit for suggestions",
        suggestions: [40]
      },
      %{
        key: :web,
        type: :string,
        description: "",
        suggestions: ["https://vinayaka.distsn.org"]
      }
    ]
  },
  %{
    group: :prometheus,
    key: Pleroma.Web.Endpoint.MetricsExporter,
    type: :group,
    description: "Prometheus settings",
    children: [
      %{
        key: :path,
        type: :string,
        description: "API endpoint with metrics",
        suggestions: ["/api/pleroma/app_metrics"]
      }
    ]
  },
  %{
    group: :http_signatures,
    type: :group,
    description: "HTTP Signatures settings",
    children: [
      %{
        key: :adapter,
        type: :module,
        description: "",
        suggestions: [Pleroma.Signature]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.Uploaders.MDII,
    type: :group,
    description: "",
    children: [
      %{
        key: :cgi,
        type: :string,
        description: "",
        suggestions: ["https://mdii.sakura.ne.jp/mdii-post.cgi"]
      },
      %{
        key: :files,
        type: :string,
        description: "",
        suggestions: ["https://mdii.sakura.ne.jp"]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :http,
    type: :group,
    description: "HTTP settings",
    children: [
      %{
        key: :proxy_url,
        type: [:string, :atom, nil],
        description: "",
        suggestions: ["localhost:9020", {:socks5, :localhost, 3090}, nil]
      },
      %{
        key: :send_user_agent,
        type: :boolean,
        description: "",
        suggestions: [true, false]
      },
      %{
        key: :adapter,
        type: :keyword,
        description: "",
        suggestions: [
          [
            ssl_options: [
              # Workaround for remote server certificate chain issues
              partial_chain: &:hackney_connect.partial_chain/1,
              # We don't support TLS v1.3 yet
              versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"]
            ]
          ]
        ]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :markup,
    type: :group,
    description: "",
    children: [
      %{
        key: :allow_inline_images,
        type: :boolean,
        description: "",
        suggestions: [true, false]
      },
      %{
        key: :allow_headings,
        type: :boolean,
        description: "",
        suggestions: [true, false]
      },
      %{
        key: :allow_tables,
        type: :boolean,
        description: "",
        suggestions: [true, false]
      },
      %{
        key: :allow_fonts,
        type: :boolean,
        description: "",
        suggestions: [true, false]
      },
      %{
        key: :scrub_policy,
        type: {:list, :module},
        description: "",
        suggestions: [[Pleroma.HTML.Transform.MediaProxy, Pleroma.HTML.Scrubber.Default]]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :user,
    type: :group,
    description: "",
    children: [
      %{
        key: :deny_follow_blocked,
        type: :boolean,
        description: "",
        suggestions: [true, false]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :mrf_normalize_markup,
    type: :group,
    description: "",
    children: [
      %{
        key: :scrub_policy,
        type: :module,
        description: "",
        suggestions: [Pleroma.HTML.Scrubber.Default]
      }
    ]
  },
  %{
    group: :pleroma,
    key: Pleroma.User,
    type: :group,
    description: "",
    children: [
      %{
        key: :restricted_nicknames,
        type: {:list, :string},
        description: "",
        suggestions: [
          [
            ".well-known",
            "~",
            "about",
            "activities",
            "api",
            "auth",
            "check_password",
            "dev",
            "friend-requests",
            "inbox",
            "internal",
            "main",
            "media",
            "nodeinfo",
            "notice",
            "oauth",
            "objects",
            "ostatus_subscribe",
            "pleroma",
            "proxy",
            "push",
            "registration",
            "relay",
            "settings",
            "status",
            "tag",
            "user-search",
            "user_exists",
            "users",
            "web"
          ]
        ]
      }
    ]
  },
  %{
    group: :cors_plug,
    type: :group,
    description: "",
    children: [
      %{
        key: :max_age,
        type: :integer,
        description: "",
        suggestions: [86_400]
      },
      %{
        key: :methods,
        type: {:list, :string},
        description: "",
        suggestions: [["POST", "PUT", "DELETE", "GET", "PATCH", "OPTIONS"]]
      },
      %{
        key: :expose,
        type: :string,
        description: "",
        suggestions: [
          [
            "Link",
            "X-RateLimit-Reset",
            "X-RateLimit-Limit",
            "X-RateLimit-Remaining",
            "X-Request-Id",
            "Idempotency-Key"
          ]
        ]
      },
      %{
        key: :credentials,
        type: :boolean,
        description: "",
        suggestions: [true, false]
      },
      %{
        key: :headers,
        type: {:list, :string},
        description: "",
        suggestions: [["Authorization", "Content-Type", "Idempotency-Key"]]
      }
    ]
  },
  %{
    group: :pleroma,
    key: :web_cache_ttl,
    type: :group,
    description:
      "The expiration time for the web responses cache. Values should be in milliseconds or `nil` to disable expiration.",
    children: [
      %{
        key: :activity_pub,
        type: :integer,
        description:
          "activity pub routes (except question activities). Defaults to `nil` (no expiration).",
        suggestions: [30_000, nil]
      },
      %{
        key: :activity_pub_question,
        type: :integer,
        description:
          "activity pub routes (question activities). Defaults to `30_000` (30 seconds).",
        suggestions: [30_000]
      }
    ]
  }
]