First
[anni] / config / description.exs
1 import Config
2
3 websocket_config = [
4   path: "/websocket",
5   serializer: [
6     {Phoenix.Socket.V1.JSONSerializer, "~> 1.0.0"},
7     {Phoenix.Socket.V2.JSONSerializer, "~> 2.0.0"}
8   ],
9   timeout: 60_000,
10   transport_log: false,
11   compress: false
12 ]
13
14 installed_frontend_options = [
15   %{
16     key: "name",
17     label: "Name",
18     type: :string,
19     description:
20       "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
21   },
22   %{
23     key: "ref",
24     label: "Reference",
25     type: :string,
26     description:
27       "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values."
28   }
29 ]
30
31 frontend_options = [
32   %{
33     key: "name",
34     label: "Name",
35     type: :string,
36     description: "Name of the frontend."
37   },
38   %{
39     key: "ref",
40     label: "Reference",
41     type: :string,
42     description: "Reference of the frontend to be used."
43   },
44   %{
45     key: "git",
46     label: "Git Repository URL",
47     type: :string,
48     description: "URL of the git repository of the frontend"
49   },
50   %{
51     key: "build_url",
52     label: "Build URL",
53     type: :string,
54     description:
55       "Either an url to a zip file containing the frontend or a template to build it by inserting the `ref`. The string `${ref}` will be replaced by the configured `ref`.",
56     example: "https://some.url/builds/${ref}.zip"
57   },
58   %{
59     key: "build_dir",
60     label: "Build directory",
61     type: :string,
62     description: "The directory inside the zip file "
63   },
64   %{
65     key: "custom-http-headers",
66     label: "Custom HTTP headers",
67     type: {:list, :string},
68     description: "The custom HTTP headers for the frontend"
69   }
70 ]
71
72 config :pleroma, :config_description, [
73   %{
74     group: :pleroma,
75     key: Pleroma.Upload,
76     type: :group,
77     description: "Upload general settings",
78     children: [
79       %{
80         key: :uploader,
81         type: :module,
82         description: "Module which will be used for uploads",
83         suggestions: {:list_behaviour_implementations, Pleroma.Uploaders.Uploader}
84       },
85       %{
86         key: :filters,
87         type: {:list, :module},
88         description:
89           "List of filter modules for uploads. Module names are shortened (removed leading `Pleroma.Upload.Filter.` part), but on adding custom module you need to use full name.",
90         suggestions: {:list_behaviour_implementations, Pleroma.Upload.Filter}
91       },
92       %{
93         key: :link_name,
94         type: :boolean,
95         description:
96           "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`."
97       },
98       %{
99         key: :base_url,
100         label: "Base URL",
101         type: :string,
102         description:
103           "Base URL for the uploads. Required if you use a CDN or host attachments under a different domain.",
104         suggestions: [
105           "https://cdn-host.com"
106         ]
107       },
108       %{
109         key: :proxy_remote,
110         type: :boolean,
111         description: """
112         Proxy requests to the remote uploader.\n
113         Useful if media upload endpoint is not internet accessible.
114         """
115       },
116       %{
117         key: :filename_display_max_length,
118         type: :integer,
119         description: "Set max length of a filename to display. 0 = no limit. Default: 30"
120       }
121     ]
122   },
123   %{
124     group: :pleroma,
125     key: Pleroma.Uploaders.Local,
126     type: :group,
127     description: "Local uploader-related settings",
128     children: [
129       %{
130         key: :uploads,
131         type: :string,
132         description: "Path where user's uploads will be saved",
133         suggestions: [
134           "uploads"
135         ]
136       }
137     ]
138   },
139   %{
140     group: :pleroma,
141     key: Pleroma.Uploaders.S3,
142     type: :group,
143     description: "S3 uploader-related settings",
144     children: [
145       %{
146         key: :bucket,
147         type: :string,
148         description: "S3 bucket",
149         suggestions: [
150           "bucket"
151         ]
152       },
153       %{
154         key: :bucket_namespace,
155         type: :string,
156         description: "S3 bucket namespace",
157         suggestions: ["pleroma"]
158       },
159       %{
160         key: :truncated_namespace,
161         type: :string,
162         description:
163           "If you use S3 compatible service such as Digital Ocean Spaces or CDN, set folder name or \"\" etc." <>
164             " For example, when using CDN to S3 virtual host format, set \"\". At this time, write CNAME to CDN in Upload base_url."
165       },
166       %{
167         key: :streaming_enabled,
168         type: :boolean,
169         description:
170           "Enable streaming uploads, when enabled the file will be sent to the server in chunks as it's being read. This may be unsupported by some providers, try disabling this if you have upload problems."
171       }
172     ]
173   },
174   %{
175     group: :pleroma,
176     key: Pleroma.Upload.Filter.Mogrify,
177     type: :group,
178     description: "Uploads mogrify filter settings",
179     children: [
180       %{
181         key: :args,
182         type: [:string, {:list, :string}, {:list, :tuple}],
183         description:
184           "List of actions for the mogrify command. It's possible to add self-written settings as string. " <>
185             "For example `auto-orient, strip, {\"resize\", \"3840x1080>\"}` value will be parsed into valid list of the settings.",
186         suggestions: [
187           "strip",
188           "auto-orient",
189           {"implode", "1"}
190         ]
191       }
192     ]
193   },
194   %{
195     group: :pleroma,
196     key: Pleroma.Upload.Filter.AnonymizeFilename,
197     type: :group,
198     description: "Filter replaces the filename of the upload",
199     children: [
200       %{
201         key: :text,
202         type: :string,
203         description:
204           "Text to replace filenames in links. If no setting, {random}.extension will be used. You can get the original" <>
205             " filename extension by using {extension}, for example custom-file-name.{extension}.",
206         suggestions: [
207           "custom-file-name.{extension}"
208         ]
209       }
210     ]
211   },
212   %{
213     group: :pleroma,
214     key: Pleroma.Emails.Mailer,
215     type: :group,
216     description: "Mailer-related settings",
217     children: [
218       %{
219         key: :enabled,
220         label: "Mailer Enabled",
221         type: :boolean
222       },
223       %{
224         key: :adapter,
225         type: :module,
226         description:
227           "One of the mail adapters listed in [Swoosh documentation](https://hexdocs.pm/swoosh/Swoosh.html#module-adapters)",
228         suggestions: [
229           Swoosh.Adapters.AmazonSES,
230           Swoosh.Adapters.Dyn,
231           Swoosh.Adapters.Gmail,
232           Swoosh.Adapters.Mailgun,
233           Swoosh.Adapters.Mailjet,
234           Swoosh.Adapters.Mandrill,
235           Swoosh.Adapters.Postmark,
236           Swoosh.Adapters.SMTP,
237           Swoosh.Adapters.Sendgrid,
238           Swoosh.Adapters.Sendmail,
239           Swoosh.Adapters.SocketLabs,
240           Swoosh.Adapters.SparkPost
241         ]
242       },
243       %{
244         group: {:subgroup, Swoosh.Adapters.SMTP},
245         key: :relay,
246         type: :string,
247         description: "Hostname or IP address",
248         suggestions: ["smtp.example.com"]
249       },
250       %{
251         group: {:subgroup, Swoosh.Adapters.SMTP},
252         key: :port,
253         type: :integer,
254         description: "SMTP port",
255         suggestions: ["1025"]
256       },
257       %{
258         group: {:subgroup, Swoosh.Adapters.SMTP},
259         key: :username,
260         type: :string,
261         description: "SMTP AUTH username",
262         suggestions: ["user@example.com"]
263       },
264       %{
265         group: {:subgroup, Swoosh.Adapters.SMTP},
266         key: :password,
267         type: :string,
268         description: "SMTP AUTH password",
269         suggestions: ["password"]
270       },
271       %{
272         group: {:subgroup, Swoosh.Adapters.SMTP},
273         key: :ssl,
274         label: "Use SSL",
275         type: :boolean,
276         description: "Use Implicit SSL/TLS. e.g. port 465"
277       },
278       %{
279         group: {:subgroup, Swoosh.Adapters.SMTP},
280         key: :tls,
281         label: "STARTTLS Mode",
282         type: {:dropdown, :atom},
283         description: "Explicit TLS (STARTTLS) enforcement mode",
284         suggestions: [:if_available, :always, :never]
285       },
286       %{
287         group: {:subgroup, Swoosh.Adapters.SMTP},
288         key: :auth,
289         label: "AUTH Mode",
290         type: {:dropdown, :atom},
291         description: "SMTP AUTH enforcement mode",
292         suggestions: [:if_available, :always, :never]
293       },
294       %{
295         group: {:subgroup, Swoosh.Adapters.SMTP},
296         key: :retries,
297         type: :integer,
298         description: "SMTP temporary (4xx) error retries",
299         suggestions: [1]
300       },
301       %{
302         group: {:subgroup, Swoosh.Adapters.Sendgrid},
303         key: :api_key,
304         label: "SendGrid API Key",
305         type: :string,
306         suggestions: ["YOUR_API_KEY"]
307       },
308       %{
309         group: {:subgroup, Swoosh.Adapters.Sendmail},
310         key: :cmd_path,
311         type: :string,
312         suggestions: ["/usr/bin/sendmail"]
313       },
314       %{
315         group: {:subgroup, Swoosh.Adapters.Sendmail},
316         key: :cmd_args,
317         type: :string,
318         suggestions: ["-N delay,failure,success"]
319       },
320       %{
321         group: {:subgroup, Swoosh.Adapters.Sendmail},
322         key: :qmail,
323         label: "Qmail compat mode",
324         type: :boolean
325       },
326       %{
327         group: {:subgroup, Swoosh.Adapters.Mandrill},
328         key: :api_key,
329         label: "Mandrill API Key",
330         type: :string,
331         suggestions: ["YOUR_API_KEY"]
332       },
333       %{
334         group: {:subgroup, Swoosh.Adapters.Mailgun},
335         key: :api_key,
336         label: "Mailgun API Key",
337         type: :string,
338         suggestions: ["YOUR_API_KEY"]
339       },
340       %{
341         group: {:subgroup, Swoosh.Adapters.Mailgun},
342         key: :domain,
343         type: :string,
344         suggestions: ["YOUR_DOMAIN_NAME"]
345       },
346       %{
347         group: {:subgroup, Swoosh.Adapters.Mailjet},
348         key: :api_key,
349         label: "MailJet Public API Key",
350         type: :string,
351         suggestions: ["MJ_APIKEY_PUBLIC"]
352       },
353       %{
354         group: {:subgroup, Swoosh.Adapters.Mailjet},
355         key: :secret,
356         label: "MailJet Private API Key",
357         type: :string,
358         suggestions: ["MJ_APIKEY_PRIVATE"]
359       },
360       %{
361         group: {:subgroup, Swoosh.Adapters.Postmark},
362         key: :api_key,
363         label: "Postmark API Key",
364         type: :string,
365         suggestions: ["X-Postmark-Server-Token"]
366       },
367       %{
368         group: {:subgroup, Swoosh.Adapters.SparkPost},
369         key: :api_key,
370         label: "SparkPost API key",
371         type: :string,
372         suggestions: ["YOUR_API_KEY"]
373       },
374       %{
375         group: {:subgroup, Swoosh.Adapters.SparkPost},
376         key: :endpoint,
377         type: :string,
378         suggestions: ["https://api.sparkpost.com/api/v1"]
379       },
380       %{
381         group: {:subgroup, Swoosh.Adapters.AmazonSES},
382         key: :access_key,
383         label: "AWS Access Key",
384         type: :string,
385         suggestions: ["AWS_ACCESS_KEY"]
386       },
387       %{
388         group: {:subgroup, Swoosh.Adapters.AmazonSES},
389         key: :secret,
390         label: "AWS Secret Key",
391         type: :string,
392         suggestions: ["AWS_SECRET_KEY"]
393       },
394       %{
395         group: {:subgroup, Swoosh.Adapters.AmazonSES},
396         key: :region,
397         label: "AWS Region",
398         type: :string,
399         suggestions: ["us-east-1", "us-east-2"]
400       },
401       %{
402         group: {:subgroup, Swoosh.Adapters.Dyn},
403         key: :api_key,
404         label: "Dyn API Key",
405         type: :string,
406         suggestions: ["apikey"]
407       },
408       %{
409         group: {:subgroup, Swoosh.Adapters.SocketLabs},
410         key: :api_key,
411         label: "SocketLabs API Key",
412         type: :string,
413         suggestions: ["INJECTION_API_KEY"]
414       },
415       %{
416         group: {:subgroup, Swoosh.Adapters.SocketLabs},
417         key: :server_id,
418         label: "Server ID",
419         type: :string,
420         suggestions: ["SERVER_ID"]
421       },
422       %{
423         group: {:subgroup, Swoosh.Adapters.Gmail},
424         key: :access_token,
425         label: "GMail API Access Token",
426         type: :string,
427         suggestions: ["GMAIL_API_ACCESS_TOKEN"]
428       }
429     ]
430   },
431   %{
432     group: :pleroma,
433     key: :uri_schemes,
434     label: "URI Schemes",
435     type: :group,
436     description: "URI schemes related settings",
437     children: [
438       %{
439         key: :valid_schemes,
440         type: {:list, :string},
441         description: "List of the scheme part that is considered valid to be an URL",
442         suggestions: [
443           "https",
444           "http",
445           "dat",
446           "dweb",
447           "gopher",
448           "hyper",
449           "ipfs",
450           "ipns",
451           "irc",
452           "ircs",
453           "magnet",
454           "mailto",
455           "mumble",
456           "ssb",
457           "xmpp"
458         ]
459       }
460     ]
461   },
462   %{
463     group: :pleroma,
464     key: :features,
465     type: :group,
466     description: "Customizable features",
467     children: [
468       %{
469         key: :improved_hashtag_timeline,
470         type: {:dropdown, :atom},
471         description:
472           "Setting to force toggle / force disable improved hashtags timeline. `:enabled` forces hashtags to be fetched from `hashtags` table for hashtags timeline. `:disabled` forces object-embedded hashtags to be used (slower). Keep it `:auto` for automatic behaviour (it is auto-set to `:enabled` [unless overridden] when HashtagsTableMigrator completes).",
473         suggestions: [:auto, :enabled, :disabled]
474       }
475     ]
476   },
477   %{
478     group: :pleroma,
479     key: :populate_hashtags_table,
480     type: :group,
481     description: "`populate_hashtags_table` background migration settings",
482     children: [
483       %{
484         key: :fault_rate_allowance,
485         type: :float,
486         description:
487           "Max accepted rate of objects that failed in the migration. Any value from 0.0 which tolerates no errors to 1.0 which will enable the feature even if hashtags transfer failed for all records.",
488         suggestions: [0.01]
489       },
490       %{
491         key: :sleep_interval_ms,
492         type: :integer,
493         description:
494           "Sleep interval between each chunk of processed records in order to decrease the load on the system (defaults to 0 and should be keep default on most instances)."
495       }
496     ]
497   },
498   %{
499     group: :pleroma,
500     key: :delete_context_objects,
501     type: :group,
502     description: "`delete_context_objects` background migration settings",
503     children: [
504       %{
505         key: :fault_rate_allowance,
506         type: :float,
507         description:
508           "Max accepted rate of objects that failed in the migration. Any value from 0.0 which tolerates no errors to 1.0 which will enable the feature even if context object deletion failed for all records.",
509         suggestions: [0.01]
510       },
511       %{
512         key: :sleep_interval_ms,
513         type: :integer,
514         description:
515           "Sleep interval between each chunk of processed records in order to decrease the load on the system (defaults to 0 and should be keep default on most instances)."
516       }
517     ]
518   },
519   %{
520     group: :pleroma,
521     key: :instance,
522     type: :group,
523     description: "Instance-related settings",
524     children: [
525       %{
526         key: :name,
527         type: :string,
528         description: "Name of the instance",
529         suggestions: [
530           "Pleroma"
531         ]
532       },
533       %{
534         key: :email,
535         label: "Admin Email Address",
536         type: :string,
537         description: "Email used to reach an Administrator/Moderator of the instance",
538         suggestions: [
539           "email@example.com"
540         ]
541       },
542       %{
543         key: :notify_email,
544         label: "Sender Email Address",
545         type: :string,
546         description: "Envelope FROM address for mail sent via Pleroma",
547         suggestions: [
548           "notify@example.com"
549         ]
550       },
551       %{
552         key: :description,
553         type: :string,
554         description:
555           "The instance's description. It can be seen in nodeinfo and `/api/v1/instance`",
556         suggestions: [
557           "Very cool instance"
558         ]
559       },
560       %{
561         key: :short_description,
562         type: :string,
563         description:
564           "Shorter version of instance description. It can be seen on `/api/v1/instance`",
565         suggestions: [
566           "Cool instance"
567         ]
568       },
569       %{
570         key: :limit,
571         type: :integer,
572         description: "Posts character limit (CW/Subject included in the counter)",
573         suggestions: [
574           5_000
575         ]
576       },
577       %{
578         key: :remote_limit,
579         type: :integer,
580         description: "Hard character limit beyond which remote posts will be dropped",
581         suggestions: [
582           100_000
583         ]
584       },
585       %{
586         key: :max_media_attachments,
587         type: :integer,
588         description: "Maximum number of post media attachments",
589         suggestions: [
590           1_000_000
591         ]
592       },
593       %{
594         key: :upload_limit,
595         type: :integer,
596         description: "File size limit of uploads (except for avatar, background, banner)",
597         suggestions: [
598           16_000_000
599         ]
600       },
601       %{
602         key: :avatar_upload_limit,
603         type: :integer,
604         description: "File size limit of user's profile avatars",
605         suggestions: [
606           2_000_000
607         ]
608       },
609       %{
610         key: :background_upload_limit,
611         type: :integer,
612         description: "File size limit of user's profile backgrounds",
613         suggestions: [
614           4_000_000
615         ]
616       },
617       %{
618         key: :banner_upload_limit,
619         type: :integer,
620         description: "File size limit of user's profile banners",
621         suggestions: [
622           4_000_000
623         ]
624       },
625       %{
626         key: :poll_limits,
627         type: :map,
628         description: "A map with poll limits for local polls",
629         suggestions: [
630           %{
631             max_options: 20,
632             max_option_chars: 200,
633             min_expiration: 0,
634             max_expiration: 31_536_000
635           }
636         ],
637         children: [
638           %{
639             key: :max_options,
640             type: :integer,
641             description: "Maximum number of options",
642             suggestions: [20]
643           },
644           %{
645             key: :max_option_chars,
646             type: :integer,
647             description: "Maximum number of characters per option",
648             suggestions: [200]
649           },
650           %{
651             key: :min_expiration,
652             type: :integer,
653             description: "Minimum expiration time (in seconds)",
654             suggestions: [0]
655           },
656           %{
657             key: :max_expiration,
658             type: :integer,
659             description: "Maximum expiration time (in seconds)",
660             suggestions: [3600]
661           }
662         ]
663       },
664       %{
665         key: :registrations_open,
666         type: :boolean,
667         description:
668           "Enable registrations for anyone. Invitations require this setting to be disabled."
669       },
670       %{
671         key: :invites_enabled,
672         type: :boolean,
673         description:
674           "Enable user invitations for admins (depends on `registrations_open` being disabled)"
675       },
676       %{
677         key: :account_activation_required,
678         type: :boolean,
679         description: "Require users to confirm their emails before signing in"
680       },
681       %{
682         key: :account_approval_required,
683         type: :boolean,
684         description: "Require users to be manually approved by an admin before signing in"
685       },
686       %{
687         key: :federating,
688         type: :boolean,
689         description: "Enable federation with other instances"
690       },
691       %{
692         key: :federation_incoming_replies_max_depth,
693         label: "Fed. incoming replies max depth",
694         type: :integer,
695         description:
696           "Max. depth of reply-to and reply activities fetching on incoming federation, to prevent out-of-memory situations while" <>
697             " 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.",
698         suggestions: [
699           100
700         ]
701       },
702       %{
703         key: :federation_reachability_timeout_days,
704         label: "Fed. reachability timeout days",
705         type: :integer,
706         description:
707           "Timeout (in days) of each external federation target being unreachable prior to pausing federating to it",
708         suggestions: [
709           7
710         ]
711       },
712       %{
713         key: :allow_relay,
714         type: :boolean,
715         description:
716           "Permits remote instances to subscribe to all public posts of your instance. (Important!) This may increase the visibility of your instance."
717       },
718       %{
719         key: :public,
720         type: :boolean,
721         description:
722           "Makes the client API in authenticated mode-only except for user-profiles." <>
723             " Useful for disabling the Local Timeline and The Whole Known Network. " <>
724             " Note: when setting to `false`, please also check `:restrict_unauthenticated` setting."
725       },
726       %{
727         key: :quarantined_instances,
728         type: {:list, :tuple},
729         key_placeholder: "instance",
730         value_placeholder: "reason",
731         description:
732           "List of ActivityPub instances where private (DMs, followers-only) activities will not be sent and the reason for doing so",
733         suggestions: [
734           {"quarantined.com", "Reason"},
735           {"*.quarantined.com", "Reason"}
736         ]
737       },
738       %{
739         key: :static_dir,
740         type: :string,
741         description: "Instance static directory",
742         suggestions: [
743           "instance/static/"
744         ]
745       },
746       %{
747         key: :allowed_post_formats,
748         type: {:list, :string},
749         description: "MIME-type list of formats allowed to be posted (transformed into HTML)",
750         suggestions: [
751           "text/plain",
752           "text/html",
753           "text/markdown",
754           "text/bbcode"
755         ]
756       },
757       %{
758         key: :extended_nickname_format,
759         type: :boolean,
760         description:
761           "Enable to use extended local nicknames format (allows underscores/dashes)." <>
762             " This will break federation with older software for theses nicknames."
763       },
764       %{
765         key: :cleanup_attachments,
766         type: :boolean,
767         description: """
768         Enable to remove associated attachments when status is removed.
769         This will not affect duplicates and attachments without status.
770         Enabling this will increase load to database when deleting statuses on larger instances.
771         """
772       },
773       %{
774         key: :max_pinned_statuses,
775         type: :integer,
776         description: "The maximum number of pinned statuses. 0 will disable the feature.",
777         suggestions: [
778           0,
779           1,
780           3
781         ]
782       },
783       %{
784         key: :max_endorsed_users,
785         type: :integer,
786         description: "The maximum number of recommended accounts. 0 will disable the feature.",
787         suggestions: [
788           0,
789           1,
790           3
791         ]
792       },
793       %{
794         key: :autofollowed_nicknames,
795         type: {:list, :string},
796         description:
797           "Set to nicknames of (local) users that every new user should automatically follow"
798       },
799       %{
800         key: :autofollowing_nicknames,
801         type: {:list, :string},
802         description:
803           "Set to nicknames of (local) users that automatically follows every newly registered user"
804       },
805       %{
806         key: :attachment_links,
807         type: :boolean,
808         description: "Enable to automatically add attachment link text to statuses"
809       },
810       %{
811         key: :max_report_comment_size,
812         type: :integer,
813         description: "The maximum size of the report comment. Default: 1000.",
814         suggestions: [
815           1_000
816         ]
817       },
818       %{
819         key: :report_strip_status,
820         label: "Report strip status",
821         type: :boolean,
822         description:
823           "Strip associated statuses in reports to ids when closed/resolved, otherwise keep a copy"
824       },
825       %{
826         key: :safe_dm_mentions,
827         label: "Safe DM mentions",
828         type: :boolean,
829         description:
830           "If enabled, only mentions at the beginning of a post will be used to address people in direct messages." <>
831             " This is to prevent accidental mentioning of people when talking about them (e.g. \"@admin please keep an eye on @bad_actor\")." <>
832             " Default: disabled"
833       },
834       %{
835         key: :healthcheck,
836         type: :boolean,
837         description: "If enabled, system data will be shown on `/api/pleroma/healthcheck`"
838       },
839       %{
840         key: :remote_post_retention_days,
841         type: :integer,
842         description:
843           "The default amount of days to retain remote posts when pruning the database",
844         suggestions: [
845           90
846         ]
847       },
848       %{
849         key: :user_bio_length,
850         type: :integer,
851         description: "A user bio maximum length. Default: 5000.",
852         suggestions: [
853           5_000
854         ]
855       },
856       %{
857         key: :user_name_length,
858         type: :integer,
859         description: "A user name maximum length. Default: 100.",
860         suggestions: [
861           100
862         ]
863       },
864       %{
865         key: :skip_thread_containment,
866         type: :boolean,
867         description: "Skip filtering out broken threads. Default: enabled."
868       },
869       %{
870         key: :limit_to_local_content,
871         type: {:dropdown, :atom},
872         description:
873           "Limit unauthenticated users to search for local statutes and users only. Default: `:unauthenticated`.",
874         suggestions: [
875           :unauthenticated,
876           :all,
877           false
878         ]
879       },
880       %{
881         key: :max_account_fields,
882         type: :integer,
883         description: "The maximum number of custom fields in the user profile. Default: 10.",
884         suggestions: [
885           10
886         ]
887       },
888       %{
889         key: :max_remote_account_fields,
890         type: :integer,
891         description:
892           "The maximum number of custom fields in the remote user profile. Default: 20.",
893         suggestions: [
894           20
895         ]
896       },
897       %{
898         key: :account_field_name_length,
899         type: :integer,
900         description: "An account field name maximum length. Default: 512.",
901         suggestions: [
902           512
903         ]
904       },
905       %{
906         key: :account_field_value_length,
907         type: :integer,
908         description: "An account field value maximum length. Default: 2048.",
909         suggestions: [
910           2048
911         ]
912       },
913       %{
914         key: :registration_reason_length,
915         type: :integer,
916         description: "Maximum registration reason length. Default: 500.",
917         suggestions: [
918           500
919         ]
920       },
921       %{
922         key: :external_user_synchronization,
923         type: :boolean,
924         description: "Enabling following/followers counters synchronization for external users"
925       },
926       %{
927         key: :multi_factor_authentication,
928         type: :keyword,
929         description: "Multi-factor authentication settings",
930         suggestions: [
931           [
932             totp: [digits: 6, period: 30],
933             backup_codes: [number: 5, length: 16]
934           ]
935         ],
936         children: [
937           %{
938             key: :totp,
939             label: "TOTP settings",
940             type: :keyword,
941             description: "TOTP settings",
942             suggestions: [digits: 6, period: 30],
943             children: [
944               %{
945                 key: :digits,
946                 type: :integer,
947                 suggestions: [6],
948                 description:
949                   "Determines the length of a one-time pass-code, in characters. Defaults to 6 characters."
950               },
951               %{
952                 key: :period,
953                 type: :integer,
954                 suggestions: [30],
955                 description:
956                   "A period for which the TOTP code will be valid, in seconds. Defaults to 30 seconds."
957               }
958             ]
959           },
960           %{
961             key: :backup_codes,
962             type: :keyword,
963             description: "MFA backup codes settings",
964             suggestions: [number: 5, length: 16],
965             children: [
966               %{
967                 key: :number,
968                 type: :integer,
969                 suggestions: [5],
970                 description: "Number of backup codes to generate."
971               },
972               %{
973                 key: :length,
974                 type: :integer,
975                 suggestions: [16],
976                 description:
977                   "Determines the length of backup one-time pass-codes, in characters. Defaults to 16 characters."
978               }
979             ]
980           }
981         ]
982       },
983       %{
984         key: :instance_thumbnail,
985         type: {:string, :image},
986         description:
987           "The instance thumbnail can be any image that represents your instance and is used by some apps or services when they display information about your instance.",
988         suggestions: ["/instance/thumbnail.jpeg"]
989       },
990       %{
991         key: :show_reactions,
992         type: :boolean,
993         description: "Let favourites and emoji reactions be viewed through the API."
994       },
995       %{
996         key: :profile_directory,
997         type: :boolean,
998         description: "Enable profile directory."
999       },
1000       %{
1001         key: :admin_privileges,
1002         type: {:list, :atom},
1003         suggestions: [
1004           :users_read,
1005           :users_manage_invites,
1006           :users_manage_activation_state,
1007           :users_manage_tags,
1008           :users_manage_credentials,
1009           :users_delete,
1010           :messages_read,
1011           :messages_delete,
1012           :instances_delete,
1013           :reports_manage_reports,
1014           :moderation_log_read,
1015           :announcements_manage_announcements,
1016           :emoji_manage_emoji,
1017           :statistics_read
1018         ],
1019         description:
1020           "What extra privileges to allow admins (e.g. updating user credentials, get password reset token, delete users, index and read private statuses and chats)"
1021       },
1022       %{
1023         key: :moderator_privileges,
1024         type: {:list, :atom},
1025         suggestions: [
1026           :users_read,
1027           :users_manage_invites,
1028           :users_manage_activation_state,
1029           :users_manage_tags,
1030           :users_manage_credentials,
1031           :users_delete,
1032           :messages_read,
1033           :messages_delete,
1034           :instances_delete,
1035           :reports_manage_reports,
1036           :moderation_log_read,
1037           :announcements_manage_announcements,
1038           :emoji_manage_emoji,
1039           :statistics_read
1040         ],
1041         description:
1042           "What extra privileges to allow moderators (e.g. updating user credentials, get password reset token, delete users, index and read private statuses and chats)"
1043       },
1044       %{
1045         key: :birthday_required,
1046         type: :boolean,
1047         description: "Require users to enter their birthday."
1048       },
1049       %{
1050         key: :birthday_min_age,
1051         type: :integer,
1052         description:
1053           "Minimum required age (in days) for users to create account. Only used if birthday is required.",
1054         suggestions: [6570]
1055       }
1056     ]
1057   },
1058   %{
1059     group: :pleroma,
1060     key: :welcome,
1061     type: :group,
1062     description: "Welcome messages settings",
1063     children: [
1064       %{
1065         key: :direct_message,
1066         type: :keyword,
1067         descpiption: "Direct message settings",
1068         children: [
1069           %{
1070             key: :enabled,
1071             type: :boolean,
1072             description: "Enables sending a direct message to newly registered users"
1073           },
1074           %{
1075             key: :message,
1076             type: :string,
1077             description: "A message that will be sent to newly registered users",
1078             suggestions: [
1079               "Hi, @username! Welcome on board!"
1080             ]
1081           },
1082           %{
1083             key: :sender_nickname,
1084             type: :string,
1085             description: "The nickname of the local user that sends a welcome message",
1086             suggestions: [
1087               "lain"
1088             ]
1089           }
1090         ]
1091       },
1092       %{
1093         key: :chat_message,
1094         type: :keyword,
1095         descpiption: "Chat message settings",
1096         children: [
1097           %{
1098             key: :enabled,
1099             type: :boolean,
1100             description: "Enables sending a chat message to newly registered users"
1101           },
1102           %{
1103             key: :message,
1104             type: :string,
1105             description:
1106               "A message that will be sent to newly registered users as a chat message",
1107             suggestions: [
1108               "Hello, welcome on board!"
1109             ]
1110           },
1111           %{
1112             key: :sender_nickname,
1113             type: :string,
1114             description: "The nickname of the local user that sends a welcome chat message",
1115             suggestions: [
1116               "lain"
1117             ]
1118           }
1119         ]
1120       },
1121       %{
1122         key: :email,
1123         type: :keyword,
1124         descpiption: "Email message settings",
1125         children: [
1126           %{
1127             key: :enabled,
1128             type: :boolean,
1129             description: "Enables sending an email to newly registered users"
1130           },
1131           %{
1132             key: :sender,
1133             type: [:string, :tuple],
1134             description:
1135               "Email address and/or nickname that will be used to send the welcome email.",
1136             suggestions: [
1137               {"Pleroma App", "welcome@pleroma.app"}
1138             ]
1139           },
1140           %{
1141             key: :subject,
1142             type: :string,
1143             description:
1144               "Subject of the welcome email. EEX template with user and instance_name variables can be used.",
1145             suggestions: ["Welcome to <%= instance_name%>"]
1146           },
1147           %{
1148             key: :html,
1149             type: :string,
1150             description:
1151               "HTML content of the welcome email. EEX template with user and instance_name variables can be used.",
1152             suggestions: ["<h1>Hello <%= user.name%>. Welcome to <%= instance_name%></h1>"]
1153           },
1154           %{
1155             key: :text,
1156             type: :string,
1157             description:
1158               "Text content of the welcome email. EEX template with user and instance_name variables can be used.",
1159             suggestions: ["Hello <%= user.name%>. \n Welcome to <%= instance_name%>\n"]
1160           }
1161         ]
1162       }
1163     ]
1164   },
1165   %{
1166     group: :logger,
1167     type: :group,
1168     description: "Logger-related settings",
1169     children: [
1170       %{
1171         key: :backends,
1172         type: [:atom, :tuple, :module],
1173         description:
1174           "Where logs will be sent, :console - send logs to stdout, { ExSyslogger, :ex_syslogger } - to syslog, Quack.Logger - to Slack.",
1175         suggestions: [:console, {ExSyslogger, :ex_syslogger}, Quack.Logger]
1176       }
1177     ]
1178   },
1179   %{
1180     group: :logger,
1181     type: :group,
1182     key: :ex_syslogger,
1183     label: "ExSyslogger",
1184     description: "ExSyslogger-related settings",
1185     children: [
1186       %{
1187         key: :level,
1188         type: {:dropdown, :atom},
1189         description: "Log level",
1190         suggestions: [:debug, :info, :warn, :error]
1191       },
1192       %{
1193         key: :ident,
1194         type: :string,
1195         description:
1196           "A string that's prepended to every message, and is typically set to the app name",
1197         suggestions: ["pleroma"]
1198       },
1199       %{
1200         key: :format,
1201         type: :string,
1202         description: "Default: \"$date $time [$level] $levelpad$node $metadata $message\"",
1203         suggestions: ["$metadata[$level] $message"]
1204       },
1205       %{
1206         key: :metadata,
1207         type: {:list, :atom},
1208         suggestions: [:request_id]
1209       }
1210     ]
1211   },
1212   %{
1213     group: :logger,
1214     type: :group,
1215     key: :console,
1216     label: "Console Logger",
1217     description: "Console logger settings",
1218     children: [
1219       %{
1220         key: :level,
1221         type: {:dropdown, :atom},
1222         description: "Log level",
1223         suggestions: [:debug, :info, :warn, :error]
1224       },
1225       %{
1226         key: :format,
1227         type: :string,
1228         description: "Default: \"$date $time [$level] $levelpad$node $metadata $message\"",
1229         suggestions: ["$metadata[$level] $message"]
1230       },
1231       %{
1232         key: :metadata,
1233         type: {:list, :atom},
1234         suggestions: [:request_id]
1235       }
1236     ]
1237   },
1238   %{
1239     group: :pleroma,
1240     key: :frontend_configurations,
1241     type: :group,
1242     description:
1243       "This form can be used to configure a keyword list that keeps the configuration data for any " <>
1244         "kind of frontend. By default, settings for pleroma_fe are configured. If you want to " <>
1245         "add your own configuration your settings all fields must be complete.",
1246     children: [
1247       %{
1248         key: :pleroma_fe,
1249         label: "Pleroma FE",
1250         type: :map,
1251         description: "Settings for Pleroma FE",
1252         suggestions: [
1253           %{
1254             alwaysShowSubjectInput: true,
1255             background: "/static/aurora_borealis.jpg",
1256             collapseMessageWithSubject: false,
1257             greentext: false,
1258             hideFilteredStatuses: false,
1259             hideMutedPosts: false,
1260             hidePostStats: false,
1261             hideSitename: false,
1262             hideUserStats: false,
1263             loginMethod: "password",
1264             logo: "/static/logo.svg",
1265             logoMargin: ".1em",
1266             logoMask: true,
1267             minimalScopesMode: false,
1268             noAttachmentLinks: false,
1269             nsfwCensorImage: "/static/img/nsfw.74818f9.png",
1270             postContentType: "text/plain",
1271             redirectRootLogin: "/main/friends",
1272             redirectRootNoLogin: "/main/all",
1273             scopeCopy: true,
1274             sidebarRight: false,
1275             showFeaturesPanel: true,
1276             showInstanceSpecificPanel: false,
1277             subjectLineBehavior: "email",
1278             theme: "pleroma-dark",
1279             webPushNotifications: false
1280           }
1281         ],
1282         children: [
1283           %{
1284             key: :alwaysShowSubjectInput,
1285             label: "Always show subject input",
1286             type: :boolean,
1287             description: "When disabled, auto-hide the subject field if it's empty"
1288           },
1289           %{
1290             key: :background,
1291             type: {:string, :image},
1292             description:
1293               "URL of the background, unless viewing a user profile with a background that is set",
1294             suggestions: ["/images/city.jpg"]
1295           },
1296           %{
1297             key: :collapseMessageWithSubject,
1298             label: "Collapse message with subject",
1299             type: :boolean,
1300             description:
1301               "When a message has a subject (aka Content Warning), collapse it by default"
1302           },
1303           %{
1304             key: :greentext,
1305             label: "Greentext",
1306             type: :boolean,
1307             description: "Enables green text on lines prefixed with the > character"
1308           },
1309           %{
1310             key: :hideFilteredStatuses,
1311             label: "Hide Filtered Statuses",
1312             type: :boolean,
1313             description: "Hides filtered statuses from timelines"
1314           },
1315           %{
1316             key: :hideMutedPosts,
1317             label: "Hide Muted Posts",
1318             type: :boolean,
1319             description: "Hides muted statuses from timelines"
1320           },
1321           %{
1322             key: :hidePostStats,
1323             label: "Hide post stats",
1324             type: :boolean,
1325             description: "Hide notices statistics (repeats, favorites, ...)"
1326           },
1327           %{
1328             key: :hideSitename,
1329             label: "Hide Sitename",
1330             type: :boolean,
1331             description: "Hides instance name from PleromaFE banner"
1332           },
1333           %{
1334             key: :hideUserStats,
1335             label: "Hide user stats",
1336             type: :boolean,
1337             description:
1338               "Hide profile statistics (posts, posts per day, followers, followings, ...)"
1339           },
1340           %{
1341             key: :logo,
1342             type: {:string, :image},
1343             description: "URL of the logo, defaults to Pleroma's logo",
1344             suggestions: ["/static/logo.svg"]
1345           },
1346           %{
1347             key: :logoMargin,
1348             label: "Logo margin",
1349             type: :string,
1350             description:
1351               "Allows you to adjust vertical margins between logo boundary and navbar borders. " <>
1352                 "The idea is that to have logo's image without any extra margins and instead adjust them to your need in layout.",
1353             suggestions: [".1em"]
1354           },
1355           %{
1356             key: :logoMask,
1357             label: "Logo mask",
1358             type: :boolean,
1359             description:
1360               "By default it assumes logo used will be monochrome with alpha channel to be compatible with both light and dark themes. " <>
1361                 "If you want a colorful logo you must disable logoMask."
1362           },
1363           %{
1364             key: :minimalScopesMode,
1365             label: "Minimal scopes mode",
1366             type: :boolean,
1367             description:
1368               "Limit scope selection to Direct, User default, and Scope of post replying to. " <>
1369                 "Also prevents replying to a DM with a public post from PleromaFE."
1370           },
1371           %{
1372             key: :nsfwCensorImage,
1373             label: "NSFW Censor Image",
1374             type: {:string, :image},
1375             description:
1376               "URL of the image to use for hiding NSFW media attachments in the timeline",
1377             suggestions: ["/static/img/nsfw.74818f9.png"]
1378           },
1379           %{
1380             key: :postContentType,
1381             label: "Post Content Type",
1382             type: {:dropdown, :atom},
1383             description: "Default post formatting option",
1384             suggestions: ["text/plain", "text/html", "text/markdown", "text/bbcode"]
1385           },
1386           %{
1387             key: :redirectRootNoLogin,
1388             label: "Redirect root no login",
1389             type: :string,
1390             description:
1391               "Relative URL which indicates where to redirect when a user isn't logged in",
1392             suggestions: ["/main/all"]
1393           },
1394           %{
1395             key: :redirectRootLogin,
1396             label: "Redirect root login",
1397             type: :string,
1398             description:
1399               "Relative URL which indicates where to redirect when a user is logged in",
1400             suggestions: ["/main/friends"]
1401           },
1402           %{
1403             key: :scopeCopy,
1404             label: "Scope copy",
1405             type: :boolean,
1406             description: "Copy the scope (private/unlisted/public) in replies to posts by default"
1407           },
1408           %{
1409             key: :sidebarRight,
1410             label: "Sidebar on Right",
1411             type: :boolean,
1412             description: "Change alignment of sidebar and panels to the right"
1413           },
1414           %{
1415             key: :showFeaturesPanel,
1416             label: "Show instance features panel",
1417             type: :boolean,
1418             description:
1419               "Enables panel displaying functionality of the instance on the About page"
1420           },
1421           %{
1422             key: :showInstanceSpecificPanel,
1423             label: "Show instance specific panel",
1424             type: :boolean,
1425             description: "Whether to show the instance's custom panel"
1426           },
1427           %{
1428             key: :subjectLineBehavior,
1429             label: "Subject line behavior",
1430             type: :string,
1431             description: "Allows changing the default behaviour of subject lines in replies.
1432           `email`: copy and preprend re:, as in email,
1433           `masto`: copy verbatim, as in Mastodon,
1434           `noop`: don't copy the subject.",
1435             suggestions: ["email", "masto", "noop"]
1436           },
1437           %{
1438             key: :theme,
1439             type: :string,
1440             description: "Which theme to use. Available themes are defined in styles.json",
1441             suggestions: ["pleroma-dark"]
1442           }
1443         ]
1444       }
1445     ]
1446   },
1447   %{
1448     group: :pleroma,
1449     key: :assets,
1450     type: :group,
1451     description:
1452       "This section configures assets to be used with various frontends. Currently the only option relates to mascots on the mastodon frontend",
1453     children: [
1454       %{
1455         key: :mascots,
1456         type: {:keyword, :map},
1457         description:
1458           "Keyword of mascots, each element must contain both an URL and a mime_type key",
1459         suggestions: [
1460           pleroma_fox_tan: %{
1461             url: "/images/pleroma-fox-tan-smol.png",
1462             mime_type: "image/png"
1463           },
1464           pleroma_fox_tan_shy: %{
1465             url: "/images/pleroma-fox-tan-shy.png",
1466             mime_type: "image/png"
1467           }
1468         ]
1469       },
1470       %{
1471         key: :default_mascot,
1472         type: :atom,
1473         description:
1474           "This will be used as the default mascot on MastoFE. Default: `:pleroma_fox_tan`",
1475         suggestions: [
1476           :pleroma_fox_tan
1477         ]
1478       },
1479       %{
1480         key: :default_user_avatar,
1481         type: {:string, :image},
1482         description: "URL of the default user avatar",
1483         suggestions: ["/images/avi.png"]
1484       }
1485     ]
1486   },
1487   %{
1488     group: :pleroma,
1489     key: :manifest,
1490     type: :group,
1491     description:
1492       "This section describe PWA manifest instance-specific values. Currently this option relate only for MastoFE.",
1493     children: [
1494       %{
1495         key: :icons,
1496         type: {:list, :map},
1497         description: "Describe the icons of the app",
1498         suggestion: [
1499           %{
1500             src: "/static/logo.png"
1501           },
1502           %{
1503             src: "/static/icon.png",
1504             type: "image/png"
1505           },
1506           %{
1507             src: "/static/icon.ico",
1508             sizes: "72x72 96x96 128x128 256x256"
1509           }
1510         ]
1511       },
1512       %{
1513         key: :theme_color,
1514         type: :string,
1515         description: "Describe the theme color of the app",
1516         suggestions: ["#282c37", "mediumpurple"]
1517       },
1518       %{
1519         key: :background_color,
1520         type: :string,
1521         description: "Describe the background color of the app",
1522         suggestions: ["#191b22", "aliceblue"]
1523       }
1524     ]
1525   },
1526   %{
1527     group: :pleroma,
1528     key: :media_proxy,
1529     type: :group,
1530     description: "Media proxy",
1531     children: [
1532       %{
1533         key: :enabled,
1534         type: :boolean,
1535         description: "Enables proxying of remote media via the instance's proxy"
1536       },
1537       %{
1538         key: :base_url,
1539         label: "Base URL",
1540         type: :string,
1541         description:
1542           "The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host/CDN fronts.",
1543         suggestions: ["https://example.com"]
1544       },
1545       %{
1546         key: :invalidation,
1547         type: :keyword,
1548         descpiption: "",
1549         suggestions: [
1550           enabled: true,
1551           provider: Pleroma.Web.MediaProxy.Invalidation.Script
1552         ],
1553         children: [
1554           %{
1555             key: :enabled,
1556             type: :boolean,
1557             description: "Enables media cache object invalidation."
1558           },
1559           %{
1560             key: :provider,
1561             type: :module,
1562             description: "Module which will be used to purge objects from the cache.",
1563             suggestions: [
1564               Pleroma.Web.MediaProxy.Invalidation.Script,
1565               Pleroma.Web.MediaProxy.Invalidation.Http
1566             ]
1567           }
1568         ]
1569       },
1570       %{
1571         key: :proxy_opts,
1572         label: "Advanced MediaProxy Options",
1573         type: :keyword,
1574         description: "Internal Pleroma.ReverseProxy settings",
1575         suggestions: [
1576           redirect_on_failure: false,
1577           max_body_length: 25 * 1_048_576,
1578           max_read_duration: 30_000
1579         ],
1580         children: [
1581           %{
1582             key: :redirect_on_failure,
1583             type: :boolean,
1584             description: """
1585             Redirects the client to the origin server upon encountering HTTP errors.\n
1586             Note that files larger than Max Body Length will trigger an error. (e.g., Peertube videos)\n\n
1587             **WARNING:** This setting will allow larger files to be accessed, but exposes the\n
1588             IP addresses of your users to the other servers, bypassing the MediaProxy.
1589             """
1590           },
1591           %{
1592             key: :max_body_length,
1593             type: :integer,
1594             description:
1595               "Maximum file size (in bytes) allowed through the Pleroma MediaProxy cache."
1596           },
1597           %{
1598             key: :max_read_duration,
1599             type: :integer,
1600             description: "Timeout (in milliseconds) of GET request to the remote URI."
1601           }
1602         ]
1603       },
1604       %{
1605         key: :whitelist,
1606         type: {:list, :string},
1607         description: "List of hosts with scheme to bypass the MediaProxy",
1608         suggestions: ["http://example.com"]
1609       }
1610     ]
1611   },
1612   %{
1613     group: :pleroma,
1614     key: :media_preview_proxy,
1615     type: :group,
1616     description: "Media preview proxy",
1617     children: [
1618       %{
1619         key: :enabled,
1620         type: :boolean,
1621         description:
1622           "Enables proxying of remote media preview to the instance's proxy. Requires enabled media proxy."
1623       },
1624       %{
1625         key: :thumbnail_max_width,
1626         type: :integer,
1627         description:
1628           "Max width of preview thumbnail for images (video preview always has original dimensions)."
1629       },
1630       %{
1631         key: :thumbnail_max_height,
1632         type: :integer,
1633         description:
1634           "Max height of preview thumbnail for images (video preview always has original dimensions)."
1635       },
1636       %{
1637         key: :image_quality,
1638         type: :integer,
1639         description: "Quality of the output. Ranges from 0 (min quality) to 100 (max quality)."
1640       },
1641       %{
1642         key: :min_content_length,
1643         type: :integer,
1644         description:
1645           "Min content length (in bytes) to perform preview. Media smaller in size will be served without thumbnailing."
1646       }
1647     ]
1648   },
1649   %{
1650     group: :pleroma,
1651     key: Pleroma.Web.MediaProxy.Invalidation.Http,
1652     type: :group,
1653     description: "HTTP invalidate settings",
1654     children: [
1655       %{
1656         key: :method,
1657         type: :atom,
1658         description: "HTTP method of request. Default: :purge"
1659       },
1660       %{
1661         key: :headers,
1662         type: {:keyword, :string},
1663         description: "HTTP headers of request",
1664         suggestions: [{"x-refresh", 1}]
1665       },
1666       %{
1667         key: :options,
1668         type: :keyword,
1669         description: "Request options",
1670         children: [
1671           %{
1672             key: :params,
1673             type: {:map, :string}
1674           }
1675         ]
1676       }
1677     ]
1678   },
1679   %{
1680     group: :pleroma,
1681     key: Pleroma.Web.MediaProxy.Invalidation.Script,
1682     type: :group,
1683     description: "Invalidation script settings",
1684     children: [
1685       %{
1686         key: :script_path,
1687         type: :string,
1688         description: "Path to executable script which will purge cached items.",
1689         suggestions: ["./installation/nginx-cache-purge.sh.example"]
1690       },
1691       %{
1692         key: :url_format,
1693         label: "URL Format",
1694         type: :string,
1695         description:
1696           "Optional URL format preprocessing. Only required for Apache's htcacheclean.",
1697         suggestions: [":htcacheclean"]
1698       }
1699     ]
1700   },
1701   %{
1702     group: :pleroma,
1703     key: :gopher,
1704     type: :group,
1705     description: "Gopher settings",
1706     children: [
1707       %{
1708         key: :enabled,
1709         type: :boolean,
1710         description: "Enables the gopher interface"
1711       },
1712       %{
1713         key: :ip,
1714         label: "IP",
1715         type: :tuple,
1716         description: "IP address to bind to",
1717         suggestions: [{0, 0, 0, 0}]
1718       },
1719       %{
1720         key: :port,
1721         type: :integer,
1722         description: "Port to bind to",
1723         suggestions: [9999]
1724       },
1725       %{
1726         key: :dstport,
1727         type: :integer,
1728         description: "Port advertised in URLs (optional, defaults to port)",
1729         suggestions: [9999]
1730       }
1731     ]
1732   },
1733   %{
1734     group: :pleroma,
1735     key: :activitypub,
1736     label: "ActivityPub",
1737     type: :group,
1738     description: "ActivityPub-related settings",
1739     children: [
1740       %{
1741         key: :unfollow_blocked,
1742         type: :boolean,
1743         description: "Whether blocks result in people getting unfollowed"
1744       },
1745       %{
1746         key: :outgoing_blocks,
1747         type: :boolean,
1748         description: "Whether to federate blocks to other instances"
1749       },
1750       %{
1751         key: :blockers_visible,
1752         type: :boolean,
1753         description: "Whether a user can see someone who has blocked them"
1754       },
1755       %{
1756         key: :sign_object_fetches,
1757         type: :boolean,
1758         description: "Sign object fetches with HTTP signatures"
1759       },
1760       %{
1761         key: :authorized_fetch_mode,
1762         type: :boolean,
1763         description: "Require HTTP signatures for AP fetches"
1764       },
1765       %{
1766         key: :note_replies_output_limit,
1767         type: :integer,
1768         description:
1769           "The number of Note replies' URIs to be included with outgoing federation (`5` to match Mastodon hardcoded value, `0` to disable the output)"
1770       },
1771       %{
1772         key: :follow_handshake_timeout,
1773         type: :integer,
1774         description: "Following handshake timeout",
1775         suggestions: [500]
1776       }
1777     ]
1778   },
1779   %{
1780     group: :pleroma,
1781     key: :http_security,
1782     label: "HTTP security",
1783     type: :group,
1784     description: "HTTP security settings",
1785     children: [
1786       %{
1787         key: :enabled,
1788         type: :boolean,
1789         description: "Whether the managed content security policy is enabled"
1790       },
1791       %{
1792         key: :sts,
1793         label: "STS",
1794         type: :boolean,
1795         description: "Whether to additionally send a Strict-Transport-Security header"
1796       },
1797       %{
1798         key: :sts_max_age,
1799         label: "STS max age",
1800         type: :integer,
1801         description: "The maximum age for the Strict-Transport-Security header if sent",
1802         suggestions: [31_536_000]
1803       },
1804       %{
1805         key: :ct_max_age,
1806         label: "CT max age",
1807         type: :integer,
1808         description: "The maximum age for the Expect-CT header if sent",
1809         suggestions: [2_592_000]
1810       },
1811       %{
1812         key: :referrer_policy,
1813         type: :string,
1814         description: "The referrer policy to use, either \"same-origin\" or \"no-referrer\"",
1815         suggestions: ["same-origin", "no-referrer"]
1816       },
1817       %{
1818         key: :report_uri,
1819         label: "Report URI",
1820         type: :string,
1821         description: "Adds the specified URL to report-uri and report-to group in CSP header",
1822         suggestions: ["https://example.com/report-uri"]
1823       }
1824     ]
1825   },
1826   %{
1827     group: :web_push_encryption,
1828     key: :vapid_details,
1829     label: "Vapid Details",
1830     type: :group,
1831     description:
1832       "Web Push Notifications configuration. You can use the mix task mix web_push.gen.keypair to generate it.",
1833     children: [
1834       %{
1835         key: :subject,
1836         type: :string,
1837         description:
1838           "A mailto link for the administrative contact." <>
1839             " It's best if this email is not a personal email address, but rather a group email to the instance moderation team.",
1840         suggestions: ["mailto:moderators@pleroma.com"]
1841       },
1842       %{
1843         key: :public_key,
1844         type: :string,
1845         description: "VAPID public key",
1846         suggestions: ["Public key"]
1847       },
1848       %{
1849         key: :private_key,
1850         type: :string,
1851         description: "VAPID private key",
1852         suggestions: ["Private key"]
1853       }
1854     ]
1855   },
1856   %{
1857     group: :pleroma,
1858     key: Pleroma.Captcha,
1859     type: :group,
1860     description: "Captcha-related settings",
1861     children: [
1862       %{
1863         key: :enabled,
1864         type: :boolean,
1865         description: "Whether the captcha should be shown on registration"
1866       },
1867       %{
1868         key: :method,
1869         type: :module,
1870         description: "The method/service to use for captcha",
1871         suggestions: [Pleroma.Captcha.Kocaptcha, Pleroma.Captcha.Native]
1872       },
1873       %{
1874         key: :seconds_valid,
1875         type: :integer,
1876         description: "The time in seconds for which the captcha is valid",
1877         suggestions: [60]
1878       }
1879     ]
1880   },
1881   %{
1882     group: :pleroma,
1883     key: Pleroma.Captcha.Kocaptcha,
1884     type: :group,
1885     description:
1886       "Kocaptcha is a very simple captcha service with a single API endpoint, the source code is" <>
1887         " here: https://github.com/koto-bank/kocaptcha. The default endpoint (https://captcha.kotobank.ch) is hosted by the developer.",
1888     children: [
1889       %{
1890         key: :endpoint,
1891         type: :string,
1892         description: "The kocaptcha endpoint to use",
1893         suggestions: ["https://captcha.kotobank.ch"]
1894       }
1895     ]
1896   },
1897   %{
1898     group: :pleroma,
1899     label: "Pleroma Admin Token",
1900     type: :group,
1901     description:
1902       "Allows setting a token that can be used to authenticate requests with admin privileges without a normal user account token. Append the `admin_token` parameter to requests to utilize it. (Please reconsider using HTTP Basic Auth or OAuth-based authentication if possible)",
1903     children: [
1904       %{
1905         key: :admin_token,
1906         type: :string,
1907         description: "Admin token",
1908         suggestions: [
1909           "Please use a high entropy string or UUID"
1910         ]
1911       }
1912     ]
1913   },
1914   %{
1915     group: :pleroma,
1916     key: Oban,
1917     type: :group,
1918     description:
1919       "[Oban](https://github.com/sorentwo/oban) asynchronous job processor configuration.",
1920     children: [
1921       %{
1922         key: :log,
1923         type: {:dropdown, :atom},
1924         description: "Logs verbose mode",
1925         suggestions: [false, :error, :warn, :info, :debug]
1926       },
1927       %{
1928         key: :queues,
1929         type: {:keyword, :integer},
1930         description:
1931           "Background jobs queues (keys: queues, values: max numbers of concurrent jobs)",
1932         suggestions: [
1933           activity_expiration: 10,
1934           attachments_cleanup: 5,
1935           background: 5,
1936           federator_incoming: 50,
1937           federator_outgoing: 50,
1938           mailer: 10,
1939           scheduled_activities: 10,
1940           transmogrifier: 20,
1941           web_push: 50
1942         ],
1943         children: [
1944           %{
1945             key: :activity_expiration,
1946             type: :integer,
1947             description: "Activity expiration queue",
1948             suggestions: [10]
1949           },
1950           %{
1951             key: :backup,
1952             type: :integer,
1953             description: "Backup queue",
1954             suggestions: [1]
1955           },
1956           %{
1957             key: :attachments_cleanup,
1958             type: :integer,
1959             description: "Attachment deletion queue",
1960             suggestions: [5]
1961           },
1962           %{
1963             key: :background,
1964             type: :integer,
1965             description: "Background queue",
1966             suggestions: [5]
1967           },
1968           %{
1969             key: :federator_incoming,
1970             type: :integer,
1971             description: "Incoming federation queue",
1972             suggestions: [50]
1973           },
1974           %{
1975             key: :federator_outgoing,
1976             type: :integer,
1977             description: "Outgoing federation queue",
1978             suggestions: [50]
1979           },
1980           %{
1981             key: :mailer,
1982             type: :integer,
1983             description: "Email sender queue, see Pleroma.Emails.Mailer",
1984             suggestions: [10]
1985           },
1986           %{
1987             key: :scheduled_activities,
1988             type: :integer,
1989             description: "Scheduled activities queue, see Pleroma.ScheduledActivities",
1990             suggestions: [10]
1991           },
1992           %{
1993             key: :transmogrifier,
1994             type: :integer,
1995             description: "Transmogrifier queue",
1996             suggestions: [20]
1997           },
1998           %{
1999             key: :web_push,
2000             type: :integer,
2001             description: "Web push notifications queue",
2002             suggestions: [50]
2003           }
2004         ]
2005       },
2006       %{
2007         key: :crontab,
2008         type: {:list, :tuple},
2009         description: "Settings for cron background jobs",
2010         suggestions: [
2011           {"0 0 * * 0", Pleroma.Workers.Cron.DigestEmailsWorker},
2012           {"0 0 * * *", Pleroma.Workers.Cron.NewUsersDigestWorker}
2013         ]
2014       }
2015     ]
2016   },
2017   %{
2018     group: :pleroma,
2019     key: :workers,
2020     type: :group,
2021     description: "Includes custom worker options not interpretable directly by `Oban`",
2022     children: [
2023       %{
2024         key: :retries,
2025         type: {:keyword, :integer},
2026         description: "Max retry attempts for failed jobs, per `Oban` queue",
2027         suggestions: [
2028           federator_incoming: 5,
2029           federator_outgoing: 5
2030         ]
2031       }
2032     ]
2033   },
2034   %{
2035     group: :pleroma,
2036     key: Pleroma.Web.Metadata,
2037     type: :group,
2038     description: "Metadata-related settings",
2039     children: [
2040       %{
2041         key: :providers,
2042         type: {:list, :module},
2043         description: "List of metadata providers to enable",
2044         suggestions: [
2045           Pleroma.Web.Metadata.Providers.OpenGraph,
2046           Pleroma.Web.Metadata.Providers.TwitterCard,
2047           Pleroma.Web.Metadata.Providers.RelMe,
2048           Pleroma.Web.Metadata.Providers.Feed
2049         ]
2050       },
2051       %{
2052         key: :unfurl_nsfw,
2053         label: "Unfurl NSFW",
2054         type: :boolean,
2055         description: "When enabled NSFW attachments will be shown in previews"
2056       }
2057     ]
2058   },
2059   %{
2060     group: :pleroma,
2061     key: :rich_media,
2062     type: :group,
2063     description:
2064       "If enabled the instance will parse metadata from attached links to generate link previews",
2065     children: [
2066       %{
2067         key: :enabled,
2068         type: :boolean,
2069         description: "Enables RichMedia parsing of URLs"
2070       },
2071       %{
2072         key: :ignore_hosts,
2073         type: {:list, :string},
2074         description: "List of hosts which will be ignored by the metadata parser",
2075         suggestions: ["accounts.google.com", "xss.website"]
2076       },
2077       %{
2078         key: :ignore_tld,
2079         label: "Ignore TLD",
2080         type: {:list, :string},
2081         description: "List TLDs (top-level domains) which will ignore for parse metadata",
2082         suggestions: ["local", "localdomain", "lan"]
2083       },
2084       %{
2085         key: :parsers,
2086         type: {:list, :module},
2087         description:
2088           "List of Rich Media parsers. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need to use full name.",
2089         suggestions: [
2090           Pleroma.Web.RichMedia.Parsers.OEmbed,
2091           Pleroma.Web.RichMedia.Parsers.TwitterCard
2092         ]
2093       },
2094       %{
2095         key: :ttl_setters,
2096         label: "TTL setters",
2097         type: {:list, :module},
2098         description:
2099           "List of rich media TTL setters. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parser.` part), but on adding custom module you need to use full name.",
2100         suggestions: [
2101           Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl
2102         ]
2103       },
2104       %{
2105         key: :failure_backoff,
2106         type: :integer,
2107         description:
2108           "Amount of milliseconds after request failure, during which the request will not be retried.",
2109         suggestions: [60_000]
2110       }
2111     ]
2112   },
2113   %{
2114     group: :pleroma,
2115     key: Pleroma.Formatter,
2116     label: "Linkify",
2117     type: :group,
2118     description:
2119       "Configuration for Pleroma's link formatter which parses mentions, hashtags, and URLs.",
2120     children: [
2121       %{
2122         key: :class,
2123         type: [:string, :boolean],
2124         description: "Specify the class to be added to the generated link. Disable to clear.",
2125         suggestions: ["auto-linker", false]
2126       },
2127       %{
2128         key: :rel,
2129         type: [:string, :boolean],
2130         description: "Override the rel attribute. Disable to clear.",
2131         suggestions: ["ugc", "noopener noreferrer", false]
2132       },
2133       %{
2134         key: :new_window,
2135         type: :boolean,
2136         description: "Link URLs will open in a new window/tab."
2137       },
2138       %{
2139         key: :truncate,
2140         type: [:integer, :boolean],
2141         description:
2142           "Set to a number to truncate URLs longer than the number. Truncated URLs will end in `...`",
2143         suggestions: [15, false]
2144       },
2145       %{
2146         key: :strip_prefix,
2147         type: :boolean,
2148         description: "Strip the scheme prefix."
2149       },
2150       %{
2151         key: :extra,
2152         type: :boolean,
2153         description: "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
2154       },
2155       %{
2156         key: :validate_tld,
2157         type: [:atom, :boolean],
2158         description:
2159           "Set to false to disable TLD validation for URLs/emails. Can be set to :no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` will be validated, but `http://example.loki` won't)",
2160         suggestions: [:no_scheme, true]
2161       }
2162     ]
2163   },
2164   %{
2165     group: :pleroma,
2166     key: Pleroma.ScheduledActivity,
2167     type: :group,
2168     description: "Scheduled activities settings",
2169     children: [
2170       %{
2171         key: :daily_user_limit,
2172         type: :integer,
2173         description:
2174           "The number of scheduled activities a user is allowed to create in a single day. Default: 25.",
2175         suggestions: [25]
2176       },
2177       %{
2178         key: :total_user_limit,
2179         type: :integer,
2180         description:
2181           "The number of scheduled activities a user is allowed to create in total. Default: 300.",
2182         suggestions: [300]
2183       },
2184       %{
2185         key: :enabled,
2186         type: :boolean,
2187         description: "Whether scheduled activities are sent to the job queue to be executed"
2188       }
2189     ]
2190   },
2191   %{
2192     group: :pleroma,
2193     key: Pleroma.Workers.PurgeExpiredActivity,
2194     type: :group,
2195     description: "Expired activities settings",
2196     children: [
2197       %{
2198         key: :enabled,
2199         type: :boolean,
2200         description: "Enables expired activities addition & deletion"
2201       },
2202       %{
2203         key: :min_lifetime,
2204         type: :integer,
2205         description: "Minimum lifetime for ephemeral activity (in seconds)",
2206         suggestions: [600]
2207       }
2208     ]
2209   },
2210   %{
2211     group: :pleroma,
2212     label: "Pleroma Authenticator",
2213     type: :group,
2214     description: "Authenticator",
2215     children: [
2216       %{
2217         key: Pleroma.Web.Auth.Authenticator,
2218         type: :module,
2219         suggestions: [Pleroma.Web.Auth.PleromaAuthenticator, Pleroma.Web.Auth.LDAPAuthenticator]
2220       }
2221     ]
2222   },
2223   %{
2224     group: :pleroma,
2225     key: :ldap,
2226     label: "LDAP",
2227     type: :group,
2228     description:
2229       "Use LDAP for user authentication. When a user logs in to the Pleroma instance, the name and password" <>
2230         " will be verified by trying to authenticate (bind) to a LDAP server." <>
2231         " If a user exists in the LDAP directory but there is no account with the same name yet on the" <>
2232         " Pleroma instance then a new Pleroma account will be created with the same name as the LDAP user name.",
2233     children: [
2234       %{
2235         key: :enabled,
2236         type: :boolean,
2237         description: "Enables LDAP authentication"
2238       },
2239       %{
2240         key: :host,
2241         type: :string,
2242         description: "LDAP server hostname",
2243         suggestions: ["localhosts"]
2244       },
2245       %{
2246         key: :port,
2247         type: :integer,
2248         description: "LDAP port, e.g. 389 or 636",
2249         suggestions: [389, 636]
2250       },
2251       %{
2252         key: :ssl,
2253         label: "SSL",
2254         type: :boolean,
2255         description: "Enable to use SSL, usually implies the port 636"
2256       },
2257       %{
2258         key: :sslopts,
2259         label: "SSL options",
2260         type: :keyword,
2261         description: "Additional SSL options",
2262         suggestions: [cacertfile: "path/to/file/with/PEM/cacerts", verify: :verify_peer],
2263         children: [
2264           %{
2265             key: :cacertfile,
2266             type: :string,
2267             description: "Path to file with PEM encoded cacerts",
2268             suggestions: ["path/to/file/with/PEM/cacerts"]
2269           },
2270           %{
2271             key: :verify,
2272             type: :atom,
2273             description: "Type of cert verification",
2274             suggestions: [:verify_peer]
2275           }
2276         ]
2277       },
2278       %{
2279         key: :tls,
2280         label: "TLS",
2281         type: :boolean,
2282         description: "Enable to use STARTTLS, usually implies the port 389"
2283       },
2284       %{
2285         key: :tlsopts,
2286         label: "TLS options",
2287         type: :keyword,
2288         description: "Additional TLS options",
2289         suggestions: [cacertfile: "path/to/file/with/PEM/cacerts", verify: :verify_peer],
2290         children: [
2291           %{
2292             key: :cacertfile,
2293             type: :string,
2294             description: "Path to file with PEM encoded cacerts",
2295             suggestions: ["path/to/file/with/PEM/cacerts"]
2296           },
2297           %{
2298             key: :verify,
2299             type: :atom,
2300             description: "Type of cert verification",
2301             suggestions: [:verify_peer]
2302           }
2303         ]
2304       },
2305       %{
2306         key: :base,
2307         type: :string,
2308         description: "LDAP base, e.g. \"dc=example,dc=com\"",
2309         suggestions: ["dc=example,dc=com"]
2310       },
2311       %{
2312         key: :uid,
2313         label: "UID",
2314         type: :string,
2315         description:
2316           "LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter will be \"cn=username,base\"",
2317         suggestions: ["cn"]
2318       }
2319     ]
2320   },
2321   %{
2322     group: :pleroma,
2323     key: :auth,
2324     type: :group,
2325     description: "Authentication / authorization settings",
2326     children: [
2327       %{
2328         key: :enforce_oauth_admin_scope_usage,
2329         label: "Enforce OAuth admin scope usage",
2330         type: :boolean,
2331         description:
2332           "OAuth admin scope requirement toggle. " <>
2333             "If enabled, admin actions explicitly demand admin OAuth scope(s) presence in OAuth token " <>
2334             "(client app must support admin scopes). If disabled and token doesn't have admin scope(s), " <>
2335             "`is_admin` user flag grants access to admin-specific actions."
2336       },
2337       %{
2338         key: :auth_template,
2339         type: :string,
2340         description:
2341           "Authentication form template. By default it's `show.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/show.html.ee`.",
2342         suggestions: ["show.html"]
2343       },
2344       %{
2345         key: :oauth_consumer_template,
2346         label: "OAuth consumer template",
2347         type: :string,
2348         description:
2349           "OAuth consumer mode authentication form template. By default it's `consumer.html` which corresponds to" <>
2350             " `lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex`.",
2351         suggestions: ["consumer.html"]
2352       },
2353       %{
2354         key: :oauth_consumer_strategies,
2355         label: "OAuth consumer strategies",
2356         type: {:list, :string},
2357         description:
2358           "The list of enabled OAuth consumer strategies. By default it's set by OAUTH_CONSUMER_STRATEGIES environment variable." <>
2359             " Each entry in this space-delimited string should be of format \"strategy\" or \"strategy:dependency\"" <>
2360             " (e.g. twitter or keycloak:ueberauth_keycloak_strategy in case dependency is named differently than ueberauth_<strategy>).",
2361         suggestions: ["twitter", "keycloak:ueberauth_keycloak_strategy"]
2362       }
2363     ]
2364   },
2365   %{
2366     group: :pleroma,
2367     key: :email_notifications,
2368     type: :group,
2369     description: "Email notifications settings",
2370     children: [
2371       %{
2372         key: :digest,
2373         type: :map,
2374         description:
2375           "emails of \"what you've missed\" for users who have been inactive for a while",
2376         suggestions: [
2377           %{
2378             active: false,
2379             schedule: "0 0 * * 0",
2380             interval: 7,
2381             inactivity_threshold: 7
2382           }
2383         ],
2384         children: [
2385           %{
2386             key: :active,
2387             label: "Enabled",
2388             type: :boolean,
2389             description: "Globally enable or disable digest emails"
2390           },
2391           %{
2392             key: :schedule,
2393             type: :string,
2394             description:
2395               "When to send digest email, in crontab format. \"0 0 0\" is the default, meaning \"once a week at midnight on Sunday morning\".",
2396             suggestions: ["0 0 * * 0"]
2397           },
2398           %{
2399             key: :interval,
2400             type: :integer,
2401             description: "Minimum interval between digest emails to one user",
2402             suggestions: [7]
2403           },
2404           %{
2405             key: :inactivity_threshold,
2406             type: :integer,
2407             description: "Minimum user inactivity threshold",
2408             suggestions: [7]
2409           }
2410         ]
2411       }
2412     ]
2413   },
2414   %{
2415     group: :pleroma,
2416     key: Pleroma.Emails.UserEmail,
2417     type: :group,
2418     description: "Email template settings",
2419     children: [
2420       %{
2421         key: :logo,
2422         type: {:string, :image},
2423         description: "A path to a custom logo. Set it to `nil` to use the default Pleroma logo.",
2424         suggestions: ["some/path/logo.png"]
2425       },
2426       %{
2427         key: :styling,
2428         type: :map,
2429         description: "A map with color settings for email templates.",
2430         suggestions: [
2431           %{
2432             link_color: "#d8a070",
2433             background_color: "#2C3645",
2434             content_background_color: "#1B2635",
2435             header_color: "#d8a070",
2436             text_color: "#b9b9ba",
2437             text_muted_color: "#b9b9ba"
2438           }
2439         ],
2440         children: [
2441           %{
2442             key: :link_color,
2443             type: :string,
2444             suggestions: ["#d8a070"]
2445           },
2446           %{
2447             key: :background_color,
2448             type: :string,
2449             suggestions: ["#2C3645"]
2450           },
2451           %{
2452             key: :content_background_color,
2453             type: :string,
2454             suggestions: ["#1B2635"]
2455           },
2456           %{
2457             key: :header_color,
2458             type: :string,
2459             suggestions: ["#d8a070"]
2460           },
2461           %{
2462             key: :text_color,
2463             type: :string,
2464             suggestions: ["#b9b9ba"]
2465           },
2466           %{
2467             key: :text_muted_color,
2468             type: :string,
2469             suggestions: ["#b9b9ba"]
2470           }
2471         ]
2472       }
2473     ]
2474   },
2475   %{
2476     group: :pleroma,
2477     key: Pleroma.Emails.NewUsersDigestEmail,
2478     type: :group,
2479     description: "New users admin email digest",
2480     children: [
2481       %{
2482         key: :enabled,
2483         type: :boolean,
2484         description: "Enables new users admin digest email when `true`"
2485       }
2486     ]
2487   },
2488   %{
2489     group: :pleroma,
2490     key: :oauth2,
2491     label: "OAuth2",
2492     type: :group,
2493     description: "Configure OAuth 2 provider capabilities",
2494     children: [
2495       %{
2496         key: :token_expires_in,
2497         type: :integer,
2498         description: "The lifetime in seconds of the access token",
2499         suggestions: [2_592_000]
2500       },
2501       %{
2502         key: :issue_new_refresh_token,
2503         type: :boolean,
2504         description:
2505           "Keeps old refresh token or generate new refresh token when to obtain an access token"
2506       },
2507       %{
2508         key: :clean_expired_tokens,
2509         type: :boolean,
2510         description: "Enable a background job to clean expired OAuth tokens. Default: disabled."
2511       }
2512     ]
2513   },
2514   %{
2515     group: :pleroma,
2516     key: :emoji,
2517     type: :group,
2518     children: [
2519       %{
2520         key: :shortcode_globs,
2521         type: {:list, :string},
2522         description: "Location of custom emoji files. * can be used as a wildcard.",
2523         suggestions: ["/emoji/custom/**/*.png"]
2524       },
2525       %{
2526         key: :pack_extensions,
2527         type: {:list, :string},
2528         description:
2529           "A list of file extensions for emojis, when no emoji.txt for a pack is present",
2530         suggestions: [".png", ".gif"]
2531       },
2532       %{
2533         key: :groups,
2534         type: {:keyword, {:list, :string}},
2535         description:
2536           "Emojis are ordered in groups (tags). This is an array of key-value pairs where the key is the group name" <>
2537             " and the value is the location or array of locations. * can be used as a wildcard.",
2538         suggestions: [
2539           Custom: ["/emoji/*.png", "/emoji/**/*.png"]
2540         ]
2541       },
2542       %{
2543         key: :default_manifest,
2544         type: :string,
2545         description:
2546           "Location of the JSON-manifest. This manifest contains information about the emoji-packs you can download." <>
2547             " Currently only one manifest can be added (no arrays).",
2548         suggestions: ["https://git.pleroma.social/pleroma/emoji-index/raw/master/index.json"]
2549       },
2550       %{
2551         key: :shared_pack_cache_seconds_per_file,
2552         label: "Shared pack cache s/file",
2553         type: :integer,
2554         descpiption:
2555           "When an emoji pack is shared, the archive is created and cached in memory" <>
2556             " for this amount of seconds multiplied by the number of files.",
2557         suggestions: [60]
2558       }
2559     ]
2560   },
2561   %{
2562     group: :pleroma,
2563     key: :rate_limit,
2564     type: :group,
2565     description:
2566       "Rate limit settings. This is an advanced feature enabled only for :authentication by default.",
2567     children: [
2568       %{
2569         key: :search,
2570         type: [:tuple, {:list, :tuple}],
2571         description: "For the search requests (account & status search etc.)",
2572         suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2573       },
2574       %{
2575         key: :timeline,
2576         type: [:tuple, {:list, :tuple}],
2577         description: "For requests to timelines (each timeline has it's own limiter)",
2578         suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2579       },
2580       %{
2581         key: :app_account_creation,
2582         type: [:tuple, {:list, :tuple}],
2583         description: "For registering user accounts from the same IP address",
2584         suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2585       },
2586       %{
2587         key: :relations_actions,
2588         type: [:tuple, {:list, :tuple}],
2589         description: "For actions on relationships with all users (follow, unfollow)",
2590         suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2591       },
2592       %{
2593         key: :relation_id_action,
2594         label: "Relation ID action",
2595         type: [:tuple, {:list, :tuple}],
2596         description: "For actions on relation with a specific user (follow, unfollow)",
2597         suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2598       },
2599       %{
2600         key: :statuses_actions,
2601         type: [:tuple, {:list, :tuple}],
2602         description:
2603           "For create / delete / fav / unfav / reblog / unreblog actions on any statuses",
2604         suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2605       },
2606       %{
2607         key: :status_id_action,
2608         label: "Status ID action",
2609         type: [:tuple, {:list, :tuple}],
2610         description:
2611           "For fav / unfav or reblog / unreblog actions on the same status by the same user",
2612         suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2613       },
2614       %{
2615         key: :authentication,
2616         type: [:tuple, {:list, :tuple}],
2617         description: "For authentication create / password check / user existence check requests",
2618         suggestions: [{60_000, 15}]
2619       }
2620     ]
2621   },
2622   %{
2623     group: :esshd,
2624     label: "ESSHD",
2625     type: :group,
2626     description:
2627       "Before enabling this you must add :esshd to mix.exs as one of the extra_applications " <>
2628         "and generate host keys in your priv dir with ssh-keygen -m PEM -N \"\" -b 2048 -t rsa -f ssh_host_rsa_key",
2629     children: [
2630       %{
2631         key: :enabled,
2632         type: :boolean,
2633         description: "Enables SSH"
2634       },
2635       %{
2636         key: :priv_dir,
2637         type: :string,
2638         description: "Dir with SSH keys",
2639         suggestions: ["/some/path/ssh_keys"]
2640       },
2641       %{
2642         key: :handler,
2643         type: :string,
2644         description: "Handler module",
2645         suggestions: ["Pleroma.BBS.Handler"]
2646       },
2647       %{
2648         key: :port,
2649         type: :integer,
2650         description: "Port to connect",
2651         suggestions: [10_022]
2652       },
2653       %{
2654         key: :password_authenticator,
2655         type: :string,
2656         description: "Authenticator module",
2657         suggestions: ["Pleroma.BBS.Authenticator"]
2658       }
2659     ]
2660   },
2661   %{
2662     group: :mime,
2663     label: "Mime Types",
2664     type: :group,
2665     description: "Mime Types settings",
2666     children: [
2667       %{
2668         key: :types,
2669         type: :map,
2670         suggestions: [
2671           %{
2672             "application/xml" => ["xml"],
2673             "application/xrd+xml" => ["xrd+xml"],
2674             "application/jrd+json" => ["jrd+json"],
2675             "application/activity+json" => ["activity+json"],
2676             "application/ld+json" => ["activity+json"]
2677           }
2678         ],
2679         children: [
2680           %{
2681             key: "application/xml",
2682             type: {:list, :string},
2683             suggestions: ["xml"]
2684           },
2685           %{
2686             key: "application/xrd+xml",
2687             type: {:list, :string},
2688             suggestions: ["xrd+xml"]
2689           },
2690           %{
2691             key: "application/jrd+json",
2692             type: {:list, :string},
2693             suggestions: ["jrd+json"]
2694           },
2695           %{
2696             key: "application/activity+json",
2697             type: {:list, :string},
2698             suggestions: ["activity+json"]
2699           },
2700           %{
2701             key: "application/ld+json",
2702             type: {:list, :string},
2703             suggestions: ["activity+json"]
2704           }
2705         ]
2706       }
2707     ]
2708   },
2709   %{
2710     group: :pleroma,
2711     key: :shout,
2712     type: :group,
2713     description: "Pleroma shout settings",
2714     children: [
2715       %{
2716         key: :enabled,
2717         type: :boolean,
2718         description: "Enables the backend Shoutbox chat feature."
2719       },
2720       %{
2721         key: :limit,
2722         type: :integer,
2723         description: "Shout message character limit.",
2724         suggestions: [
2725           5_000
2726         ]
2727       }
2728     ]
2729   },
2730   %{
2731     group: :pleroma,
2732     key: :http,
2733     label: "HTTP",
2734     type: :group,
2735     description: "HTTP settings",
2736     children: [
2737       %{
2738         key: :proxy_url,
2739         label: "Proxy URL",
2740         type: [:string, :tuple],
2741         description: "Proxy URL",
2742         suggestions: ["localhost:9020", {:socks5, :localhost, 3090}]
2743       },
2744       %{
2745         key: :send_user_agent,
2746         type: :boolean
2747       },
2748       %{
2749         key: :user_agent,
2750         type: [:string, :atom],
2751         description:
2752           "What user agent to use. Must be a string or an atom `:default`. Default value is `:default`.",
2753         suggestions: ["Pleroma", :default]
2754       },
2755       %{
2756         key: :adapter,
2757         type: :keyword,
2758         description: "Adapter specific options",
2759         suggestions: [],
2760         children: [
2761           %{
2762             key: :ssl_options,
2763             type: :keyword,
2764             label: "SSL Options",
2765             description: "SSL options for HTTP adapter",
2766             children: [
2767               %{
2768                 key: :versions,
2769                 type: {:list, :atom},
2770                 description: "List of TLS version to use",
2771                 suggestions: [:tlsv1, ":tlsv1.1", ":tlsv1.2", ":tlsv1.3"]
2772               }
2773             ]
2774           }
2775         ]
2776       }
2777     ]
2778   },
2779   %{
2780     group: :pleroma,
2781     key: :markup,
2782     label: "Markup Settings",
2783     type: :group,
2784     children: [
2785       %{
2786         key: :allow_inline_images,
2787         type: :boolean
2788       },
2789       %{
2790         key: :allow_headings,
2791         type: :boolean
2792       },
2793       %{
2794         key: :allow_tables,
2795         type: :boolean
2796       },
2797       %{
2798         key: :allow_fonts,
2799         type: :boolean
2800       },
2801       %{
2802         key: :scrub_policy,
2803         type: {:list, :module},
2804         description:
2805           "Module names are shortened (removed leading `Pleroma.HTML.` part), but on adding custom module you need to use full name.",
2806         suggestions: [Pleroma.HTML.Transform.MediaProxy, Pleroma.HTML.Scrubber.Default]
2807       }
2808     ]
2809   },
2810   %{
2811     group: :pleroma,
2812     key: :user,
2813     type: :group,
2814     children: [
2815       %{
2816         key: :deny_follow_blocked,
2817         type: :boolean
2818       }
2819     ]
2820   },
2821   %{
2822     group: :pleroma,
2823     key: Pleroma.User,
2824     type: :group,
2825     children: [
2826       %{
2827         key: :restricted_nicknames,
2828         type: {:list, :string},
2829         description: "List of nicknames users may not register with.",
2830         suggestions: [
2831           ".well-known",
2832           "~",
2833           "about",
2834           "activities",
2835           "api",
2836           "auth",
2837           "check_password",
2838           "dev",
2839           "friend-requests",
2840           "inbox",
2841           "internal",
2842           "main",
2843           "media",
2844           "nodeinfo",
2845           "notice",
2846           "oauth",
2847           "objects",
2848           "ostatus_subscribe",
2849           "pleroma",
2850           "proxy",
2851           "push",
2852           "registration",
2853           "relay",
2854           "settings",
2855           "status",
2856           "tag",
2857           "user-search",
2858           "user_exists",
2859           "users",
2860           "web"
2861         ]
2862       },
2863       %{
2864         key: :email_blacklist,
2865         type: {:list, :string},
2866         description: "List of email domains users may not register with.",
2867         suggestions: ["mailinator.com", "maildrop.cc"]
2868       }
2869     ]
2870   },
2871   %{
2872     group: :cors_plug,
2873     label: "CORS plug config",
2874     type: :group,
2875     children: [
2876       %{
2877         key: :max_age,
2878         type: :integer,
2879         suggestions: [86_400]
2880       },
2881       %{
2882         key: :methods,
2883         type: {:list, :string},
2884         suggestions: ["POST", "PUT", "DELETE", "GET", "PATCH", "OPTIONS"]
2885       },
2886       %{
2887         key: :expose,
2888         type: {:list, :string},
2889         suggestions: [
2890           "Link",
2891           "X-RateLimit-Reset",
2892           "X-RateLimit-Limit",
2893           "X-RateLimit-Remaining",
2894           "X-Request-Id",
2895           "Idempotency-Key"
2896         ]
2897       },
2898       %{
2899         key: :credentials,
2900         type: :boolean
2901       },
2902       %{
2903         key: :headers,
2904         type: {:list, :string},
2905         suggestions: ["Authorization", "Content-Type", "Idempotency-Key"]
2906       }
2907     ]
2908   },
2909   %{
2910     group: :pleroma,
2911     key: Pleroma.Web.Plugs.RemoteIp,
2912     type: :group,
2913     description: """
2914     `Pleroma.Web.Plugs.RemoteIp` is a shim to call [`RemoteIp`](https://git.pleroma.social/pleroma/remote_ip) but with runtime configuration.
2915     **If your instance is not behind at least one reverse proxy, you should not enable this plug.**
2916     """,
2917     children: [
2918       %{
2919         key: :enabled,
2920         type: :boolean,
2921         description: "Enable/disable the plug. Default: disabled."
2922       },
2923       %{
2924         key: :headers,
2925         type: {:list, :string},
2926         description: """
2927           A list of strings naming the HTTP headers to use when deriving the true client IP. Default: `["x-forwarded-for"]`.
2928         """
2929       },
2930       %{
2931         key: :proxies,
2932         type: {:list, :string},
2933         description:
2934           "A list of upstream proxy IP subnets in CIDR notation from which we will parse the content of `headers`. Defaults to `[]`. IPv4 entries without a bitmask will be assumed to be /32 and IPv6 /128."
2935       },
2936       %{
2937         key: :reserved,
2938         type: {:list, :string},
2939         description: """
2940           A list of reserved IP subnets in CIDR notation which should be ignored if found in `headers`. Defaults to `["127.0.0.0/8", "::1/128", "fc00::/7", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]`
2941         """
2942       }
2943     ]
2944   },
2945   %{
2946     group: :pleroma,
2947     key: :web_cache_ttl,
2948     label: "Web cache TTL",
2949     type: :group,
2950     description:
2951       "The expiration time for the web responses cache. Values should be in milliseconds or `nil` to disable expiration.",
2952     children: [
2953       %{
2954         key: :activity_pub,
2955         type: :integer,
2956         description:
2957           "Activity pub routes (except question activities). Default: `nil` (no expiration).",
2958         suggestions: [nil]
2959       },
2960       %{
2961         key: :activity_pub_question,
2962         type: :integer,
2963         description: "Activity pub routes (question activities). Default: `30_000` (30 seconds).",
2964         suggestions: [30_000]
2965       }
2966     ]
2967   },
2968   %{
2969     group: :pleroma,
2970     key: :static_fe,
2971     label: "Static FE",
2972     type: :group,
2973     description:
2974       "Render profiles and posts using server-generated HTML that is viewable without using JavaScript",
2975     children: [
2976       %{
2977         key: :enabled,
2978         type: :boolean,
2979         description: "Enables the rendering of static HTML. Default: disabled."
2980       }
2981     ]
2982   },
2983   %{
2984     group: :pleroma,
2985     key: :feed,
2986     type: :group,
2987     description: "Configure feed rendering",
2988     children: [
2989       %{
2990         key: :post_title,
2991         type: :map,
2992         description: "Configure title rendering",
2993         children: [
2994           %{
2995             key: :max_length,
2996             type: :integer,
2997             description: "Maximum number of characters before truncating title",
2998             suggestions: [100]
2999           },
3000           %{
3001             key: :omission,
3002             type: :string,
3003             description: "Replacement which will be used after truncating string",
3004             suggestions: ["..."]
3005           }
3006         ]
3007       }
3008     ]
3009   },
3010   %{
3011     group: :pleroma,
3012     key: :mrf_follow_bot,
3013     tab: :mrf,
3014     related_policy: "Pleroma.Web.ActivityPub.MRF.FollowBotPolicy",
3015     label: "MRF FollowBot Policy",
3016     type: :group,
3017     description: "Automatically follows newly discovered accounts.",
3018     children: [
3019       %{
3020         key: :follower_nickname,
3021         type: :string,
3022         description: "The name of the bot account to use for following newly discovered users.",
3023         suggestions: ["followbot"]
3024       }
3025     ]
3026   },
3027   %{
3028     group: :pleroma,
3029     key: :modules,
3030     type: :group,
3031     description: "Custom Runtime Modules",
3032     children: [
3033       %{
3034         key: :runtime_dir,
3035         type: :string,
3036         description: "A path to custom Elixir modules (such as MRF policies)."
3037       }
3038     ]
3039   },
3040   %{
3041     group: :pleroma,
3042     key: :streamer,
3043     type: :group,
3044     description: "Settings for notifications streamer",
3045     children: [
3046       %{
3047         key: :workers,
3048         type: :integer,
3049         description: "Number of workers to send notifications",
3050         suggestions: [3]
3051       },
3052       %{
3053         key: :overflow_workers,
3054         type: :integer,
3055         description: "Maximum number of workers created if pool is empty",
3056         suggestions: [2]
3057       }
3058     ]
3059   },
3060   %{
3061     group: :pleroma,
3062     key: :connections_pool,
3063     type: :group,
3064     description: "Advanced settings for `Gun` connections pool",
3065     children: [
3066       %{
3067         key: :connection_acquisition_wait,
3068         type: :integer,
3069         description:
3070           "Timeout to acquire a connection from pool. The total max time is this value multiplied by the number of retries. Default: 250ms.",
3071         suggestions: [250]
3072       },
3073       %{
3074         key: :connection_acquisition_retries,
3075         type: :integer,
3076         description:
3077           "Number of attempts to acquire the connection from the pool if it is overloaded. Default: 5",
3078         suggestions: [5]
3079       },
3080       %{
3081         key: :max_connections,
3082         type: :integer,
3083         description: "Maximum number of connections in the pool. Default: 250 connections.",
3084         suggestions: [250]
3085       },
3086       %{
3087         key: :connect_timeout,
3088         type: :integer,
3089         description: "Timeout while `gun` will wait until connection is up. Default: 5000ms.",
3090         suggestions: [5000]
3091       },
3092       %{
3093         key: :reclaim_multiplier,
3094         type: :integer,
3095         description:
3096           "Multiplier for the number of idle connection to be reclaimed if the pool is full. For example if the pool maxes out at 250 connections and this setting is set to 0.3, the pool will reclaim at most 75 idle connections if it's overloaded. Default: 0.1",
3097         suggestions: [0.1]
3098       }
3099     ]
3100   },
3101   %{
3102     group: :pleroma,
3103     key: :pools,
3104     type: :group,
3105     description: "Advanced settings for `Gun` workers pools",
3106     children:
3107       Enum.map([:federation, :media, :upload, :default], fn pool_name ->
3108         %{
3109           key: pool_name,
3110           type: :keyword,
3111           description: "Settings for #{pool_name} pool.",
3112           children: [
3113             %{
3114               key: :size,
3115               type: :integer,
3116               description: "Maximum number of concurrent requests in the pool.",
3117               suggestions: [50]
3118             },
3119             %{
3120               key: :max_waiting,
3121               type: :integer,
3122               description:
3123                 "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made",
3124               suggestions: [10]
3125             },
3126             %{
3127               key: :recv_timeout,
3128               type: :integer,
3129               description: "Timeout for the pool while gun will wait for response",
3130               suggestions: [10_000]
3131             }
3132           ]
3133         }
3134       end)
3135   },
3136   %{
3137     group: :pleroma,
3138     key: :hackney_pools,
3139     type: :group,
3140     description: "Advanced settings for `Hackney` connections pools",
3141     children: [
3142       %{
3143         key: :federation,
3144         type: :keyword,
3145         description: "Settings for federation pool.",
3146         children: [
3147           %{
3148             key: :max_connections,
3149             type: :integer,
3150             description: "Number workers in the pool.",
3151             suggestions: [50]
3152           },
3153           %{
3154             key: :timeout,
3155             type: :integer,
3156             description: "Timeout while `hackney` will wait for response.",
3157             suggestions: [150_000]
3158           }
3159         ]
3160       },
3161       %{
3162         key: :media,
3163         type: :keyword,
3164         description: "Settings for media pool.",
3165         children: [
3166           %{
3167             key: :max_connections,
3168             type: :integer,
3169             description: "Number workers in the pool.",
3170             suggestions: [50]
3171           },
3172           %{
3173             key: :timeout,
3174             type: :integer,
3175             description: "Timeout while `hackney` will wait for response.",
3176             suggestions: [150_000]
3177           }
3178         ]
3179       },
3180       %{
3181         key: :upload,
3182         type: :keyword,
3183         description: "Settings for upload pool.",
3184         children: [
3185           %{
3186             key: :max_connections,
3187             type: :integer,
3188             description: "Number workers in the pool.",
3189             suggestions: [25]
3190           },
3191           %{
3192             key: :timeout,
3193             type: :integer,
3194             description: "Timeout while `hackney` will wait for response.",
3195             suggestions: [300_000]
3196           }
3197         ]
3198       }
3199     ]
3200   },
3201   %{
3202     group: :pleroma,
3203     key: :restrict_unauthenticated,
3204     label: "Restrict Unauthenticated",
3205     type: :group,
3206     description:
3207       "Disallow viewing timelines, user profiles and statuses for unauthenticated users.",
3208     children: [
3209       %{
3210         key: :timelines,
3211         type: :map,
3212         description: "Settings for public and federated timelines.",
3213         children: [
3214           %{
3215             key: :local,
3216             type: :boolean,
3217             description: "Disallow view public timeline."
3218           },
3219           %{
3220             key: :federated,
3221             type: :boolean,
3222             description: "Disallow view federated timeline."
3223           }
3224         ]
3225       },
3226       %{
3227         key: :profiles,
3228         type: :map,
3229         description: "Settings for user profiles.",
3230         children: [
3231           %{
3232             key: :local,
3233             type: :boolean,
3234             description: "Disallow view local user profiles."
3235           },
3236           %{
3237             key: :remote,
3238             type: :boolean,
3239             description: "Disallow view remote user profiles."
3240           }
3241         ]
3242       },
3243       %{
3244         key: :activities,
3245         type: :map,
3246         description: "Settings for statuses.",
3247         children: [
3248           %{
3249             key: :local,
3250             type: :boolean,
3251             description: "Disallow view local statuses."
3252           },
3253           %{
3254             key: :remote,
3255             type: :boolean,
3256             description: "Disallow view remote statuses."
3257           }
3258         ]
3259       }
3260     ]
3261   },
3262   %{
3263     group: :pleroma,
3264     key: Pleroma.Web.ApiSpec.CastAndValidate,
3265     type: :group,
3266     children: [
3267       %{
3268         key: :strict,
3269         type: :boolean,
3270         description:
3271           "Enables strict input validation (useful in development, not recommended in production)"
3272       }
3273     ]
3274   },
3275   %{
3276     group: :pleroma,
3277     key: :instances_favicons,
3278     type: :group,
3279     description: "Control favicons for instances",
3280     children: [
3281       %{
3282         key: :enabled,
3283         type: :boolean,
3284         description: "Allow/disallow displaying and getting instances favicons"
3285       }
3286     ]
3287   },
3288   %{
3289     group: :ex_aws,
3290     key: :s3,
3291     type: :group,
3292     descriptions: "S3 service related settings",
3293     children: [
3294       %{
3295         key: :access_key_id,
3296         type: :string,
3297         description: "S3 access key ID",
3298         suggestions: ["AKIAQ8UKHTGIYN7DMWWJ"]
3299       },
3300       %{
3301         key: :secret_access_key,
3302         type: :string,
3303         description: "Secret access key",
3304         suggestions: ["JFGt+fgH1UQ7vLUQjpW+WvjTdV/UNzVxcwn7DkaeFKtBS5LvoXvIiME4NQBsT6ZZ"]
3305       },
3306       %{
3307         key: :host,
3308         type: :string,
3309         description: "S3 host",
3310         suggestions: ["s3.eu-central-1.amazonaws.com"]
3311       },
3312       %{
3313         key: :region,
3314         type: :string,
3315         description: "S3 region (for AWS)",
3316         suggestions: ["us-east-1"]
3317       }
3318     ]
3319   },
3320   %{
3321     group: :pleroma,
3322     key: :frontends,
3323     type: :group,
3324     description: "Installed frontends management",
3325     children: [
3326       %{
3327         key: :primary,
3328         type: :map,
3329         description: "Primary frontend, the one that is served for all pages by default",
3330         children: installed_frontend_options
3331       },
3332       %{
3333         key: :admin,
3334         type: :map,
3335         description: "Admin frontend",
3336         children: installed_frontend_options
3337       },
3338       %{
3339         key: :available,
3340         type: :map,
3341         description:
3342           "A map containing available frontends and parameters for their installation.",
3343         children: frontend_options
3344       }
3345     ]
3346   },
3347   %{
3348     group: :pleroma,
3349     key: Pleroma.Web.Preload,
3350     type: :group,
3351     description: "Preload-related settings",
3352     children: [
3353       %{
3354         key: :providers,
3355         type: {:list, :module},
3356         description: "List of preload providers to enable",
3357         suggestions: [
3358           Pleroma.Web.Preload.Providers.Instance,
3359           Pleroma.Web.Preload.Providers.User,
3360           Pleroma.Web.Preload.Providers.Timelines,
3361           Pleroma.Web.Preload.Providers.StatusNet
3362         ]
3363       }
3364     ]
3365   },
3366   %{
3367     group: :pleroma,
3368     key: :majic_pool,
3369     type: :group,
3370     description: "Majic/libmagic configuration",
3371     children: [
3372       %{
3373         key: :size,
3374         type: :integer,
3375         description: "Number of majic workers to start.",
3376         suggestions: [2]
3377       }
3378     ]
3379   },
3380   %{
3381     group: :pleroma,
3382     key: Pleroma.User.Backup,
3383     type: :group,
3384     description: "Account Backup",
3385     children: [
3386       %{
3387         key: :purge_after_days,
3388         type: :integer,
3389         description: "Remove backup achives after N days",
3390         suggestions: [30]
3391       },
3392       %{
3393         key: :limit_days,
3394         type: :integer,
3395         description: "Limit user to export not more often than once per N days",
3396         suggestions: [7]
3397       }
3398     ]
3399   },
3400   %{
3401     group: :prometheus,
3402     key: Pleroma.Web.Endpoint.MetricsExporter,
3403     type: :group,
3404     description: "Prometheus app metrics endpoint configuration",
3405     children: [
3406       %{
3407         key: :enabled,
3408         type: :boolean,
3409         description: "[Pleroma extension] Enables app metrics endpoint."
3410       },
3411       %{
3412         key: :ip_whitelist,
3413         label: "IP Whitelist",
3414         type: [{:list, :string}, {:list, :charlist}, {:list, :tuple}],
3415         description: "Restrict access of app metrics endpoint to the specified IP addresses."
3416       },
3417       %{
3418         key: :auth,
3419         type: [:boolean, :tuple],
3420         description: "Enables HTTP Basic Auth for app metrics endpoint.",
3421         suggestion: [false, {:basic, "myusername", "mypassword"}]
3422       },
3423       %{
3424         key: :path,
3425         type: :string,
3426         description: "App metrics endpoint URI path.",
3427         suggestions: ["/api/pleroma/app_metrics"]
3428       },
3429       %{
3430         key: :format,
3431         type: :atom,
3432         description: "App metrics endpoint output format.",
3433         suggestions: [:text, :protobuf]
3434       }
3435     ]
3436   },
3437   %{
3438     group: :pleroma,
3439     key: ConcurrentLimiter,
3440     type: :group,
3441     description: "Limits configuration for background tasks.",
3442     children: [
3443       %{
3444         key: Pleroma.Web.RichMedia.Helpers,
3445         type: :keyword,
3446         description: "Concurrent limits configuration for getting RichMedia for activities.",
3447         suggestions: [max_running: 5, max_waiting: 5],
3448         children: [
3449           %{
3450             key: :max_running,
3451             type: :integer,
3452             description: "Max running concurrently jobs.",
3453             suggestion: [5]
3454           },
3455           %{
3456             key: :max_waiting,
3457             type: :integer,
3458             description: "Max waiting jobs.",
3459             suggestion: [5]
3460           }
3461         ]
3462       },
3463       %{
3464         key: Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy,
3465         type: :keyword,
3466         description: "Concurrent limits configuration for MediaProxyWarmingPolicy.",
3467         suggestions: [max_running: 5, max_waiting: 5],
3468         children: [
3469           %{
3470             key: :max_running,
3471             type: :integer,
3472             description: "Max running concurrently jobs.",
3473             suggestion: [5]
3474           },
3475           %{
3476             key: :max_waiting,
3477             type: :integer,
3478             description: "Max waiting jobs.",
3479             suggestion: [5]
3480           }
3481         ]
3482       }
3483     ]
3484   }
3485 ]