v0.20.0
The consent release. Every consequential action now says what it touches before it happens: updates enumerate what changes and what stays untouched, permanent deletes wear danger styling with plain-stakes copy, and quick reversible verbs keep their one-click ease. Around that spine, comments learn in-place editing and one-click commenter blocking, the content list says who is editing a post right now, Settings closes two more Customizer-era gaps (site logo and site language), Search & Filter Pro and Admin Columns Pro join the license manager, and plugin activation moves to a real admin context so activation hooks that assume wp-admin stop failing.
Fixed
- Plugin activation works for plugins that assume wp-admin: plugin toggles now run through admin-ajax, a real admin context, instead of the REST plugins endpoint. Activation hooks are written for wp-admin, and some plugins only load parts of themselves there (Breeze skips its ecommerce class outside wp-admin and fataled when activated from Minn on a WooCommerce site). Every activate and deactivate door rides the new path: the Extensions switch, right-click menus, license Turn on, connectors, the Add plugin dialog and the deactivate-Minn modal, with REST as the automatic fallback when admin-ajax itself is unreachable.
- Add-on families keep their names: the plugin name cleanup trims marketing taglines after the first separator, which collapsed families like Admin Columns Pro's add-ons ("Admin Columns Pro - Ninja Forms") into a wall of identical cards. When two installed plugins clean to the same name, both now keep their second segment, so add-ons stay tellable apart while tagline stripping stays aggressive everywhere else. Search matches the disambiguated name too.
- Installing several themes quickly no longer fails with "Failed to fetch": a theme install swaps files and can recycle the PHP worker, so a rapid second install landed on the dying connection and errored even though the server was fine. The Add theme dialog now waits for the server to come back, asks the themes list for the truth (an install whose reply died after the work counts as done), and retries once before reporting a failure. Activating from the dialog gets the same recovery.
- No Comments tab in notifications when comments are off: the notification panel offered a Comments tab even on sites where comments are disabled (the same gate that already hides the Comments nav item). The tab now follows that gate, and an active Comments tab falls back to All if the gate closes mid-session.
- The notification panel's fifth tab was unreachable: with Comments, Updates, Notices and a System kind all present, the tab strip clipped at the panel edge with no way to scroll. The strip wraps to a second row now, so every kind stays visible and clickable.
Added
- A confirm that says what it touches: consequential actions moved from the browser's native confirm to a shared Minn dialog with scope disclosure, swept across the whole app. Update everything and the WordPress core update (both of its doors) enumerate exactly what will change (the pending plugins, themes and core version) and what is not touched (your content, media, users and settings), so the biggest button in the app is also the most explicit. Every permanent delete wears the danger styling with plain-stakes copy: plugins and themes, content, media files, comments, users, terms and term merges, menus, widgets, coupons, refund records and emptying a log. Switching the site's theme shares one dialog across all three of its doors (and says out loud that the old theme stays installed), deactivating a license says the seat frees up, a refund says whether the gateway is asked to send money back, and sending a WooCommerce order email says it goes out right away. Confirms stack politely too: Escape over an open modal peels just the confirm, never the dialog beneath it. Quick reversible verbs (move to trash, sign-outs, password resets) keep their one-click confirms.
- Edit a comment in place: Pending and Approved rows gain an Edit action that opens an inline box with the comment's raw text; guest comments also offer the author name and email (a registered commenter keeps their account identity, so only the text travels). Fixing a typo or stripping a link no longer means a trip to wp-admin.
- Site logo, in Settings: when the active theme supports a custom logo, the Site tab gains a logo field beside the site icon with the same flows (pick from the library, drag and drop an upload, remove), saving through the exact theme_mod the Customizer writes. Themes without logo support see nothing, matching the Customizer's own gate.
- Site language, in Settings: the Site tab gains a Site language picker over every installed and downloadable locale (the options-general list). Picking a language the site does not have downloads its pack on save, through the same machinery as the profile's per-user language; your own language stays on Your profile. This closes another named Customizer-era gap from the core coverage audit.
- The content list says who is editing: a post someone else has open right now wears a quiet "{name} is editing" chip beside its status, on every post type in the list. It reads core's own edit lock (the same lock wp-admin, Gutenberg and Minn's editor already honor between them), so there is no new bookkeeping: a crashed session's lock ages out on its own, and your own open tabs are never flagged. The editor's blocked-open and takeover flow stays the door; the chip means you know before you knock.
- Two more license vendors: Search & Filter Pro and Admin Columns Pro join the Licenses tab with the full loop: paste to activate, deactivate frees the seat, re-verify on demand, all through each vendor's own code. Search & Filter rides its REST controller and the free base plugin's own options store, and a rejected key can no longer clobber a working activation (their own screen would let it). Admin Columns Pro is admin-screen-gated by design, so Minn bootstraps its service container headless; its key-for-token swap (a successful activation trades your pasted key for an activation token) is handled and read back faithfully, lifetime licenses included.
- Block this commenter: right-click a comment and Block commenter adds the author's email (or IP when the comment carries none) to core's disallowed list, so their future comments go straight to the trash. Core's own mechanism, no new storage: the entry is visible and editable under Settings → Comments, the confirm says exactly what will happen, and the toast's Undo removes exactly the line the block added. Offered to administrators, matching who may edit the disallowed list in wp-admin.
Improved
- The editor sidebar's doors pack two-up: Settings, Page attributes, History, the custom-field panels and SEO now sit in a two-column grid instead of a full-width stack, roughly halving their vertical footprint on plugin-heavy posts. An odd count lets the last door span the width, summaries ellipsize inside the narrower cells, and the chevron gives its width back to the text. The Publish and Featured image cards keep their full rows.
- Deleting a theme keeps the page still: the deleted theme's card fades out in place and the rest of the Themes tab stays exactly as it was (scroll position, sibling cards, screenshots untouched). The repaint through the loading screen is gone.
- Comment rows open their post: the "on Post title" in every comment row is a door now. Clicking the title lands in the Minn editor (pages resolve too, not just posts), a quiet ↗ beside it views the post on the site landing right at that comment, and the row's right-click menu leads with Open post in editor and View post. Rows whose post cannot be resolved keep the plain label.