use Mix.Config alias Pleroma.Docs.Generator websocket_config = [ path: "/websocket", serializer: [ {Phoenix.Socket.V1.JSONSerializer, "~> 1.0.0"}, {Phoenix.Socket.V2.JSONSerializer, "~> 2.0.0"} ], timeout: 60_000, transport_log: false, compress: false ] config :pleroma, :config_description, [ %{ group: :pleroma, key: Pleroma.Upload, type: :group, description: "Upload general settings", children: [ %{ key: :uploader, type: :module, description: "Module which will be used for uploads", suggestions: [ Generator.uploaders_list() ] }, %{ key: :filters, type: {:list, :module}, description: "List of filter modules for uploads", suggestions: [ Generator.filters_list() ] }, %{ key: :link_name, type: :boolean, description: "If enabled, a name parameter will be added to the url of the upload. For example `https://instance.tld/media/imagehash.png?name=realname.png`" }, %{ key: :base_url, type: :string, description: "Base url for the uploads, needed if you use CDN", suggestions: [ "https://cdn-host.com" ] }, %{ key: :proxy_remote, type: :boolean, description: "If enabled, requests to media stored using a remote uploader will be proxied instead of being redirected." }, %{ key: :proxy_opts, type: :keyword, description: "Proxy options, see `Pleroma.ReverseProxy` documentation" } ] }, %{ group: :pleroma, key: Pleroma.Uploaders.Local, type: :group, description: "Local uploader-related settings", children: [ %{ key: :uploads, type: :string, description: "Path where user uploads will be saved", suggestions: [ "uploads" ] } ] }, %{ group: :pleroma, key: Pleroma.Uploaders.S3, type: :group, description: "S3 uploader-related settings", children: [ %{ key: :bucket, type: :string, description: "S3 bucket", suggestions: [ "bucket" ] }, %{ key: :bucket_namespace, type: :string, description: "S3 bucket namespace", suggestions: ["pleroma"] }, %{ key: :public_endpoint, type: :string, description: "S3 endpoint", suggestions: ["https://s3.amazonaws.com"] }, %{ key: :truncated_namespace, type: :string, description: "If you use S3 compatible service such as Digital Ocean Spaces or CDN, set folder name or \"\" etc." <> " For example, when using CDN to S3 virtual host format, set \"\". At this time, write CNAME to CDN in public_endpoint." } ] }, %{ 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" }, %{ 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" }, %{ 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" }, %{ 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" }, %{ 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" }, %{ group: {:subgroup, Swoosh.Adapters.SocketLabs}, key: :api_key, type: :string, description: "`Swoosh.Adapters.SocketLabs` adapter specific setting" }, %{ group: {:subgroup, Swoosh.Adapters.Gmail}, key: :access_token, type: :string, description: "`Swoosh.Adapters.Gmail` adapter specific setting" } ] }, %{ 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" }, %{ key: :invites_enabled, type: :boolean, description: "Enable user invitations for admins (depends on registrations_open: false)" }, %{ key: :account_activation_required, type: :boolean, description: "Require users to confirm their emails before signing in" }, %{ key: :federating, type: :boolean, description: "Enable federation with other instances" }, %{ 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" }, %{ key: :rewrite_policy, type: {:list, :module}, description: "A list of MRF policies enabled", suggestions: [ Pleroma.Web.ActivityPub.MRF.NoOpPolicy, Generator.mrf_list() ] }, %{ key: :public, type: :boolean, description: "Makes the client API in authentificated mode-only except for user-profiles." <> " Useful for disabling the Local Timeline and The Whole Known Network" }, %{ 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" }, %{ 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)" }, %{ 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" }, %{ 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" }, %{ 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" }, %{ key: :healthcheck, type: :boolean, description: "If set to true, system data will be shown on /api/pleroma/healthcheck" }, %{ 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" }, %{ 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`" }, %{ key: :max_account_fields, type: :integer, description: "The maximum number of custom fields in the user profile (default: 10)", suggestions: [ 10 ] }, %{ key: :max_remote_account_fields, type: :integer, description: "The maximum number of custom fields in the remote user profile (default: 20)", suggestions: [ 20 ] }, %{ key: :account_field_name_length, type: :integer, description: "An account field name maximum length (default: 512)", suggestions: [ 512 ] }, %{ key: :account_field_value_length, type: :integer, description: "An account field value maximum length (default: 2048)", suggestions: [ 2048 ] }, %{ key: :external_user_synchronization, type: :boolean, description: "Enabling following/followers counters synchronization for external users" } ] }, %{ 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}, 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}, 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" }, %{ key: :scopeOptionsEnabled, type: :boolean, description: "Enable setting an notice visibility and subject/CW when posting" }, %{ key: :formattingOptionsEnabled, type: :boolean, description: "Enable setting a formatting different than plain-text (ie. HTML, Markdown) when posting, relates to :instance, allowed_post_formats" }, %{ key: :collapseMessageWithSubject, type: :boolean, description: "When a message has a subject(aka Content Warning), collapse it by default" }, %{ key: :hidePostStats, type: :boolean, description: "Hide notices statistics(repeats, favorites, ...)" }, %{ key: :hideUserStats, type: :boolean, description: "Hide profile statistics(posts, posts per day, followers, followings, ...)" }, %{ key: :scopeCopy, type: :boolean, description: "Copy the scope (private/unlisted/public) in replies to posts by default" }, %{ 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" } ] }, %{ 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" } ] } ] }, %{ 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, children: [ %{ key: :allow_followersonly, type: :boolean, description: "whether to allow followers-only posts" }, %{ key: :allow_direct, type: :boolean, description: "whether to allow direct messages" } ] }, %{ 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" }, %{ 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" }, %{ 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}, suggestions: [Pleroma.Web.Endpoint.Instrumenter] }, %{ key: :protocol, type: :string, suggestions: ["https"] }, %{ key: :secret_key_base, type: :string, suggestions: ["aK4Abxf29xU9TTDKre9coZPUgevcVCFQJe/5xP/7Lt4BEif6idBIbjupVbOrbKxl"] }, %{ key: :signing_salt, type: :string, suggestions: ["CqaoopA2"] }, %{ key: :render_errors, type: :keyword, suggestions: [[view: Pleroma.Web.ErrorView, accepts: ~w(json)]], children: [ %{ key: :view, type: :module, suggestions: [Pleroma.Web.ErrorView] }, %{ key: :accepts, type: {:list, :string}, suggestions: ["json"] } ] }, %{ key: :pubsub, type: :keyword, suggestions: [[name: Pleroma.PubSub, adapter: Phoenix.PubSub.PG2]], children: [ %{ key: :name, type: :module, suggestions: [Pleroma.PubSub] }, %{ key: :adapter, type: :module, suggestions: [Phoenix.PubSub.PG2] } ] }, %{ key: :secure_cookie_flag, type: :boolean }, %{ key: :extra_cookie_attrs, type: {:list, :string}, 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" }, %{ key: :outgoing_blocks, type: :boolean, description: "Whether to federate blocks to other instances" }, %{ key: :sign_object_fetches, type: :boolean, description: "Sign object fetches with HTTP signatures" }, %{ 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" }, %{ key: :sts, type: :boolean, description: "Whether to additionally send a Strict-Transport-Security header" }, %{ 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" }, %{ key: :method, type: :module, description: "The method/service to use for captcha", suggestions: [Pleroma.Captcha.Kocaptcha] }, %{ key: :seconds_valid, type: :integer, description: "The time in seconds for which the captcha is valid", suggestions: [60] } ] }, %{ group: :pleroma, key: Pleroma.Captcha.Kocaptcha, type: :group, description: "Kocaptcha is a very simple captcha service with a single API endpoint, the source code is" <> " here: https://github.com/koto-bank/kocaptcha. The default endpoint https://captcha.kotobank.ch is hosted by the developer", children: [ %{ key: :endpoint, type: :string, description: "the kocaptcha endpoint to use", suggestions: ["https://captcha.kotobank.ch"] } ] }, %{ group: :pleroma, type: :group, description: "Allows to set a token that can be used to authenticate with the admin api without using an actual user by giving it as the 'admin_token' parameter", children: [ %{ key: :admin_token, type: :string, description: "Token", suggestions: ["some_random_token"] } ] }, %{ group: :pleroma_job_queue, key: :queues, type: :group, description: "[Deprecated] Replaced with `Oban`/`:queues` (keeping the same format)" }, %{ group: :pleroma, key: Pleroma.Web.Federator.RetryQueue, type: :group, description: "[Deprecated] See `Oban` and `:workers` sections for configuration notes", children: [ %{ key: :max_retries, type: :integer, description: "[Deprecated] Replaced as `Oban`/`:queues`/`:outgoing_federation` value" } ] }, %{ group: :pleroma, key: Oban, type: :group, description: """ [Oban](https://github.com/sorentwo/oban) asynchronous job processor configuration. Note: if you are running PostgreSQL in [`silent_mode`](https://postgresqlco.nf/en/doc/param/silent_mode?version=9.1), it's advised to set [`log_destination`](https://postgresqlco.nf/en/doc/param/log_destination?version=9.1) to `syslog`, otherwise `postmaster.log` file may grow because of "you don't own a lock of type ShareLock" warnings (see https://github.com/sorentwo/oban/issues/52). """, children: [ %{ key: :repo, type: :module, description: "Application's Ecto repo", suggestions: [Pleroma.Repo] }, %{ key: :verbose, type: :boolean, description: "Logs verbose mode" }, %{ key: :prune, type: [:atom, :tuple], description: "Non-retryable jobs [pruning settings](https://github.com/sorentwo/oban#pruning)", suggestions: [:disabled, {:maxlen, 1500}, {:maxage, 60 * 60}] }, %{ key: :queues, type: :keyword, description: "Background jobs queues (keys: queues, values: max numbers of concurrent jobs)", suggestions: [ [ activity_expiration: 10, background: 5, federator_incoming: 50, federator_outgoing: 50, mailer: 10, scheduled_activities: 10, transmogrifier: 20, web_push: 50 ] ], children: [ %{ key: :activity_expiration, type: :integer, description: "Activity expiration queue", suggestions: [10] }, %{ key: :background, type: :integer, description: "Background queue", suggestions: [5] }, %{ key: :federator_incoming, type: :integer, description: "Incoming federation queue", suggestions: [50] }, %{ key: :federator_outgoing, type: :integer, description: "Outgoing federation queue", suggestions: [50] }, %{ key: :mailer, type: :integer, description: "Email sender queue, see Pleroma.Emails.Mailer", suggestions: [10] }, %{ key: :scheduled_activities, type: :integer, description: "Scheduled activities queue, see Pleroma.ScheduledActivities", suggestions: [10] }, %{ key: :transmogrifier, type: :integer, description: "Transmogrifier queue", suggestions: [20] }, %{ key: :web_push, type: :integer, description: "Web push notifications queue", suggestions: [50] } ] } ] }, %{ group: :pleroma, key: :workers, type: :group, description: "Includes custom worker options not interpretable directly by `Oban`", children: [ %{ key: :retries, type: :keyword, description: "Max retry attempts for failed jobs, per `Oban` queue", suggestions: [ [ federator_incoming: 5, federator_outgoing: 5 ] ] } ] }, %{ group: :pleroma, key: Pleroma.Web.Metadata, type: :group, decsription: "Metadata-related settings", children: [ %{ key: :providers, type: {:list, :module}, description: "List of metadata providers to enable", suggestions: [ [ Pleroma.Web.Metadata.Providers.OpenGraph, Pleroma.Web.Metadata.Providers.TwitterCard, Pleroma.Web.Metadata.Providers.RelMe ] ] }, %{ key: :unfurl_nsfw, type: :boolean, description: "If set to true nsfw attachments will be shown in previews" } ] }, %{ group: :pleroma, key: :rich_media, type: :group, children: [ %{ key: :enabled, type: :boolean, description: "if enabled the instance will parse metadata from attached links to generate link previews" }, %{ key: :ignore_hosts, type: {:list, :string}, description: "list of hosts which will be ignored by the metadata parser", suggestions: [["accounts.google.com", "xss.website"]] }, %{ key: :ignore_tld, type: {:list, :string}, description: "list TLDs (top-level domains) which will ignore for parse metadata", suggestions: [["local", "localdomain", "lan"]] }, %{ key: :parsers, type: {:list, :module}, description: "list of Rich Media parsers", suggestions: [ Generator.richmedia_parsers() ] }, %{ key: :ttl_setters, type: {:list, :module}, description: "list of rich media ttl setters", suggestions: [ [Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl] ] } ] }, %{ group: :pleroma, key: :fetch_initial_posts, type: :group, description: "Fetching initial posts settings", children: [ %{ key: :enabled, type: :boolean, description: "if enabled, when a new user is federated with, fetch some of their latest posts" }, %{ 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" }, %{ key: :scheme, type: :boolean, description: "Set to true to link urls with schema http://google.com" }, %{ 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" }, %{ key: :extra, type: :boolean, description: "link urls with rarely used schemes (magnet, ipfs, irc, etc.)" } ] }, %{ 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" } ] }, %{ 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" } ] }, %{ group: :pleroma, type: :group, description: "Authenticator", children: [ %{ key: Pleroma.Web.Auth.Authenticator, type: :module, 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" }, %{ 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" }, %{ key: :sslopts, type: :keyword, description: "additional SSL options" }, %{ key: :tls, type: :boolean, description: "true to start TLS, usually implies the port 389" }, %{ key: :tlsopts, type: :keyword, description: "additional TLS options" }, %{ 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 or :" <> " (e.g. twitter or keycloak:ueberauth_keycloak_strategy in case dependency is named differently than ueberauth_).", 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" }, %{ 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, suggestions: ["#d8a070"] }, %{ key: :background_color, type: :string, suggestions: ["#2C3645"] }, %{ key: :content_background_color, type: :string, suggestions: ["#1B2635"] }, %{ key: :header_color, type: :string, suggestions: ["#d8a070"] }, %{ key: :text_color, type: :string, suggestions: ["#b9b9ba"] }, %{ key: :text_muted_color, type: :string, 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" }, %{ key: :clean_expired_tokens, type: :boolean, description: "Enable a background job to clean expired oauth tokens. Defaults to 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, 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"] }, %{ key: :shared_pack_cache_seconds_per_file, type: :integer, descpiption: "When an emoji pack is shared, the archive is created and cached in memory" <> " for this amount of seconds multiplied by the number of files.", suggestions: [60] } ] }, %{ 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" } ] }, %{ 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" }, %{ 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, 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}, suggestions: [["xml"]] }, %{ key: "application/xrd+xml", type: {:list, :string}, suggestions: [["xrd+xml"]] }, %{ key: "application/jrd+json", type: {:list, :string}, suggestions: [["jrd+json"]] }, %{ key: "application/activity+json", type: {:list, :string}, suggestions: [["activity+json"]] }, %{ key: "application/ld+json", type: {:list, :string}, 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 } ] }, %{ group: :pleroma, key: :suggestions, type: :group, children: [ %{ key: :enabled, type: :boolean, description: "Enables 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, 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, suggestions: [Pleroma.Signature] } ] }, %{ group: :pleroma, key: Pleroma.Uploaders.MDII, type: :group, children: [ %{ key: :cgi, type: :string, suggestions: ["https://mdii.sakura.ne.jp/mdii-post.cgi"] }, %{ key: :files, type: :string, suggestions: ["https://mdii.sakura.ne.jp"] } ] }, %{ group: :pleroma, key: :http, type: :group, description: "HTTP settings", children: [ %{ key: :proxy_url, type: [:string, :atom, nil], suggestions: ["localhost:9020", {:socks5, :localhost, 3090}, nil] }, %{ key: :send_user_agent, type: :boolean }, %{ key: :adapter, type: :keyword, 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, children: [ %{ key: :allow_inline_images, type: :boolean }, %{ key: :allow_headings, type: :boolean }, %{ key: :allow_tables, type: :boolean }, %{ key: :allow_fonts, type: :boolean }, %{ key: :scrub_policy, type: {:list, :module}, suggestions: [[Pleroma.HTML.Transform.MediaProxy, Pleroma.HTML.Scrubber.Default]] } ] }, %{ group: :pleroma, key: :user, type: :group, children: [ %{ key: :deny_follow_blocked, type: :boolean } ] }, %{ group: :pleroma, key: :mrf_normalize_markup, type: :group, children: [ %{ key: :scrub_policy, type: :module, suggestions: [Pleroma.HTML.Scrubber.Default] } ] }, %{ group: :pleroma, key: Pleroma.User, type: :group, children: [ %{ key: :restricted_nicknames, type: {:list, :string}, 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, children: [ %{ key: :max_age, type: :integer, suggestions: [86_400] }, %{ key: :methods, type: {:list, :string}, suggestions: [["POST", "PUT", "DELETE", "GET", "PATCH", "OPTIONS"]] }, %{ key: :expose, type: :string, suggestions: [ [ "Link", "X-RateLimit-Reset", "X-RateLimit-Limit", "X-RateLimit-Remaining", "X-Request-Id", "Idempotency-Key" ] ] }, %{ key: :credentials, type: :boolean }, %{ key: :headers, type: {:list, :string}, suggestions: [["Authorization", "Content-Type", "Idempotency-Key"]] } ] }, %{ group: :pleroma, key: :web_cache_ttl, type: :group, description: "The expiration time for the web responses cache. Values should be in milliseconds or `nil` to disable expiration.", children: [ %{ key: :activity_pub, type: :integer, description: "activity pub routes (except question activities). Defaults to `nil` (no expiration).", suggestions: [30_000, nil] }, %{ key: :activity_pub_question, type: :integer, description: "activity pub routes (question activities). Defaults to `30_000` (30 seconds).", suggestions: [30_000] } ] } ]