description.exs
authorAlex S <alex.strizhakov@gmail.com>
Fri, 30 Aug 2019 10:20:09 +0000 (13:20 +0300)
committerAlex S <alex.strizhakov@gmail.com>
Wed, 11 Sep 2019 06:25:33 +0000 (09:25 +0300)
config/description.exs [new file with mode: 0644]

diff --git a/config/description.exs b/config/description.exs
new file mode 100644 (file)
index 0000000..537b9d9
--- /dev/null
@@ -0,0 +1,2813 @@
+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"]]
+      }
+    ]
+  }
+]