The honest-save release. Editor panels and settings screens now save through one path. It writes only what you changed and checks every value before anything is written. Whatever the plugin would refuse is named, instead of an answer of "Saved", and a change made elsewhere since the page opened asks you to reload rather than being written over. Each integration now declares where its plugin keeps its keys and tokens, so no Minn screen or response carries them, whether the plugin is active or not. Breakwater's spam log arrives under Forms with Not spam and Was spam, and prices show your store's currency on the side your store puts it. The full review of the release candidate found one high issue (a WPForms notification name chosen by a form editor could run script for an administrator opening its Emails page), three medium and twenty-one low. Two reviews of the fixes and a last pass over the final fix found lows of their own. All of it is fixed before release, and every fix a test can reach has a test that fails without it.
Added
- Breakwater. Minn now reads Breakwater's log, every comment, sign-up and form submission it checked, under Forms: filter it to what was held, see why each one scored what it did, and say Not spam to hand a held submission back to its form (saved and sent as if it had never been held) or Was spam on one that got through. Its mode can be switched on the Settings tab, and Settings → Spam shows its card.
Improved
- Editor panels refuse what they cannot store, by one set of rules. The SEO, Meta Box, Pods, The Events Calendar, PowerPress, Seriously Simple Podcasting and WP Job Manager panels now save through one path: a number the plugin would have emptied, a choice a field does not offer or a number outside its range is named as not saved, and what was stored stays.
- Settings screens refuse and name what they cannot save. Perfmatters, Autoptimize, Asset CleanUp, FluentSMTP, Gravity SMTP, ACF options pages, JetEngine options pages and Fluent Forms emails now write only what you changed and check every changed value before anything is written: a field you may not change, a value the plugin refuses, or a hidden key's placeholder pasted somewhere new stops the save with the fields named, and nothing is saved.
- A settings save no longer overwrites a change made elsewhere. The page sends what it loaded beside your edits, and when one of those values changed since, it asks you to reload instead of writing over it.
- Integrations now declare where their plugin keeps its keys. Each one names the settings rows, user fields and table columns holding its plugin's keys, beside the code that detects the plugin. The database browser hides them and no Minn response carries them, whether or not the plugin is active, and a check fails when an integration reads a settings row holding a key nothing declares. Contact Form 7, Yoast SEO, Amelia, UpdraftPlus, Jetpack, Solid Security, OttoKit, WP Statistics, CleanTalk and WP Migrate are the first.
- Contact Form 7's reCAPTCHA and Turnstile secrets are kept out of every Minn response. Contact Form 7 files its secrets under the public site key's name, so they used to be hidden only in their own row.
Fixed
- Prices show your store’s currency, on the side your store puts it. The Products list, a product’s variations and products added to an order in the Items dialog printed a dollar sign whatever the store sold in, so a shop in rupees showed $500. They now print the symbol WooCommerce uses for the store, and every price Minn shows (products, orders, subscriptions, coupons, bookings and the Overview) puts it where the store's currency position setting says, so a store set to "500 ₹" no longer sees "₹500".
- Overview warnings are readable in the light theme. A stat's amber note (a figure that needs a look) was too faint against the light background. It now uses the darker amber the other warnings use.
- Minn Admin opens on LiteSpeed sites with ESI turned on. LiteSpeed Cache put a placeholder tag where Minn's sign-in token belongs, and on some servers the page then showed a screen of code instead of the app.
- Minn Admin opens on sites that minify their HTML. A cache plugin, a "minify HTML" snippet or a host optimizer that squeezes the page onto one line left Minn on a blank page. The page now boots however its whitespace is squeezed.
- The job listing panel shows only the fields WP Job Manager shows you. Salary and remote-position fields a site has switched off are no longer offered, a listing editor who cannot manage listings no longer sees Featured and Listing Expiry (which WP Job Manager's own box hides from them), and a field it refuses is now named on the save instead of looking saved while nothing changed.
- A switch sent as "off" or "false" is off in every settings screen. FluentSMTP read "false" as on and turned email simulation on, and Gravity SMTP stored the word as sent.
- Autoptimize's critical CSS is cleaned of tags as Autoptimize cleans it. The cleaning never ran on saves from Minn.
- A setting sent to the wrong tab, or to a tab that does not exist, is not written. Autoptimize and Asset CleanUp wrote it anyway, and Asset CleanUp then answered that the tab was unknown.
- Saving a settings tab without changes rewrites nothing. Asset CleanUp rewrote its whole settings row, and Gravity SMTP filled in settings it had left at their defaults.
- A Gravity SMTP save made after the service changed asks you to reload. The Sending tab shows one service's details, so a save from a page opened before someone switched services elsewhere no longer writes one service's details over another's.
- An emptied event date says it was not saved. An event always has a start and an end, so an emptied Starts or Ends box is named instead of looking cleared.
- Form status cards count only the entries their list shows. The entry counts and the fourteen-day chart on the Everest Forms, Fluent Forms, WPForms, Forminator, Formidable, SureForms and CFDB7 cards now read through the same rule as the entry list, so a card never counts an entry the list would hide from you. The All In One Security failed-login count reads its log the same way.
- A chart or time window Minn cannot read the clock for shows nothing instead of guessing. It used to read the dates on another clock and could count the wrong days.
- Settings screens no longer say "Settings saved" for a value they dropped. JetEngine and ACF options pages named nothing when they refused a value (a choice the field does not offer, an unreadable date, a link that runs code, an image you may not use), and Perfmatters dropped changes to the fields it prints straight into your pages (the code boxes, DNS prefetch, the tracking id, the CDN URLs, the lazy load threshold, the login URL message) from anyone without permission to add raw code. Each is now named, and nothing is saved.
- No PHP 8.5 deprecation notices from Minn. Saving an editor panel, the admin notices screen and the SureForms overview each logged one on PHP 8.5, and an AIOSEO site logged a warning for a post type AIOSEO keeps no settings for.
- A new post no longer turns into a pile of drafts when the SEO plugin says no. Minn showed the SEO panel to writers the SEO plugin keeps out (a Contributor under Rank Math, any writer under SureRank, a role SEOPress, SiteSEO or AIOSEO blocks) and on new posts of a type whose SEO box is switched off. Saving a change there stored the post but reported a failure, so every save and every autosave made another draft. The panel now shows only where the SEO plugin's own screen would. If a save still includes a change the plugin refuses, the post saves as usual and the editor names the SEO fields that were not stored. A social image you may not use no longer stops the rest of your SEO changes from saving.
- A debug switch your host already sets is shown as set elsewhere. When the server runs a file ahead of WordPress (a host's or firewall's PHP prepend) that defines WP_DEBUG, WP_DEBUG_DISPLAY or another debug setting, the System page now locks that switch instead of offering one that would rewrite wp-config.php and change nothing.
- Run on Minn installs only the release it was offered. The switch now refuses a Minn release whose archive holds a different version than the update service named, any release older than the oldest one Minn Admin installs, and, once a site has switched to a release, any release older than that one, so an older signed release can't be passed off as the latest.
- A Gravity Forms builder save keeps a hidden key in fields you did not touch. A key or token a form held in an HTML block, a default value, a description, a choice or a sub-label reached the builder as its [redacted:…] placeholder, and saving any change to the form wrote that placeholder over the real key. Those values now stay as stored, and a save that edits one around its placeholder is refused with nothing written.
- A Fluent Forms emails save that Fluent refuses changes nothing. When a notification in the save had no message or Send-to address, or the confirmation was set to redirect with no address, the notifications before it were already saved while the page said the save failed. Every check Fluent Forms makes now runs before anything is written.
- Text Minn shortens never shows part of a saved key. Cron arguments, activity log details (WP Activity Log and All-In-One Security), admin notices, mail log events and connection hints, logged queries, licence notes, entry summaries, field values and global styles were cut short before Minn's key filter saw them, so a key that ran across the cut showed its first characters. The whole value is now checked first and the key shows as hidden.
- The database browser hides more plugins' saved keys. Disembark's connection token (which lets a site be copied whole), Contact Form 7's settings row (its Stripe secret key, captcha secrets, Brevo key and Constant Contact tokens), Yoast SEO's settings row (its SEMrush, Wincher and MyYoast tokens), each user's Yoast AI tokens, Amelia's settings row (its payment, calendar, mail and WhatsApp secrets and the secrets its customer and employee panel links are signed with), UpdraftPlus' remote storage keys and tokens, UpdraftCentral and Migrator keys, backup encryption phrase, settings lock password, extra database logins, UpdraftPlus.com account login and running backup jobs (which copy every storage destination's settings, typed passwords included), BackWPup's job keys and storage credentials, WPvivid's storage passwords and migration tokens, SureForms' captcha and Stripe secrets, Formidable's captcha keys, Plausible's API token and shared links, the Castos token Seriously Simple Podcasting keeps, PowerPress's Blubrry login and tokens, WP 2FA's authenticator seeds, All-in-One WP Migration's secret key (which opens its signed-out export and import), Connect Matomo's token, and the captcha secrets of Forminator, Fluent Forms, Everest Forms, Ninja Forms, Gravity Forms and WP Job Manager now open redacted.
- Picking the Custom palette keeps colors changed meanwhile. On Your profile and on another person's page, choosing Custom now sends only the choice, so colors changed since the page opened (by the person in another tab, or by an administrator) are no longer put back.
- An image address can't restyle the thumbnail it shows in. Image fields, the featured image, the media library and picker tiles, theme screenshots and the site icon now escape the image address for the page as well as for the stylesheet, so an address holding encoded quotes can no longer lay a block over Minn's controls.
- Adjust balance adds or takes off an amount. The gift card dialog now asks how much to add or take off (a minus amount takes it off), so a card spent at checkout while the dialog was open keeps the spend instead of getting it back. Taking off more than the card holds is refused.
- An event's details never cost a new event its id. A start or end date The Events Calendar panel cannot read, or a venue or organizer it refuses, is now named on the save while the event keeps its id, instead of failing after the event was stored and making another draft on every save.
- Custom field panels say when they keep a value. ACF, Meta Box, JetEngine and Seriously Simple Podcasting now name a field whose value they refuse (a link that runs code, a date or number they cannot read, a picture you cannot attach, a choice the field does not offer), so it stays unsaved in the editor instead of looking saved while the stored value was kept.
- The PowerPress panel names what it does not save, and never stores a garbled value. Details typed before the episode has a media file, an unreadable size or duration, an unknown episode type, a subtitle that would save as nothing, and an episode number or season that is not a whole number (1.5 used to save as 15) are now named on the save while the stored value stays. An emptied file size goes back to PowerPress's own detection, and a post saved by someone PowerPress keeps from podcast episodes keeps its id.
- Address fields keep a saved link when they refuse a new one. Typing an address that is not a web link (such as one starting with javascript:) into an event's website, a podcast episode's media file, a job listing's company video or the SEO canonical URL no longer erases the saved one; in PowerPress it removed the whole episode. The field is named as not saved, and only emptying the box clears it.
- A WPForms notification name can no longer run code when an administrator opens its Emails page. WPForms lets anyone who can edit a form choose its notifications' internal names, and Minn placed those names in the page unescaped, so a crafted one ran script as the administrator viewing it. Minn now accepts only the plain numbers WPForms itself uses, and every page escapes such names wherever they appear.
- A BackWPup delete removes only a backup BackWPup lists. A crafted delete could remove other files in the content folder or the protection file that keeps database backups off the web.
- Broken Link Checker's Edit URL and Unlink respect who may edit the content. An editor could rewrite or remove a link inside a page they are not allowed to edit, such as the privacy policy page. Minn now asks Broken Link Checker's own rule: edit access to every place the link appears.
- Mail logs hide password reset links from anyone who could not reset that password themselves. On a network, a site's administrator could request a password reset for a network administrator on their own site and read the link in that site's mail log; on a single site, a role a mail plugin lets read its log could do the same for an administrator. The key in a reset link is now hidden from them in every view of the log, its search and its debug lines, and such an email can only be resent to whom it was sent.
- Resending an order email sends only one that fits the order. Any order email could be resent for any order, such as "Your order is complete" for one still pending. Now only the invoice, the new-order email, a customer note and the email for the order's current status can be resent, as in WooCommerce. An email the store has switched off is sent only for someone who manages WooCommerce's settings, which until now never worked for anyone.
- Minn Admin's updater installs only the release it names. An update offer pointing at an older release under a newer version number is refused, for the plugin and its language packs.
- Code snippets respect a site that switches off code editing. WPCode's HTML, JavaScript and CSS snippets, Custom CSS & JS styles placed inline in the page, and Bricks page scripts can no longer be changed when the site sets DISALLOW_FILE_EDIT. Deleting or renaming a snippet still works.
- Smaller access fixes. A duplicated post copies a custom field only where you could add it yourself. The Gravity Forms entry list and Ninja Forms submissions no longer carry password fields. A partly refunded order's refund email says partially refunded. A LatePoint booking shows the customer's private notes only to those LatePoint lets see customers. Everest Forms, AIOS, One Time Login on multi-network installs, WP Freighter's per-site Minn switch, the JetEngine and Elementor template copies, the theme changelog, the post type editor and the Run on Minn status each follow their plugin's or WordPress's own rule more closely.