Skip to content

v0.17.0

Choose a tag to compare

@austinginder austinginder released this 17 Jul 11:25
· 1482 commits to main since this release

The boundaries release. Minn's integration story grows teeth: placement and count budgets are enforced rather than requested, every off-site link a plugin supplies wears the mark, the descriptor vocabulary is frozen by a kitchen-sink contract suite, and anything you don't want is one right-click away from hidden, restorable from Your profile. Which is now a real page: account, public profile, appearance, per-user language with automatic pack installs, the front-end toolbar preference, AI access and sessions as calm cards. The command palette searches what you've written, the commerce views and menu items gain right-click menus, the author guide is rebuilt around first contact with a copyable example plugin, and the last native selects and checkboxes in Settings and the structure dialogs became themed controls.

Added

  • ⌘K finds your content: the command palette now searches what you've written, not just what Minn can do. Type anything and your posts, pages and custom post types appear under the command matches (published content plus your drafts and scheduled posts), and Enter drops you straight into the Minn editor. Same arrow-key and click behavior as commands, debounced against core's search API with the usual field allowlist (lists never render content), and commands always stay first.
  • Hide any integration for you: right-click a plugin surface's sidebar row, a plugin editor panel's door, or a plugin group's heading in the block picker and choose Hide for you. Design libraries hide individually; a slash namespace hides everywhere it feeds the editor menus (auto-insertable blocks, insert templates, block patterns and namespaced commands go together, while inspector forms stay so existing blocks remain editable). Hidden integrations leave the boot payload entirely (the sidebar, ⌘K palette, routes, block picker and slash menu never see them), survive reloads, and restore from Your profile → Hidden for you or the Undo toast. The choice is per user; plugin re-registration does not undo it, and there is no API for a plugin to detect or resist it. Core views, core editor doors and the picker's Basics are not hideable.
  • Attention budgets: placement and count limits on plugin integrations are now enforced, not asked. The Workspace nav group requires an inbox-shaped surface (a time-ordered collection); anything else claiming it lands under Tools with a note on the Integrations card. One plugin holds at most 3 nav slots: past that, its surfaces collapse into a single nav item and a single ⌘K palette row using the familiar provider switcher. One namespace holds at most 3 entries in the default / slash menu, with overflow demoted to search-only (still one keystroke away, never dropped; the block picker always shows everything). Minn's own bundled adapters are exempt from the nav budget since each registers only while its subject plugin is active.
  • External links are always marked: every link a plugin's descriptor supplies (row and detail actions, status-card actions, setup links, context-menu entries) opens in a new tab, and any link that leaves the site now renders with the ↗ affordance automatically. Minn adds the mark at render time; a descriptor cannot make an off-site link look like an app action, and same-site wp-admin deep links stay unmarked. Off-site hrefs carried in a descriptor are also listed per surface on the Integrations card, attributed to the plugin that registered them (informational, never a contract problem).
  • The contract suite: the descriptor vocabulary is now frozen by test. A doc-lockstep check fails the suite if any key in the validator's vocabulary constants is missing from the author guide, and a kitchen-sink fixture surface declares the entire documented collection vocabulary at once (every column format, every action key, tabs, filter, bulk, create with defaults, inline edit with preserve, manage and extra views, status card, item-scoped settings) and is driven end to end with server-state verification. The same fixture validating with zero problems on the Integrations card proves the full vocabulary is contract-clean. The WordPress Playground demo also boots the shim tutorial's example plugin preactivated, so a working instance of the API is one click away.
  • The shim tutorial and a copyable example plugin: docs/shim-tutorial.md walks a custom-table plugin into a full Minn surface (REST shim, descriptor, status card, actions), and docs/examples/minn-example-adapter/ is the finished code as a real working plugin. Minn's own test suite activates the example and drives it end to end, so the tutorial can never drift from the contract.
  • Your profile is a full page: the self-profile outgrew its modal and lives at /minn-admin/profile now, with Account (name, email, role, language, password), Public profile (first and last name, website, bio and the Gravatar-sourced picture, the fields author boxes and archives read), Appearance (color schemes, theme, and the front-end toolbar preference), Hidden for you, AI Access and Sessions as proper cards. The avatar, the ⌘K entry and your own row on Users all land there; the modal stays for adding users and editing other people, where the short form is right.
  • Per-user language, with automatic installs: the Language picker offers every installed locale plus the full downloadable catalog (for admins who can install languages), exactly like core's Site Language dropdown. Picking a language that is not installed yet downloads its pack on save through minn-admin/v1/me/language; Site default remains the first option, and the picker reads your raw preference, not the effective fallback.
  • Show toolbar when viewing the site: core's per-user admin-bar preference joins the Appearance card as an instant-save switch, exposed over REST via registered user meta with core's own true/false storage.
  • Right-click menus on Orders, Products, Customers and Menus: the context-menu pattern from Content, Media and Comments reaches the commerce views and menu items. Orders offer the common status moves (processing, completed, on hold) without opening the modal; products toggle stock and publish state in place (managed-stock products keep stock edits in the modal, where quantity lives); customers offer email, a pre-filtered jump to their orders, and the wp-admin user screen; menu rows expose their own move, indent and remove controls plus the inline label editor.

Improved

  • The author guide, restructured for first contact: the quick start now opens the doc (the 19-hook wall moved to a Hook reference section), with new sections for testing your integration, capability patterns (including the adapter-side gating precedent the bundled adapters use), the canonical icon list (66 names; unknown names render empty), building with an AI agent, and Integration etiquette: the whole enforcement story in one place (what the validator blocks or degrades, that rendering is Minn's, what users can hide, and that labels are for naming, not marketing). Every primitive now has a screenshot beside its section (surface list, status card, detail modal, contact-card entry, setup gate, settings view, editor panel doors and modal, slash namespace entries), captured from the live app with the shim tutorial's own Campfire example as the subject; minnadmin.com's guide modal renders them too. The run-on actions and filter table cells became real sections, manage vs views is differentiated, group's two honored values are stated, newer keys carry since-version notes, and required keys are named up front (label, collection.route, columns). The stale extension-api.md proposal (whose example used keys that no longer exist) is deleted.
  • A first-class Forms provider recipe: the author guide gains a worked section for forms plugins specifically: per-form dynamic tabs paired with {tab} routes, how entry-summary picks its list line (and the summary override), the contact-card entry detail's hero and body heuristics, the Entries/Forms manage shape, family: 'forms' coexistence semantics, and the honest href export pattern. Plus the previously undocumented detail.labels response contract, DELETE-method actions, column sortability (fixed by your route, stated plainly), WP_Error handling on create, and what an older Minn does with newer descriptor keys.
  • Post Types and Taxonomies dialogs: the visibility, supports, taxonomy and attach-to checkboxes are proper toggle switches now (the whole row is the click target), and the "Store definition in" picker is the themed combobox instead of a native select. Locked core and code-registered definitions render the same switches, dimmed and inert.
  • Calmer plugin-surface headers: the status card puts its action buttons beside the stat rows instead of alone at the bottom, and a chart window with nothing sent or failed collapses to a one-line note instead of 88 pixels of empty bars (Gravity SMTP in test mode sandboxes everything, so its Sent/Failed chart was pure dead space). The second row of filter pills under a view switcher (Log's All/Sent/Failed, Settings tabs) drops the boxed strip for the quiet text style, so each screen keeps one boxed pill row.

Fixed

  • A dropped reply no longer wipes a soft-reloading list: a tab, filter or search request that dies mid-flight (a PHP worker recycle, flaky network) used to replace the whole view with the error card, toolbar included. The chrome now stays painted, the dim clears, and an error toast reports it; the next click simply retries. Chrome-less first paints still show the error card.
  • The shield icon rendered blank: three bundled adapters (Wordfence, Solid Security, Limit Login Attempts) declared it but the icon map never carried it.
  • Content's Trash control floated mid-toolbar: the aux tab strip inherited the stretching flex rule meant for the type tabs, leaving a dim "Trash" word stranded in the middle of the row. It pins to the toolbar's right edge now, wears the trash icon, and sits a step brighter than the quiet filter tabs.
  • Settings kept three native selects: the homepage-displays picker, the default post format and the permalink-structure preset were the last OS-drawn dropdowns on the Settings page. All three are the themed searchable combobox now, with the homepage mode flip still revealing the page pickers and the permalink preset staying in two-way sync with the custom-structure field.