peppermint.json Configuration Guide

This page contains a comprehensive guide to all the settings present in peppermint.json. If anything's missing or unclear, please open an issue!

Current Pepperminty Wiki Version: v0.24

Note that settings added after the last stable release may not be shown on the version on until the next release.

Type Legend

Type Meaning
text A string of text, which may or may or may not allow HTML. Consult individual descriptions for more specific information.
textarea A longer string of text that may or may not allow HTML.
array An array of strings.
url A url to a remote resource.
checkbox A boolean value - i.e. either true or false.
email An email address.
number A numerical value that may or may not be floating-point.
usertable An object that contains the users' usernames and passwords.
nav A complex array of items that should appear as a navigation bar. Consult the description for nav_links for more information.
map An object that maps a set of values onto another set of values.

Configuration Guide

We have 119 configurable settings so far!

🔗 Key Type Description Default Value
🔗firstrun_completecheckboxWhether the first-run wizard has completed or not.
🔗sitenametextYour wiki's name.
"Pepperminty Wiki"
🔗defaultpagetextThe name of the page that will act as the home page for the wiki. This page will be served if you don't specify a page.
"Main Page"
🔗admindetails_nametextYour name as the wiki administrator.
🔗admindetails_emailemailYour email address as the wiki administrator. Will be displayed as a support contact address.
🔗faviconurlA url that points to the favicon you want to use for your wiki. By default this is set to a data: url of a Peppermint (Credit: by bluefrog23, source:
🔗logo_urlurlA url that points to the site's logo. Leave blank to disable. When enabled the logo will be inserted next to the site name on every page.
🔗logo_positiontextThe side of the site name at which the logo should be placed.
🔗show_subpagescheckboxWhether to show a list of subpages at the bottom of the page.
🔗subpages_display_depthtextThe depth to which we should display when listing subpages at the bottom the page.
🔗random_page_excludetextThe pages names matching this regular expression won't be chosen when a random page is being picked to send you to by the random action.
🔗random_page_exclude_redirectscheckboxCauses the random action to avoid sending the user to a redirect page.
🔗redirect_absolute_enablecheckboxWhether to enable absolute redirects or not. Enable only if you trust everyone who has edit access to your wiki, as it is possible to redirect a page to anywhere on the Internet - including a malicious website - hence the reason why this is disabled by default for safety.
🔗editing_messagetextareaA message that will appear just before the submit button on the editing page. May contain HTML.
"\u003Ca href='?action=help#20-parser-default' target='_blank'\u003EFormatting help\u003C\/a\u003E (\u003Ca href='https:\/\/\/adam-p\/markdown-here\/wiki\/Markdown-Cheatsheet' target='_blank'\u003EMarkdown Cheatsheet\u003C\/a\u003E)\u003Cbr \/\u003E\nBy submitting your edit or uploading your file, you are agreeing to release your changes under \u003Ca href='?action=view&page=License' target='_blank'\u003Ethis license\u003C\/a\u003E. Also note that if you don't want your work to be edited by other users of this site, please don't submit it here!"
🔗editing_tags_autocompletecheckboxWhether to enable autocomplete for the tags box in the page editor.
🔗admindisplaychartextThe string that is prepended before an admin's name on the nav bar. Defaults to a diamond shape (◆).
🔗protectedpagechartextThe string that is prepended a page's name in the page title if it is protected. Defaults to a lock symbol. (🔒)
🔗editingcheckboxWhether editing is enabled.
🔗anoneditscheckboxWhether users who aren't logged in are allowed to edit your wiki.
🔗maxpagesizenumberThe maximum page size in characters.
🔗parsertextThe parser to use when rendering pages. Defaults to an extended version of parsedown (
🔗parser_cachecheckboxWhether parser output should be cached to speed things up. The cache directory is ._cache in the data directory - delete it if you experience issues (unlikely).
🔗parser_cache_min_sizenumberThe minimum size a source string must be (in bytes) before it's considered eligible for caching.
🔗parser_ext_renderers_enabledcheckboxWhether to enable external diagram renderer support, which is part of the parsedown parser. See the parser_ext_renderers setting below for more information.
🔗parser_ext_renderersparserextUsed by the parsedown parser as an object mapping fenced code block languages to their respective external renderers. Should be in the form language_codeexternal renderer definition. See the default for examples on how to define an external renderer. Warning: On Windows, the enforcement of strict time limits is not possible. Beware of DoS attacks!
{"nomnoml":{"name":"nomnoml","description":"The nomnoml UML diagram renderer. Requires the 'nomnoml' npm package to be globally installed.","url":"http:\/\/\/","cli":"nomnoml {input_file} {output_file} 0","cli_mode":"file","output_format":"image\/svg+xml","output_classes":["invert-when-dark"]},"plantuml":{"name":"PlantUML","description":"The PlantUML diagram renderer. Supports many different diagram types. Requires plantuml to be installed.","url":"http:\/\/\/","cli":"plantuml -tsvg -pipe","cli_mode":"pipe","output_format":"image\/svg+xml"},"abc":{"name":"ABC Notation","description":"A simple music notation typesetter. Much easier to understand than Lilypond. Requires abcm2ps to be installed.","url":"https:\/\/\/","cli":"abcm2ps -g -O - -","cli_mode":"pipe","output_format":"image\/svg+xml","output_classes":["invert-when-dark"]},"latexserver":{"name":"Server-Side MathJax","description":"Client-side Mathjax via the 'enable_math_rendering' setting not your thing? Try it server-side instead! Requires the 'mathjax-node-cli' npm package to be globally installed. Note that you obviously don't want to include the latex math inside dolar signs $$ as the reference link tells you to.","url":"https:\/\/\/q\/5020\/221181","cli":"tex2svg -- {input_text}","cli_mode":"substitution_pipe","output_format":"image\/svg+xml","output_classes":["invert-when-dark"]},"svginkscape":{"name":"Inkscape SVG","description":"Server-side SVG-to-PNG rendering with inkscape. Requires inkscape to be installed and in your PATH, of course.","url":"https:\/\/\/en-US\/docs\/Web\/SVG\/Element","cli":"inkscape {input_file} -e {output_file}","cli_mode":"file","output_format":"image\/svg+xml","output_classes":[]}}
🔗parser_ext_time_limitnumberThe number of seconds external renderers are allowed to run for. Has no effect if external renderers are turned off. Also currently has no effect on Windows.

Whether to allow anonymous users to render new diagrams with the external renderer. When disabled, anonymous users will still be allowed to recall pre-rendered items from the cache, but will be unable to generate brand-new diagrams.

Note that if you allow anonymous edits this setting won't fully protect you: anonymous users could edit a page and insert a malicious diagram, and then laer a logged in user could unwittingly invoke the external renderer on the anonymous user's behalf.

🔗parser_toc_heading_levelnumberThe level of heading to create when generating a table of contents. Corresponds directly with the HTML h1-h6 tags. A value of 0 disables the heading.
🔗parser_onebox_enabledcheckboxWhether oneboxing is enabled or not. Oneboxes are fancy renderings of an internal link with a preview of the text on the linked page. To generate a onebox, an internal link must be on it's own on a line with nothing before or after it.
🔗parser_onebox_preview_lengthnumberThe number of characters preview to display in oneboxes.
🔗interwiki_index_locationtextThe location to find the interwiki wiki definition file, which contains a list of wikis along with their names, prefixes, and root urls. May be a URL, or simply a file path - as it's passed to file_get_contents(). If left blank, interwiki link parsing is disabled.
🔗clean_raw_htmlcheckboxWhether page sources should be cleaned of HTML before rendering. It is STRONGLY recommended that you keep this option turned on.
🔗all_untrustedcheckboxWhether to treat both page sources and comment text as untrusted input. Untrusted input has additional restrictions to protect against XSS attacks etc. Turn on if your wiki allows anonymous edits.
🔗enable_math_renderingcheckboxWhether to enable client side rendering of mathematical expressions with MathJax ( Math expressions should be enclosed inside of dollar signs ($). Turn off if you don't use it.
🔗theme_colourtextThe theme colour to set in the <meta name='theme-color' content='value' /> meta tag. Apparently used to customise the UI colour on mobile devices, and also by when platforms such as Discord are generating rich embeds to set the accent colour. Set to an empty string to disable.
🔗usersusertableAn array of usernames and passwords - passwords should be hashed with password_hash() (the hash action can help here)
🔗adminsarrayAn array of usernames that are administrators. Administrators can delete and move pages.
🔗anonymous_user_nametextThe default name for anonymous users.
🔗user_page_prefixtextThe prefix for user pages. All user pages will be considered to be under this page. User pages have special editing restrictions that prevent anyone other thant he user they belong to from editing them. Should not include the trailing forward slash.
🔗user_preferences_button_texttextThe text to display on the button that lets logged in users change their settings. Defaults to a cog (aka a 'gear' in unicode-land).
"⚙ "
🔗password_algorithmtextThe algorithm to utilise when hashing passwords. Takes any value PHP's password_hash() does.
🔗password_costnumberThe cost to use when hashing passwords.
🔗password_cost_timenumberThe desired number of milliseconds to delay by when hashing passwords. Pepperminty Wiki will automatically update the value of password_cost to take the length of time specified here. If you're using PASSWORD_ARGON2I, then the auto-update will be disabled.
🔗password_cost_time_intervalnumberThe interval, in seconds, at which the password cost should be recalculated. Set to -1 to disable. Default: 1 week
🔗password_cost_time_lastchecknumberPseudo-setting used to keep track of the last recalculation of password_cost. Is updated with the current unix timestamp every time password_cost is recalculated.
🔗new_password_lengthnumberThe length of newly-generated passwords. This is currently used in the user table when creating new accounts.
🔗require_login_viewcheckboxWhether to require that users login before they do anything else. Best used with the data_storage_dir option.
🔗readingtime_enabledcheckboxWhether to display the estimated reading time beneath the header of every wiki page.
🔗readingtime_languagetextThe language code to use when estimating the reading time. Possible values: en, ar, de, es, fi, fr, he, it, jw, nl, pl, pt, ru, sk, sv, tr, zh. Unfrotuantely adding multi-language support to the user interface is an absolutely massive undertaking that would take ages, as Peppermitny Wiki waasn't designed with that in mind :-/
🔗readingtime_actiontextThe name of the action to enable the reading time estimation on. You probably shouldn't change this unless you know what you're doing.
🔗data_storage_dirtextThe directory in which to store all files, except the main index.php.
🔗watchlists_enablecheckboxWhether the watchlists feature should be enabled or not.
🔗delayed_indexing_timenumberThe amount of time, in seconds, that pages should be blocked from being indexed by search engines after their last edit. Aka delayed indexing.
🔗comment_enabledcheckboxWhether commenting is enabled or not. If disabled, nobody will be able to post new comments, but existing comments will still be shown (if the feature-comments module is installed, of course - otherwise this setting will have no effect).
🔗comment_hide_allcheckboxWhether to hide all comments, as if the commenting feature never existed. If you want to enable this setting, consider using the downloader (link in the docs) to exclude the feature-comments module instead.
🔗anoncommentscheckboxWhether to allow anonymous user to make comments. Note that anonymous users are not able to delete their own comments (since they are not logged in, there's no way to know if they were the original poster or not)
🔗comment_max_lengthnumberThe maximum allowed length, in characters, for comments
🔗comment_min_lengthnumberThe minimum allowed length, in characters, for comments
🔗comment_time_icontextThe icon to show next to the time that a comment was posted.
🔗history_max_revisionsnumberThe maximum revisions that should be stored. If this limit is reached, them the oldest revision will be deleted. Defaults to -1, which is no limit.
🔗history_revert_require_moderatorcheckboxWhether a user must be a moderator in order use the page reversion functionality.
🔗upload_enabledcheckboxWhether to allow uploads to the server.
🔗upload_allowed_file_typesarrayAn array of mime types that are allowed to be uploaded.
🔗preview_file_typetextThe default file type for previews.
🔗default_preview_sizenumberThe default size of preview images in pixels.
🔗mime_extension_mappings_locationtextThe location of a file that maps mime types onto file extensions and vice versa. Used to generate the file extension for an uploaded file. See the configuration guide for windows instructions.
🔗mime_mappings_overridesmapOverride mappings to convert mime types into the appropriate file extension. Used to override the above file if it assigns weird extensions to any mime types.
🔗min_preview_sizenumberThe minimum allowed size of generated preview images in pixels.
🔗max_preview_sizenumberThe maximum allowed size of generated preview images in pixels.
🔗avatars_showcheckboxWhether or not to show avatars requires the 'user-preferences' and 'upload' modules, though uploads themselves can be turned off so long as all avatars have already been uploaded - it's only the 'preview' action that's actually used.
🔗avatars_gravatar_enabledcheckboxWhether gravatars should be displayed if an uploaded avatar is not found. If disabled, users without avatars will show a blank image instead.
🔗avatars_sizenumberThe image size to render avatars at. Does not affect the size they're stored at - only the inline rendered size (e.g. on the recent changes page etc.)
🔗search_characters_contextnumberThe number of characters that should be displayed either side of a matching term in the context below each search result.
🔗search_characters_context_totalnumberThe total number of characters that a search result context should display at most.
🔗search_title_matches_weightingnumberThe weighting to give to search term matches found in a page's title.
🔗search_tags_matches_weightingnumberThe weighting to give to search term matches found in a page's tags.
🔗search_didyoumean_enabledcheckboxWhether to enable the 'did you mean?' search query typo correction engine.
🔗search_didyoumean_editdistancenumberThe maximmum edit distance to search when checking for typos. Increasing this number causes an exponential increase in the amount of computing power required to correct all spellings.
🔗search_didyoumean_cost_insertnumberThe insert cost to use when calculating levenshtein distances. If this value is changed then the did you mean index must be rebuilt.
🔗search_didyoumean_cost_deletenumberThe delete cost to use when calculating levenshtein distances. If this value is changed then the did you mean index must be rebuilt.
🔗search_didyoumean_cost_replacenumberThe replace cost to use when calculating levenshtein distances. If this value is changed then the did you mean index must be rebuilt.
🔗search_didyoumean_seed_wordtextThe seed word for the didyoumean index tree. Has a number of special properties:
  • Can't be added to the index
  • Can't be removed from the index
  • Is never suggested
Since words are transliterated to lowercase ascii before indexing, it's recommended to set this to a word that contains characters that will never be present after transliteration.
🔗dynamic_page_suggestion_countnumberThe number of dynamic page name suggestions to fetch from the server when typing in the page search box. Note that lowering this number doesn't really improve performance. Set to 0 to disable.
🔗similarpages_enabledcheckboxWhether similar pages are displayed beneath the content and above the comments on a page
🔗similarpages_countnumberThe number of similar page suggestions to make.
🔗defaultactiontextThe default action. This action will be performed if no other action is specified. It is recommended you set this to "view" - that way the user automatically views the default page (see above).
🔗email_debug_dontsendcheckboxIf set to true, emails are logged to the standard error instead of being actually sent.
🔗email_subject_utf8checkboxWhether to encode the subject of emails sent to allow them to contain unicode characters. Without this, email subjects will be transliterated to ASCII. If utf-8 email subjects are disabled, page names may not be represented properly.
🔗email_body_utf8checkboxWhether to send emails with utf-8 bodies. If set to false, email bodies will be transliterated to ASCII. If utf-8 email bodies are disabled, page names may not be represented properly.
🔗email_verify_addressescheckboxWhether user email addresses must be verified in order to send emails to them.
🔗updateurlurlThe url from which to fetch updates. Defaults to the master (development) branch. MAKE SURE THAT THIS POINTS TO A *HTTPS* URL, OTHERWISE SOMEONE COULD INJECT A VIRUS INTO YOUR WIKI!
🔗optimize_pagescheckboxWhether to optimise all webpages generated.
🔗minify_pageindexcheckboxWhether to minify the page index when saving it. Improves performance slightly (especially on larger wikis), but can make debugging and quick ninja-edits more awkward. Note that this only takes effect when the page index is next saved.
🔗http2_server_pushcheckboxWhether HTTP/2.0 server should should be enabled. If true, then 'link' HTTP headers will be attached to rendered pages specifying files to push down. Note that web server support also has to be abled for this to work, as PHP can't push resources to the client on its own.
🔗http2_server_push_itemsserver-pushAn array of items to push to clients when rendering pages. Should be in the format [ [type, path], [type, path], ....], where type is a resource type, and path is a relative url path to a static file to send via HTTP/2.0 Server Push.
Note: These resources will only be pushed if your web server also has support for the link: HTTP/2.0 header, and it's a page that being rendered. If it's some other thing that being sent (e.g. an image, error message, event stream, redirect, etc.), then no server push is indicated by Pepperminty Wiki. Test your estup with your browser's developer tools, or This testing site.
🔗max_recent_changesnumberThe maximum number of recent changes to display on the recent changes page.
🔗export_allow_only_adminscheckboxWhether to only allow adminstrators to export the your wiki as a zip using the page-export module.
🔗stats_update_intervalnumberThe number of seconds which should elapse before a statistics update should be scheduled. Defaults to once a day.
🔗stats_update_processingtimenumberThe maximum number of milliseconds that should be spent at once calculating statistics. If some statistics couldn't fit within this limit, then they are scheduled and updated on the next page load. Note that this is a target only - if an individual statistic takes longer than this, then it won't be interrupted. Defaults to 100ms.
🔗sessionprefixtextYou shouldn't need to change this. The prefix that should be used in the names of the session variables. Defaults to "auto", which automatically generates this field. See the readme for more information.
🔗sessionlifetimenumberAgain, you shouldn't need to change this under normal circumstances. This setting controls the lifetime of a login session. Defaults to 24 hours, but it may get cut off sooner depending on the underlying PHP session lifetime.
🔗disable_peppermint_access_checkcheckboxDisables the access check for peppermint.json on first-run. VERY DANGEROUS. Use only for development. Note that it's recommend to block access to peppermint.json for a reason - it contains your site secret and password hashes, so an attacker could do all sorts of nefarious things if it's left unblocked.
🔗css_theme_autoupdate_urlurlA url that points to the css theme file to check for updates. If blank, then automatic updates are disabled.
🔗css_theme_autoupdate_intervalnumberThe interval, in seconds, that updates to the theme should be checked for. Defaults to every week. A value of -1 disables automatic updates.
🔗css_theme_autoupdate_lastchecknumberThe timestamp of the last time that updates for the selected theme were last checked for. To disable automatic updates, you should set css_theme_autoupdate_interval to -1 instead of changing this setting.
🔗csstextareaA string of css to include. Will be included in the <head> of every page inside a <style> tag. This may also be an absolute url - urls will be referenced via a <link rel='stylesheet' /> tag. If the theme gallery is installed and automatic updates enabled, then the value of this property is managed by the theme gallery and changes may be overwritten (try the css_custom setting instead).
🔗css_customtextareaA string of custom CSS to include on top of the base theme css. Allows for theme customisations while still enabling automatic updates :D Just like the css setting, this one can also be a url.
"\/* Enter your custom css here. *\/"
🔗cli_enabledcheckboxWhether the Pepperminty Wiki CLI is enabled or not.
🔗cli_prompttextThe string to use as the prompt in the CLI shell.
"\u0001\u001b[1m\u001b[31m\u0002#\u0001\u001b[0m\u0002 "
🔗sidebar_showcheckboxWhether to show the sidebar by default to all users or not.
🔗sidebar_maxdepthnumberThe maximum depth of pages to show in the sidebar. Top-level pages are of depth 0, subpages thereof are of depth 1, etc. Defaults to a depth of 1, which indicates to display both top-level pages and their subpages.