--- /dev/null
+use Mix.Config
+alias Pleroma.Docs.Formatter
+
+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: [
+ Formatter.uploaders_list()
+ ]
+ },
+ %{
+ key: :filters,
+ type: {:list, :module},
+ description: "List of filter modules for uploads",
+ suggestions: [
+ Formatter.filters_list()
+ ]
+ },
+ %{
+ key: :link_name,
+ type: :boolean,
+ description: "If enabled Pleroma will add name parameter to the url off the upload",
+ 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, Pleroma will proxy media requests instead of redirecting to it",
+ suggestions: [
+ true,
+ false
+ ]
+ },
+ %{
+ key: :proxy_opts,
+ type: :keyword,
+ description: "Proxy options, see `Pleroma.ReverseProxy` documentation",
+ suggestions: ["somehow created link to Pleroma.ReverseProxy options"]
+ }
+ ]
+ },
+ %{
+ 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: :strings,
+ 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,
+ Formatter.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: 512)",
+ suggestions: [
+ 512
+ ]
+ },
+ %{
+ 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: "Pleroma Job Queue configuration: a list of queues with maximum concurrent jobs",
+ children: [
+ %{
+ key: :federator_outgoing,
+ type: :integer,
+ description: "Outgoing federation queue",
+ suggestions: [50]
+ },
+ %{
+ key: :federator_incoming,
+ type: :integer,
+ description: "Incoming federation queue",
+ suggestions: [50]
+ },
+ %{
+ key: :mailer,
+ type: :integer,
+ description: "Email sender queue, see Pleroma.Emails.Mailer",
+ suggestions: [10]
+ },
+ %{
+ key: :web_push,
+ type: :integer,
+ description: "Web push notifications queue",
+ suggestions: [50]
+ },
+ %{
+ key: :transmogrifier,
+ type: :integer,
+ description: "Transmogrifier queue",
+ suggestions: [20]
+ },
+ %{
+ key: :scheduled_activities,
+ type: :integer,
+ description: "Scheduled activities queue, see Pleroma.ScheduledActivities",
+ suggestions: [10]
+ },
+ %{
+ key: :activity_expiration,
+ type: :integer,
+ description: "Activity expiration queue",
+ suggestions: [10]
+ },
+ %{
+ key: :background,
+ type: :integer,
+ description: "Background queue",
+ suggestions: [5]
+ }
+ ]
+ },
+ %{
+ group: :pleroma,
+ key: Pleroma.Web.Federator.RetryQueue,
+ type: :group,
+ description: "",
+ children: [
+ %{
+ key: :enabled,
+ type: :boolean,
+ description: "If set to true, failed federation jobs will be retried",
+ suggestions: [true, false]
+ },
+ %{
+ key: :max_jobs,
+ type: :integer,
+ description: "The maximum amount of parallel federation jobs running at the same time",
+ suggestions: [20]
+ },
+ %{
+ key: :initial_timeout,
+ type: :integer,
+ description: "The initial timeout in seconds",
+ suggestions: [30]
+ },
+ %{
+ key: :max_retries,
+ type: :integer,
+ description: "The maximum number of times a federation job is retried",
+ suggestions: [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: [
+ Formatter.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"]]
+ }
+ ]
+ }
+]