PmWiki

PmWiki is temporarily offline while we arrange to upgrade our PHP installation.

Thank you for your patience and understanding. If you have any questions, please contact us at 5ko [snail] 5ko [period] fr.

In the meantime, you can find recent release notes, links to the software, and other downloads below.

You may also be able to access a recent archived copy of this page through the Internet Archive.

Petko


Core downloads, internationalization

Installed and other versions of PmWiki are available for download at www.pmwiki.org/pub/pmwiki/.

Direct links to core software

Latest stable release (pmwiki-2.7.7 or more recent):

Direct links to installed release pmwiki-2.7.7:

You can download the latest development code packed as a zip archive here:

International language packs

Language packs can be installed on top of the core software.

Release notes

Version 2.7.7 (2026-10-23)

This version includes updates for audio and video players, the PmSyntax highlighting, the PmLib and Utilities JavaScript library, InterMap links, diagnostic tools, Sortable, downloads,

The core functions PrintFmt, PrePrintFmt, PrintSkin were refactored, to allow directives from included headers, footers, and sidebars, to insert styles and scripts in $HTMLHeaderFmt.

A fix for nested markup functions calling MarkupToHTML() with a different $pagename.

Changes to the (:details:) directive to work with simpler "open" and "summary" attributes, and without a "summary" attribute.

The documentation was updated.

Version 2.7.6 (2026-09-18)

This version includes updates for recent PHP versions and fixes a bug with the markup expression {(substr ...)}, which in some cases could return an empty string.

Page histories will now reveal the IP addresses of edits only to administrators.

Audio and video improvements, the hash fragment keyword "lazy" can now be used as an alias of "loading=lazy", and videos are responsive, scaled down if they would be larger than the screen size, keeping their aspect ratio.

The PageList variable $MatchSearched count will no longer include protected pages where the user does not have read access.

This version will prevent saving page names with invalid UTF-8 bytes. For this reason the helper function pm_recode() will now prefer mb_convert_encoding() if it exists to iconv().

A new variable $AuthorMaxLength shortens very long author names, default to 64 characters.

There were also improvements to some helper functions, and the documentation was updated.

Version 2.7.5 (2026-08-05)

This version closes a vulnerability in PmWikis on Windows servers, reported by Michael Engelke. It potentially allows a person with edit access to a page, to retrieve the full source text of another page in a read-protected group where the person should not have access. All wikis versions 2.0.0 to 2.7.4 on Windows servers may be vulnerable.

If your PmWiki installation:

  • runs on a Windows server, and
  • your wiki allows editing for untrusted users, even only WikiSandbox, and
  • you may have sensitive information in restricted wikigroups, such as SiteAdmin.NotifyList, and
  • you cannot immediately upgrade to 2.7.5,

If your wiki meets all the conditions above, to close the vulnerability before you've had the chance to upgrade, you can add this in farmconfig.php or config.php:

if(!empty($_REQUEST['template']))
  $_REQUEST['template'] = preg_replace('![./\\\\]+!', '.', $_REQUEST['template']);

Additionally, this version includes updates for recent PHP versions, and the documentation was updated.

Version 2.7.4 (2026-07-31)

This version fixes bugs with the display of page variables {$Action}, {$PasswdRead} and related, and with the undocumented pagelist variable .

The global variable $action will now be sanitized before loading config.php, keeping only Latin letters, digits, dashes, underscores, and slashes. If a local customization requires the previous definition, it can redefine the variable from $_GET and $_POST.

The documentation was updated.

Version 2.7.3 (2026-07-26)

This version fixes a bug with the markup expression {(substr ...)} when arguments are missing.

Version 2.7.2 (2026-07-26)

This version fixes a bug with the markup expression {(substr ...)} when UTF-8 is not enabled.

Version 2.7.1 (2026-07-24)

Fixed a mangled $Version variable.

Version 2.7.0 (2026-07-24)

This version includes many changes and additions.

Important if in local configuration PageVariables are defined with the $authpage variable, please see the updated configuration snippet in PageVariables#security. Please let me know if you have any questions or difficulties.

This change was caused by work in progress to reduce and remove the core reliance on the PHP eval() function. Currently all core PageVariables, Markup expressions, and most Conditions definitions, which previously used eval(), have been rewritten to use callback functions which should be more secure and stable, and faster. Existing custom locally defined page variables, conditions, and markup expressions, should still work as before, but it is now possible to update them to the new API.

New PHP variables were added, see documentation for $RevisionNum, $EnableVersionedAssets, $VersionedAssetKeys, $JsonEncodeFn, $EnableBodyDataAttrs, $VisibleAnchor, $TextSectionQualifyPatterns, $EnableReadOnlyWithoutConfig.

New Page Variables were added, {$RevisionNum}, {$VersionNum}, {$VersionShort}, {$CurrentLocalTime}, {$CurrentTime}, {$Targets}.

A "visible anchor" markup was added, with double hash like [[##anchor]] and in headings !!##visible-anchor Heading. It will show the hash character only, linking to itself, easy for a user to right-click and copy the link to the anchor. The variable $VisibleAnchor can be defined to change the character shown. Such anchors can be used to include sections of other pages with (:include Page#visible-anchor:) (single hash in the include directive).

A new page store class, TempPageStore, saves page changes in session storage, for the current visitor only. This will now be enabled if a wiki does not have a local/config.php file to prevent bots from instantly abusing new wikis. See $EnableReadOnlyWithoutConfig to change change it.

The [++big++] and [--small--] font sizes are now defined as class names in pmwiki-core.css rather than the previous unsafe-inline style.

The {(ftime %#d)} markup expression, and the PSFT() helper function, now accept "percent hash letter" formats like "%#d" and "%#m" and others, which would remove any leading spaces and zeros from the related formats "%d" and "%m".

The optional core script tools.php was refactored into separate scripts. Recipes can now include only the scripts they need.

A new optional script request.php was added with helper functions to simplify remote requests from recipes using the PHP-cURL functions.

Input forms can now include a field with the names of optional fields like checkboxes, see Forms#optkeys.

The conditional markup (:if enabled Variable.Key:) can now be used to check if a specific key of a PHP global array is enabled, in this case $GLOBALS['Variable']['Key']. This is intended mostly for recipes that don't need to define multiple global variables now.

A new warning will now appear above the edit and upload forms if PmWiki detects that the temporary directories have become read-only. This may indicate grave problems and the system operator or the technical support team should be notified.

Another warning will appear in the upload form, if upload_max_filesize or post_max_size from php.ini are smaller than $UploadMaxSize.

The "jxl" image upload extension, and embed extension, was added as browsers recently started supporting it.

The Dropzone will now show a progress bar while a file is uploaded, and the icons were removed.

Various improvements and additions to core helper functions, the PmLib JavaScript library, minor optimizations, bug fixes and updates for recent PHP versions, see Change log.

The documentation was updated.

Version 2.6.0 (2026-05-16)

This version includes many improvements to the JavaScript helper libraries, to the core Syntax highlighting, to WikiStyles, to uploads, to page variables, to the keyboard shortcuts.

Audio and video files can now be played in a simple embedded media player (experimental). See Media for instructions to enable it.

Attach: links will now strip #hash fragments when resolving filenames, unless the wiki has enabled locally the "#" character in uploaded filenames. In such a case some Media features may be unavailable.

A new variable $EnableHideAttachPrefix was added.

PmToken will now fail if the PHP installation is missing a secure random number generator. In this case, $EnablePmToken = 0; could be set, but there are certainly bigger problems and changing hosting providers should be considered.

New form inputs datetime-local and pmdatetime were added.

A new condition "grouphome" was added, true when the current page or a selected page is a group's homepage.

It is now possible to set default values to page text variables, include variables, template variables, in this format:

{*$:VarName|default value if empty or unset}
default

The default value can be single line and cannot contain the braces {} characters.

See Cookbook:EditHelp for the current keyboard shortcuts and auto-brackets in the edit area.

The documentation was updated.

For full list of changes see ChangeLog.

Version 2.5.9 (2026-04-05)

This version includes optimizations to the JavaScript helper libraries.

Core syntax highlighting in the edit textarea will now have a semi-transparent selection, so selected markup will be highlighted. For programming languages, it now allows for language autodetection with %hlt%, and the detected language will appear as a tooltip title over the highlighted block.

LocalTimes has been refactored, and timestamps on page histories will now be wrapped in semantic <time> elements.

A bug was fixed with SaveAttributes, another one with Sortable tables when a row could have fewer cells than other rows, another one with $MessagesFmt appearing multiple times on preview edit.

A new wikistyle %download% [[link]] or %download=filename.pdf% [[link]] was added for links. It instructs the browser to show the SaveAs dialog box rather than opening the link. The suggested filename can optionally be supplied.

The functions handling $EnableEditAutoText and $EditAutoBrackets were refactored. $EditAutoBrackets was removed from $EnableCommonEnhancements. Automatically closing brackets can now have separate character sets when text is selected from when it is not. A number of new keyboard shortcuts for editing were added, see Cookbook:EditHelp.

The function ParseArgs() will now ignore/drop unquoted empty arguments like name=, previously it returned these as positional arguments which could cause problems with some pagelists. If a string looks like an argument and needs to be returned as positional one, it should be quoted like "name=" (this was already documented for pagelist and search).

The FixUrl GuiEdit button has 2 new functions. Clicking on it url-encodes some special characters in selected text (for link URLs, like before). If Shift is held down, it will encode all special and international characters. If Control is held down, it will try to decode all encoded characters.

The page SiteAdmin.AuthUser can now have user properties on subsequent lines if they end with a backslash.

Some additional debug variables are shown in StopWatch for UpdatePage().

The documentation was updated.

Version 2.5.8 (2026-03-09)

This version adds a new variable $EnableEscapedUrlEmbed. Between 2.2.123 and 2.5.7, there was an unintentional bug (or feature if you used it) where linking to a picture with an escaped filename (because it contains spaces or special characters) behaved inconsistently from a picture without special characters; and a link to a picture without special characters would behave differently if it had escaped text or not.

MarkupEmbed pictureLink to picture
<=2.5.6>=2.5.7<=2.5.6>=2.5.7
Attach:FileNoSpaces.jpgYes ✅No ✅
Attach:[=FileNoSpaces.jpg=]Yes ❌No ✅Yes ❌No ✅
Attach:[=With Spaces.jpg=]
Attach:[=FileNoSpaces=].jpgYes ✅
Attach:[=With Spaces=].jpg
[[Attach:FileNoSpaces.jpg]]No ✅Yes ✅
[[Attach:With Spaces.jpg]]

✅=expected, ❌=unexpected

Both Attach: and URL links to images were affected.

Version 2.5.7 restores what is expected and considered consistent behavior. If your wiki has embedded pictures with spaces by escaping the full name, you can revert to the pre-2.5.7 behavior until you move the extension out of the escaped markup. Add this to config.php:

$EnableEscapedUrlEmbed = 1;

Light and dark scheme stylesheets and pictures are now enabled or disabled much faster on page load, to prevent unintentional flash of the wrong color theme.

This version also fixes a warning when $_SERVER['REMOTE_ADDR'] is undefined, and updates the documentation.

Version 2.5.7 (2026-03-08)

This version includes updates for PHP8, some bug fixes, and optimizations.

A new variable $IsLocalhost will be true when the wiki server is on the same computer as the browser, this can simplify configuration for mirrored wikis.

The PmLib JavaScript helper library was refactored for easier usage.

With tables, if the first and last rows have only header cells, they will be moved to <thead> or <thoot> elements. This helps with styling, sorting, filtering, and printing.

The Sortable tables function was rewritten, it now supports complex headers and footers with rowspan and colspan, and a new way to define column sort types (numeric, alphabetical, date, or no sorting).

A CSS class "center" was added, and link colors in the %note% style will inherit the note color.

The documentation was updated.

Version 2.5.6 (2026-02-08)

This version includes improvements to the Table of contents. A new option $PmTOC['Closed'] can be enabled to initially collapse the TOC. When printing, an open TOC will be shown full height, and a closed one will be fully hidden.

A new wikistyle "apply=h" keyword was added as in %h ...styles% that applies to any level of heading h1-h6 on the same line. Previously we needed to use %block ...styles%.

A new variable $UrlGetFunction allows to configure a custom function to retrieve remote content. Currently the features RecipeCheck and BlockList use this function, by default it is file_get_contents().

UrlApprovals will now show a message if there are no pending links in the current page, and will list and link to included and transcluded pages like headers or footers.

Sortable tables never worked reliably for tables with cells spanning multiple rows or columns, such tables are now not processed.

Minor improvements or bug fixes with Datashift, the %o time format, the mkdirpdeny() helper function, and the documentation was updated.

Version 2.5.5 (2026-01-10)

This release includes updates for recent PHP versions.

New markup !!#id Heading allows to define id attributes of headings or page sections. These can be referenced in links to the heading, and it is possible to include page sections based on these identifiers, similar to [[#anchor]]. Before or after upgrading to 2.5.5, you may want to search your wiki for "!#" in case there are matches on your pages, and if needed, insert a space before the "#" characters.

Improvements to Forms features. The edit form with $EnableMergeLastMinorEdit, checking the "Minor edit" checkbox will pre-fill the change summary field with the previous summary. It is now possible to define custom attributes to the options of a "select" field. The Not-Saved-Warning feature is now available to custom forms with the attribute (:input form data-confirmunload=1:); if such form has changes, and the user tries to leave the page without saving the changes, the browser will ask for confirmation.

Improvements to the core JavaScript utilities and the PmLib library. Optimizations for PmSyntax for long or complex texts. Sortable tables will show the arrows to the left if the header cell is right-aligned. It is now possible to Shift+click to check or uncheck multiple checkboxes. Table of contents will show a tooltip to the back-to-contents link, and will no longer number a single heading.

Core styles defined in $HTMLStylesFmt are already in pub/lib/pmwiki-core.css, now the duplicates have been removed from the scripts. This makes it easier to redefine them by skins and local styles, and is a step toward a stricter Content-Security-Policy.

The dark theme now has slightly darker backgrounds to the "simpletable" tables.

A new markup (:dropzone uploadpage=Group.Name:) allows to include an area where editors can drop files for upload, without opening the page for editing or uploading. It is possible to have multiple such zones in a page that upload files to different pages or groups.

Url approvals have a new confirmation page to preview all pending sites and links in the current page, extracted for easier review, checkboxes to selectively approve them, and the full page shown below with the pending links highlighted.

A bug was fixed with Notify and the tz= attribute which could affect later recipients, and another with RecipeCheck when the hosting has disabled remote retrieval.

The documentation was updated.

Version 2.5.4 (2025-12-06)

This version includes updates for PHP 8.5.

Conditional markup now includes new conditions (:if empty:), (:if skin name:), and corrects the behavior of (:if attachments:) when attachments are disabled.

PmSyntax was refactored to recognize custom input elements and custom conditions, and detect more PmWiki variables.

Input forms enhancements: the placeholder="" attribute is now also positional after "name" and "value". Suggestions for text fields can now be written directly in the list=datalist attribute:

(:input text continent "" "Type a continent" list="Africa; America; Asia; Europe; Oceania":)

Table of contents (TOC) can now remove or restore elements from the headings in the TOC links. This makes it possible for icon fonts to appear in the TOC.

A bug was fixed with sortable tables when the headers are "sticky".

A new helper function EnableGroupPageStore() should simplify enabling or migrating to per-group page storage.

New PHP and JavaScript helper functions, variables, and hooks were added, these can be used by recipes and extensions.

The documentation was updated.

Version 2.5.3 (2025-11-08)

This version includes updates for recent PHP versions and optimizations for the dark theme. It fixes a bug with custom actions not loading a skin, and a bug with ?action=crypt for CleanUrls.

The PmLib JavaScript library has some new helper functions, and the local storage functions can store and retrieve objects, arrays, or numbers in addition to strings (no need to stringify and parse stored data).

The documentation was updated.

Version 2.5.2 (2025-09-14)

This version updates the default InterMap definitions to their current URLs, and refreshes the documentation.

Version 2.5.1 (2025-08-13)

This version fixes $VersionNum, a miscalculated value was added by the release scripts. This could cause errors with some recipes.

The documentation was updated.

Version 2.5.0 (2025-08-10)

This version is targeting PHP 7.0-8.4.

Since PHP 8.4 made calculating password hashes much slower, the pmcrypt() function has been refactored and new helper functions added to improve loading speeds:

  • $RehashedPassword has been removed, a new function rehash_password() can now be called by addons.
  • $AllowPassword is now set to false instead of 'nopass'.
  • It is recommended to not call pmcrypt('mypass') in local configuration but to calculate the hashes at pmwiki.php?action=crypt and store the hashes.
  • See also PasswordsAdmin and Upgrades.

New variables $LinkPageShortFmt and $LinkPageTooltip allow to configure shortcuts for link texts and tooltip titles.

New variable $EnableMinorEditKeepMeta allows to configure the report of the previous time and author if "This is a minor edit" is checked.

Added 2 helper functions for addons, updated PmMultipartMail(), HandleCustomAction().

The PmLib JavaScript library has a few improvements, and will now store all local data in a single window.localStorage object.

The dark theme toggle icon will now be hidden if $EnableDarkThemeToggle is zero.

The documentation, and sample-config.php, have been updated.

For older notes see Archive.org copy of the Release Notes page.

Changelog

Version 2.7.7 (2026-10-23)

  • InterMap update Meatball to use https:.
  • Media fix unsupported links if the wiki defines a relative upload URL.
  • Update PmFFVersion() for the new 2-week release cycle.
  • PmLib add observe() helper for MutationObserver. Fix error in error reporting, reported by Said Achmiz.
  • Sortable handle dynamic tables.
  • PmSyntax update redirect markup.
  • Utils refactor wheel-input code to be compatible with slightly older browsers.
  • Refactor PrintFmt, PrePrintFmt, PrintSkin, and pmwiki-responsive skin, to allow directives from included headers, footers, and sidebars, to insert styles and scripts in $HTMLHeaderFmt.
  • Add apache_request_headers() to ?action=diag.
  • Fix for nested markup function calling MarkupToHTML() with a different $pagename.
  • Unlock parallel downloads of large files, update response headers.
  • Fix (:details:) without summary (PITS:01573). Simpler open and summary definitions.
  • Update documentation.

Version 2.7.6 (2026-09-18)

  • StopWatch output add class name "pmstopwatch", hide when printing.
  • PmMultipartMail update for PHP8, skip already added attachments, keep original filenames if possible, random boundary.
  • PageList variable $MatchSearched count should not include protected pages (PITS:01566).
  • Add $AuthorMaxLength, default 64.
  • Update $PmFFVersionData.
  • pm_recode() prefer mb_convert_encoding to iconv.
  • Prevent page names with invalid UTF-8 bytes.
  • Updates for PHP 8.
  • Page history to only show editors' IP addresses to administrators (personal information per GDPR).
  • PmMedia add "lazy" as alias to "loading=lazy", responsive videos - scale down if larger than screen size, keep aspect ratio.
  • Fix markup expression substr with only start for ASCII text in UTF-8 wikis.
  • Update documentation.

Version 2.7.5 (2026-08-05)

  • Fix vulnerability on Windows, reported by Michael Engelke (PITS:01563).
  • Varlink add $action.
  • Update caches.php for PHP 8 (PITS:01564), replace .htaccess snippet to use helper mkdirpdeny().
  • Update documentation.

Version 2.7.4 (2026-07-31)

  • Fix bug with (PITS:01561).
  • Sanitize $action, fix page variables {$Action}, {$PasswdRead} and related (PITS:01562).
  • Update documentation.

Version 2.7.3 (2026-07-26)

  • Fix bug with {(substr ...)} when arguments are missing (PITS:01560, cont.)

Version 2.7.2 (2026-07-26)

  • Fix bug with {(substr ...)} when UTF-8 is not enabled (PITS:01560).

Version 2.7.1 (2026-07-24)

  • Fix $Version string, somehow mangled by the release script.

Version 2.7.0 (2026-07-24)

  • Add class TempPageStore, enabled if no config.php (PITS:01555).
  • Add $RevisionNum, $EnableVersionedAssets, $VersionedAssetKeys.
  • Make pm_recode() recursive.
  • Add $JsonEncodeFn, pm_json_encode() retry if json_encode() exists but fails (PITS:01556).
  • Add $EnableBodyDataAttrs, data-attributes to <body>, useful for styling and scripting.
  • PmTOC remove "?" and "Δ" characters from createlink/reupload links from TOC.
  • WikiWords fix bug with CamelCase WikiStyles, reported by JR.
  • Add [[##visible-anchor]], $VisibleAnchor, refactor MarkupAnchors().
  • Add $TextSectionQualifyPatterns, cb_expandkpvz().
  • PmSyntax slight optimization.
  • MarkupBigSmall() move sizes to pmwiki-core.css, remove unsafe-inline style.
  • Fix warning for pagelist order=- (nothing), reported by Simon.
  • PSFT() allow for %#d and other extensions, fix %o if Intl:NumberFormatter is unavailable, better handling of double encoded percents.
  • Refactor tools.php into separate files. Add request.php, helpers PmREQ($data), PmREQB($url).
  • Add warning for read-only temporary directories.
  • Fix warnings for PHP 8, reported by Simon.
  • Fix TraceMarkup() to correctly show closures.
  • PPTD() add M=month, cast to float if numeric.
  • PmFFVersion() add 'basedate' format.
  • Input forms track optional checkboxes names, allow for setting flags like +checked.
  • FmtTemplateVars() revert MarkupEscape calls - bug with PmForm.
  • $Conditions['enabled'] allow for testing of Var.SubItem for $GLOBALS['Var']['SubItem'].
  • Update StopWatch() for PHP 8.
  • Refactor FileSizeCompact() to handle even bigger numbers, add helper FileSizeFromCompact().
  • HandleUpload() show warning if upload_max_filesize or post_max_size from php.ini are smaller than $UploadMaxSize.
  • Uploads add jxl extension.
  • PmLib.afetch add onprogress entry, Dropzone add upload progress bars, remove icons.
  • Add helper PEVAL(), CallbackWithArgs(), rewrite to not use eval() for most core conditionals, page variables, and markup expressions (PITS:01558).
  • Add page variable {$RevisionNum} (PITS:01559), restore {$VersionNum}, add {$VersionShort}, {$CurrentLocalTime}, {$CurrentTime} (moved from pmform.php), {$Targets} (used by a few recipes).
  • Fix unneeded warning for customized e_textarea in browse mode, reported by Simon.
  • Update documentation.

# Version 2.6.0 (2026-05-16)

  • PmLib encapsulate in a function, improve safety features, add cloneFontMetrics(), echo.t(), echo.e(), pd(), pd.sp(), adj.rc(), adj.rw(), ue.core(), ue.decode(), sa() remove events, create() add shortcut properties.
  • Refactor pmwiki-utils.js to not use innerHTML.
  • Bare urls stop before %% (likely wikistyle).
  • PmSyntax update for PmLib; fix >> style<< when there is an initial space; stop bare URLs before %%, fix display of links with multiple vertical bars, highlight Attach: intermap even if uploads are not enabled; style empty InterMap prefixes like Attach: as links not PageTextVariables; refactor for semantic page variables.
  • Add helper function PrintPageFmt($pagename, $fmt), PQAA($array).
  • EditShortcuts simpler notation, Primary+Shift+D=Cycle directive/markupexpression, Primary+Shift+S=Cycle wikistyles, reorder wikistyles, Primary+I to cycle more formats, insertlink() detect likely pictures, uploads, add [[#anchor]]...[[#anchorend]], context-aware insert wikistyle-code, refactor for easier custom keys, custom functions.
  • Add revision identifiers to core JS files.
  • Refactor/reposition LoadInterMaps() before PmUtilsJS() in order to have the parsed InterMaps highlighted in PmSyntax.
  • Attach: links to strip #hash when resolving filenames.
  • Update pmtoken(), pmnonce() to fail if secure random generator is missing.
  • Add Media, $PmMedia, scripts/media.php, pub/lib/pmwiki-media.js.
  • Fix opus mime type.
  • WikiStyles if height and width are numeric and not attributes, add px.
  • Attachlist add class name, remove empty title="" attribute.
  • Add core css classes clear-both, clear-left, clear-right, pre-wrap, ellipsis.
  • Input forms add datetime-local, pmdatetime.
  • Add $PTVPreParseFn, requested by Gnuzoo.
  • Add $EnableHideAttachPrefix.
  • Restrict datashift targets to be contained in #wikitext, #wikileft, or #wikiright.
  • Merge existing deprecated $UploadBlacklist into $UploadBlockPatterns.
  • Add condition "grouphome".
  • PageVars, template vars, pagelist pseudovars, include pseudovars add default value.
  • Set $EnablePGCust to 99 after pgcust.php.
  • Fix a dropzone could appear on the login form, reported by XES.
  • Update documentation.

# Version 2.5.9 (2026-04-05)

  • PmLib highlight_pre add language as tooltip.
  • PmSyntax allow for %hlt% language autodetection (except for PmWiki markup which needs to be %pmhlt%). Enable semi-transparent selection.
  • Add PmLib.ready._init.
  • Sortable fix when there are fewer cells in a row.
  • Fix bug with $MessagesFmt shown multiple times on preview edit.
  • Responsive skin add data-wikititle to #wikilogo a.
  • Add wikistyle %download% for links (PITS:01528).
  • Add PmLib.itext(), update guiedit.js.
  • $EnableEditAutoText add new keyboard shortcuts, see Cookbook:EditHelp. Refactor EditAutoText, add PmLib.EditShortcuts to allow customization.
  • SVG logo in sample-config.php.
  • Fix bug with SaveAttributes.
  • ParseArgs/Pagelist ignore unquoted empty arguments (PITS:01545).
  • FixUrl to fully encode (with Shift) and decode (with Ctrl) all special characters (PITS:01548).
  • When parsing SiteAdmin.AuthUser, join lines ending in a single backslash (allows for multiline user properties).
  • Remove $EditAutoBrackets from $EnableCommonEnhancements.
  • UpdatePage show current $EnablePost, $IsPagePosted in StopWatch.
  • Refactor LocalTimes.
  • The timestamps on page histories will now be wrapped in <time> elements.
  • Update documentation.

Version 2.5.8 (2026-03-09)

  • Fix warning for undefined $_SERVER['REMOTE_ADDR'] in CLI mode.
  • Add $EnableEscapedUrlEmbed.
  • Optimize the initial loading of Light or Dark theme stylesheets and pictures.
  • Update documentation.

Version 2.5.7 (2026-03-08)

  • MergeLastMinorEdit() fix warnings with undefined $InputTags.
  • Allow for $EnablePostAuthorRequired to be defined later.
  • Update diag.php for PHP8.
  • Refactor PmLib, add helpers q, Q, debounce, pdsp, afetch, on, once, off, fire, adj, cl, ls, abspos, wmmd, time, sort1table, add normalize argument to ga; dynamic properties for dce, gcs; remove fe4*; fire events pmutilscoredone and pmutilsqueuedone.
  • Update pmwiki-darktoggle.js for refactored PmLib.
  • Update pmwiki-utils.js for PmLib, add inittableheadfoot(), fix data-pmcontent could include heading numbering.
  • Sortable major rewrite, add styles for %nosort%, allow for complex headers with rowspan and colspan, sync header and footer arrows after sorting.
  • Add $IsLocalhost, fix $EnableCopyCode for localhost.
  • Add $EnableDarkThemeToggle to docs/sample-config.php (suggested by Moni).
  • PmLib allow for q() and Q() to swap arguments.
  • Fix bug with NotSavedWarning, reported by Martin Cuno, fix rendering bug with PmSyntax, optimization.
  • Add CSS class "center".
  • Remove CSS for code.escaped from pmwiki-responsive, already in pmwiki-core.css.
  • Inherit color for links in %note% style.
  • Fix bug with linking to escaped image URLs.
  • Update documentation.

Version 2.5.6 (2026-02-08)

  • Datashift report if shifted element contains target.
  • Add $WikiStyleApply["h"] for h1-h6 headings.
  • Add configurable $UrlGetFunction, used in RecipeCheck and BlockList.
  • Reveal or hide Table of contents when printing. Add $PmTOC['Closed'] to initially collapse the TOC.
  • UrlApprovals show message if there are no pending links in the current page, add links to approve included and transcluded pages.
  • PSFT() fix bug with %o.
  • Refactor mkdirpdeny().
  • Disable sortable tables if cells have rowspan or colspan, this never worked reliably.
  • Update documentation.

Version 2.5.5 (2026-01-10)

  • PmSyntax config without page variable, optimize rendering, stopwatch.
  • Input datalist minor refactor. Simple datalists now added to $HTMLFooterFmt rather than after the element.
  • Sortable headers if right-aligned, place the arrow to the left; fix clear arrows for sortable-footer.
  • Enable Shift+click to check multiple adjacent checkboxes.
  • Update for PHP 8.
  • Disable core $HTMLStylesFmt that are already loaded from pub/lib/pmwiki-core.css.
  • Update for PHP 8.5 (PITS:01531).
  • PmTOC add tooltip title to back arrow links, minor refactor. Add $PmTOC['MinNumberedHeadings'], default 2.
  • Add markup !!#id Heading to define the id attributes of headings.
  • With $EnableMergeLastMinorEdit, checking the Minor edit checkbox will pre-fill the change summary field with the previous summary. Refactor MergeLastMinorEdit() to configure $InputTags['e_minorcheckbox'].
  • PmLib add average(array), refactor draggable, dispatched events will now bubble by default, refactor core utilities.
  • EnableNotSavedWarning moved to pmwiki-utils.js and can be used by custom forms.
  • Notify fix tz= could modify subsequent recipients (PITS:01536).
  • Refactor TextSection, add $TextSectionAnchorPatterns.
  • Dark theme: slightly darker simpletable backgrounds.
  • Refactor Dropzone, add directive (:dropzone uploadpage=Group.Name:).
  • RecipeCheck to handle fopen gracefully (PITS:01538).
  • UrlApprovals add confirmation page with preview before approving URLs.
  • Input select allow to configure custom attributes.
  • Update documentation.

Version 2.5.4 (2025-12-06)

  • Update for PHP 8.5.
  • Add helper function PPRAR() = PPRA() recursive, mkdirpdeny(), EnableGroupPageStore(), update sample-config.php.
  • Add conditionals (:if empty:) (PITS:01529), (:if skin name:), and (:if attachments:) to false when uploads are disabled, alias (:if attachment:)
  • PmTOC allow for heading elements to be removed or restored in links.
  • Add PmLib.parser, update PmLib.isHidden.
  • PmSyntax: highlight custom input elements in forms and custom conditions, include $PostConfig configurations, detect more PmWiki variables.
  • Form text-like inputs add "placeholder" as 3rd positional attribute. Input datalist options can now be written in the list= attribute split by ";" or "\n".
  • Add $PostDispatchFunctions, save original working directory in $PmOWD.
  • Sortable tables fix bug when the header is sticky.
  • Update docs/sample-config.php for EnableGroupPageStore().
  • Update documentation.

Version 2.5.3 (2025-11-08)

  • Darktoggle: optimize synchronization between tabs.
  • RecipeCheck: update for PHP 8.4 (PITS:01526); add CSS class for easy styling.
  • Fix ?action=crypt for CleanUrls (PITS:01527).
  • Fix $HTMLHeader1Fmt for actions that don't load a skin.
  • PmLib optimize storage, add recursive equal, Datashift allow to only move the inner child nodes.
  • Update documentation.

Version 2.5.2 (2025-09-14)

  • Update InterMap definitions.
  • Update PmFFVersion.
  • Update documentation.

Version 2.5.1 (2025-08-13)

  • Fix bug with the release scripts incorrectly calculating $VersionNum, reported by Gnuzoo.

Version 2.5.0 (2025-08-10)

  • Lowest PHP version=7.0
  • Refactor pmcrypt(), add pm_password_verify(), rehash_password(), remove $RehashedPassword, default $AllowPassword to false (PITS:01523).
  • Update docs/sample-config.php to remove pmcrypt().
  • Refactor PmNonce().
  • PmLib fix bug with PmLib.adjany, move makeDraggable() to PmLib.mkDrag(), setLS() to store all data in a single window.localStorage object, fix bug with data-shift, improve revert display, identify headings in page, allow for textarea[data-pmsyntax] to be highlighted.
  • Add helper function PHSCQF().
  • Add $LinkPageShortFmt, $LinkPageTooltip.
  • Add $EnableMinorEditKeepMeta, edit function MinorEditKeepMeta.
  • In MergeLastMinorEdit(), keep the 'minor' flag if the previous edit was also minor.
  • Make $CustomActions[$action]['function'] optional if "Handle$action" exists.
  • Hide dark toggle icon when $EnableDarkThemeToggle is zero.
  • Allow for (:input pmtoken:) to have other attributes.
  • tools.php: PmMultipartMail add $PmMMCTE for Content-Transfer-Encoding, remove Content-Disposition for text or html. Add helper PmFFVersion().
  • Add HandlePmForm1().
  • Update documentation.

For older notes see Archive.org copy of the ChangeLog page.

Cookbook and Skins downloads

 0: 00.00 00.00 EnablePost = 1, keys=
 1: 00.00 00.00 config start
 2: 00.01 00.01 config end
 3: 00.03 00.03 MarkupToHTML begin
 4: 00.04 00.04 MarkupToHTML begin
 5: 00.05 00.04 MarkupToHTML end
 6: 00.05 00.05 ReadApprovedUrls SiteAdmin.ApprovedUrls begin
 7: 00.06 00.05 ReadApprovedUrls SiteAdmin.ApprovedUrls end
 8: 00.87 00.82 MarkupToHTML end
 9: 00.87 00.82 MarkupToHTML begin
10: 00.88 00.84 MarkupToHTML end
11: 00.89 00.84 MarkupToHTML begin
12: 00.89 00.84 MarkupToHTML end
13: 02.78 00.84 now
Peak memory: 9,251,176 bytes